定位器
定位器是一个新的实验性 API,它结合了等待和操作的功能。通过额外的先决条件检查,它可以自动重试失败的操作,从而使自动化脚本更加可靠,减少了不稳定性。
注意
定位器 API 处于实验阶段,我们不会对定位器 API 中的重大更改遵循语义化版本控制。
用例
等待元素
await page.locator('button').wait();
以下先决条件会自动检查
- 等待元素变为 可见 或隐藏。
等待函数
await page
.locator(() => {
let resolve!: (node: HTMLCanvasElement) => void;
const promise = new Promise(res => {
return (resolve = res);
});
const observer = new MutationObserver(records => {
for (const record of records) {
if (record.target instanceof HTMLCanvasElement) {
resolve(record.target);
}
}
});
observer.observe(document);
return promise;
})
.wait();
点击元素
await page.locator('button').click();
以下先决条件会自动检查
- 确保元素在视窗内。
- 等待元素变为 可见 或隐藏。
- 等待元素启用。
- 等待元素在两个连续的动画帧中具有稳定的边界框。
点击匹配条件的元素
await page
.locator('button')
.filter(button => !button.disabled)
.click();
以下先决条件会自动检查
- 确保元素在视窗内。
- 等待元素变为 可见 或隐藏。
- 等待元素启用。
- 等待元素在两个连续的动画帧中具有稳定的边界框。
填写输入框
await page.locator('input').fill('value');
自动检测输入类型并选择适当的方式使用提供的 value 填写输入框。
以下先决条件会自动检查
- 确保元素在视窗内。
- 等待元素变为 可见 或隐藏。
- 等待元素启用。
- 等待元素在两个连续的动画帧中具有稳定的边界框。
检索元素属性
const enabled = await page
.locator('button')
.map(button => !button.disabled)
.wait();
将鼠标悬停在元素上
await page.locator('div').hover();
以下先决条件会自动检查
- 确保元素在视窗内。
- 等待元素变为 可见 或隐藏。
- 等待元素在两个连续的动画帧中具有稳定的边界框。
滚动元素
await page.locator('div').scroll({
scrollLeft: 10,
scrollTop: 20,
});
以下先决条件会自动检查
- 确保元素在视窗内。
- 等待元素变为 可见 或隐藏。
- 等待元素在两个连续的动画帧中具有稳定的边界框。
配置定位器
定位器可以配置为调整配置先决条件和其他选项
await page
.locator('button')
.setEnsureElementIsInTheViewport(false)
.setTimeout(0)
.setVisibility(null)
.setWaitForEnabled(false)
.setWaitForStableBoundingBox(false)
.click();
获取定位器事件
目前,定位器支持单个事件,该事件会在定位器即将执行操作时通知您。
let willClick = false;
await page
.locator('button')
.on(LocatorEvent.Action, () => {
willClick = true;
})
.click();
此事件可用于日志记录/调试或其他目的。如果定位器重试操作,则该事件可能会多次触发。