剧作家 - 通过具有动态元素的角色定位器获取

Playwright - Get by Role locator with Dynamic elements

提问人:Nishanth Balaji 提问时间:11/14/2023 最后编辑:ggorlenNishanth Balaji 更新时间:11/18/2023 访问量:75

问:

我有一个带有定位器的元素。现在 (2) 是动态的,并且根据条目的数量而变化。如何编写框架以仅检查 Hold 并忽略最后 4 个字符。getByRole('cell', {name : 'Hold (10)})

尝试过,但我认为这是不正确的。任何帮助都是值得赞赏的。我的页面中有多个元素以动态条目为后缀,因此这几乎对它们都有帮助。*

UI自动化 剧作家 浏览器自动化

评论

0赞 ggorlen 11/14/2023
您应该能够使用像 这样的正则表达式,尽管一个最小的可重现示例会很有用,显示您正在使用的 DOM。可能有一个更好的定位器,并且是一个非常奇怪的属性。你确定这不是标签或文本吗?/Hold/Hold (10)name=
0赞 Vishal Aggarwal 11/14/2023
它是表格单元格吗?
1赞 Vishal Aggarwal 11/14/2023
如果是,那么请分享所有相关的表格html源代码。
0赞 Nishanth Balaji 11/16/2023
是的,那是一张桌子。我太笨了,我没有弄清楚哈哈,但对我来说,ggorlen 的解决方案奏效了。不过,我现在可能会重写自动化以将其定义为表
1赞 ggorlen 11/18/2023
编辑帖子以分享您的 HTML。否则,我的答案只是一个猜测,对未来的访问者没有太大帮助。谢谢。

答:

1赞 ggorlen 11/18/2023 #1

从评论中,听起来你有一个表格单元格:

const playwright = require("playwright"); // ^1.39.0

const html = `<!DOCTYPE html><html><body>
<table>
  <tr>
    <td>  Hold (10)  </td>
  </tr>
</table>
</body></html>`;

let browser;
(async () => {
  browser = await playwright.firefox.launch();
  const page = await browser.newPage();
  await page.setContent(html);
  const cell = page.getByRole("cell", {name: /\bhold\b/i});
  console.log(await cell.textContent()); // => Hold (10)
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

正则表达式可以是您想要的任何内容。 不区分大小写,使用单词边界。您可以使用 来确保名称以 开头,或者非常精确,例如 。/\bhold\b/i/^Hold/Hold/^Hold \(\d+\)$/

作为断言,我会使用:

import {expect, test} from "@playwright/test";

const html = `<same as above>`;

test("cell has Hold text", async ({page}) => {
  await page.setContent(html); // or goto in a real test
  await expect(page.getByRole("cell")).toHaveText(/^ *Hold\b/);
});

正则表达式的行为略有不同,因此请务必彻底测试快乐和悲伤的路径,以避免误报。.toHaveText

评论

1赞 Vishal Aggarwal 11/18/2023
这是一个很好的详细答案。谢谢!