我正在尝试单击带有以下行的按钮:
await page.getByRole('button', { name: '3 Employees' }).click();
我的问题是按钮的名称会根据员工数量而变化,因此如果该值被硬编码,它将失败。我会使用仅包含“Employees”一词的定位器方法,但它将与具有相同定位器和相同“Employees”文本的另一个按钮匹配,并且我也想避免使用 nth() 方法。
我真正想做的是使用我的代码行,但只搜索“员工”部分,这意味着我想包含 3 和“员工”之间的空格。或者在这种情况下是否有某种方法可以将 3 验证为任何类型的随机值,例如“{randomvalue}Employees”?
使用正则表达式应该适用于这个特定的按钮,假设页面上没有其他
/^\d+ Employees$/
元素:
import {expect, test} from "@playwright/test"; // ^1.42.1
const html = `<!DOCTYPE html><html><body>
<button></button>
<script>
setTimeout(() => {
document.querySelector("button").textContent =
~~(Math.random() * 100) + " Employees";
}, 3000);
</script>
</body></html>`;
test("{n} Employees button can be clicked", async ({page}) => {
await page.setContent(html);
await page.getByRole("button", {name: /^\d+ Employees$/}).click();
});
注意
^
和 $
锚点,使其完全匹配(前导/尾随空格除外)。如果您想使用子字符串匹配,请省略这些锚点。
如果有其他元素与此匹配,那么您可能需要考虑父链来隔离特定按钮,而不是使用第一个/最后一个/第n个按钮,这是您正确想要避免的。