news 2026/11/1 1:56:37

[Playwright][10]Locator 实战:使用 XPath ancestor 精准定位 Job Card

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Playwright][10]Locator 实战:使用 XPath ancestor 精准定位 Job Card

在 HPC Dashboard 的 Job Explorer 模块中,页面会展示多个 Job Card,每个卡片都有View Details等操作按钮。

如果直接定位按钮,可能匹配多个元素。因此,我采用了先定位 Job Card,再定位卡片内部按钮的方式。

1. 从 Job ID 定位所属卡片

首先,找到页面中第一个 Job ID:

constjobIdElement=page.getByText(/^Job ID:/).first();awaitexpect(jobIdElement).toBeVisible();constjobIdText=awaitjobIdElement.innerText();constjobId=jobIdText.replace(/^Job ID:\s*/,'').trim();

接下来,通过 XPath 向上查找 Job Card:

constjobCard=jobIdElement.locator('xpath=ancestor::div[.//button[normalize-space()="View Details"]][1]');

这里的关键是:

  • ancestor::div:查找当前元素的祖先div。
  • .//button[...]:要求祖先容器内存在文本为View Details的按钮。
  • normalize-space()可以避免这些空白差异影响定位:View Details
  • [1]:选择满足条件的最近一个祖先div。

这样就能从 Job ID 找到对应的卡片容器,而不是在整个页面中操作按钮。

2. 封装 getFirstJob()

为了避免重复定位,我将这部分逻辑封装为公共方法:

asyncfunctiongetFirstJob(page:Page){constjobIdElement=page.getByText(/^Job ID:/).first();awaitexpect(jobIdElement).toBeVisible();constjobIdText=awaitjobIdElement.innerText();constjobId=jobIdText.replace(/^Job ID:\s*/,'').trim();constjobCard=jobIdElement.locator('xpath=ancestor::div[.//button[normalize-space()="View Details"]][1]');constjobName=(awaitjobCard.locator('h2, h3, h4').first().innerText()).trim();return{jobCard,jobName,jobId};}

该方法返回三个值:jobCard、jobName和jobId,方便后续测试复用。

3. 在真实测试中使用 Locator Scoping

在 查看 Job 详情并导出 PDF测试中,我这样使用:

awaitopenJobsPage(page);const{jobCard,jobId}=awaitgetFirstJob(page);awaitjobCard.getByRole('button',{name:'View Details'}).click();awaitexpect(page.getByText(`Job ID:${jobId}`,{exact:true})).toBeVisible();

这里的jobCard.getByRole()就是Locator Scoping(限定定位范围)。

它只在当前 Job Card 内查找View Details按钮,避免与其他卡片中的同名按钮混淆。

随后通过 Job ID 断言,验证打开的是对应 Job 的详情。

4. 小结

这次实践让我认识到,复杂页面的元素定位不能只关注单个按钮,还需要考虑它所属的业务容器。

先定位目标容器,再定位内部元素,是处理重复列表和卡片组件的一种实用方法。

目前getFirstJob()使用.first()获取首个 Job,后续如果需要测试指定 Job,可以进一步改成按 Job ID 精确查找。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/1 1:56:17

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

作者头像 李华
网站建设 2026/11/1 1:55:45

大模型一定要逐字生成吗?理解扩散语言模型的工作方式

文章目录1 -> 引言2 -> 逐个生成是一种建模选择,不是语言的物理规律3 -> 同时填多个位置,难点在于它们要彼此兼容4 -> 一次写得多,不代表完成同一道题就一定更快5 -> 比较要落到具体任务上1 -> 引言 聊天窗口里&#xff0…

作者头像 李华
网站建设 2026/11/1 1:53:45

科研小白看点云Day1

近期任务读不同的论文标题 摘要 以及阅读一些相关代码 找到自己喜欢的方向第一个阅读方向 点云补全:论文1:先给你铺垫两个最基础的概念,方便你理解全文:点云:你可以理解成用无数个三维空间里的小点,像沙粒堆…

作者头像 李华
网站建设 2026/11/1 1:53:45

08-10-优化-帧级预算与GC生命周期策略

帧级预算与 GC 生命周期策略篇章:08-核心技术-性能优化篇 | 阅读时间:约 45 分钟一、引言在前面的章节中,我们逐一分析了各种 GC 分配源和零分配技术。但在实际项目中,追求绝对零分配既不现实也不经济。本章将从宏观角度建立 GC 管…

作者头像 李华
网站建设 2026/11/1 1:53:11

免费使用正版的Typora教程(1.9.5版本)

最新版本Typora安装(保姆级)和学习 Typora 是一款专为 Markdown 语言设计的现代化轻量级文本编辑器,由 Abner Lee 开发。它与其他 Markdown 编辑器的主要区别在于其“所见即所得(WYSIWYG)”的编辑模式,消除…

作者头像 李华