自动等待
简介
Playwright 在执行操作之前会对元素执行一系列可操作性检查,以确保这些操作按预期执行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果给定 `timeout` 内未通过所需检查,则操作将失败并显示 `TimeoutError` 错误。
例如,对于 Locator.click(),Playwright 会确保
以下是为每个操作执行的可操作性检查的完整列表
操作 | 可见 | 稳定 | 接收事件 | 启用 | 可编辑 |
---|---|---|---|---|---|
Locator.check() | 是 | 是 | 是 | 是 | - |
Locator.click() | 是 | 是 | 是 | 是 | - |
Locator.dblclick() | 是 | 是 | 是 | 是 | - |
Locator.setChecked() | 是 | 是 | 是 | 是 | - |
Locator.tap() | 是 | 是 | 是 | 是 | - |
Locator.uncheck() | 是 | 是 | 是 | 是 | - |
Locator.hover() | 是 | 是 | 是 | - | - |
Locator.dragTo() | 是 | 是 | 是 | - | - |
Locator.screenshot() | 是 | 是 | - | - | - |
Locator.fill() | 是 | - | - | 是 | 是 |
Locator.clear() | 是 | - | - | 是 | 是 |
Locator.selectOption() | 是 | - | - | 是 | - |
Locator.selectText() | 是 | - | - | - | - |
Locator.scrollIntoViewIfNeeded() | - | 是 | - | - | - |
Locator.blur() | - | - | - | - | - |
Locator.dispatchEvent() | - | - | - | - | - |
Locator.focus() | - | - | - | - | - |
Locator.press() | - | - | - | - | - |
Locator.pressSequentially() | - | - | - | - | - |
Locator.setInputFiles() | - | - | - | - | - |
强制执行操作
某些操作(如 Locator.click())支持 `force` 选项,该选项会禁用非必要的可操作性检查,例如,将真值 `force` 传递给 Locator.click() 方法将不会检查目标元素是否实际上接收了点击事件。
断言
Playwright 包含自动重试断言,通过等待条件满足来消除间歇性问题,类似于在操作之前自动等待。
在 断言指南 中了解更多信息。
可见
当元素具有非空边界框且没有 `visibility:hidden` 计算样式时,则认为该元素可见。
请注意,根据此定义
- 大小为零的元素 **不** 视为可见。
- 具有 `display:none` 的元素 **不** 视为可见。
- 具有 `opacity:0` 的元素 **视为** 可见。
稳定
当元素在至少两个连续的动画帧中保持相同的边界框时,则认为该元素稳定。
启用
除非元素是具有 `disabled` 属性的 `<button>`、`<select>`、`<input>` 或 `<textarea>`,否则认为该元素已启用。
可编辑
当元素 启用 且未设置 `readonly` 属性时,则认为该元素可编辑。
接收事件
当元素是操作点处指针事件的命中目标时,则认为该元素正在接收指针事件。例如,当点击 `(10;10)` 点时,Playwright 会检查是否有其他元素(通常是叠加层)会在 `(10;10)` 点处捕获点击事件。
例如,假设 Playwright 会点击 `Sign Up` 按钮,无论何时进行 Locator.click() 调用
- 页面正在检查用户名是否唯一,并且 `Sign Up` 按钮已禁用;
- 在与服务器进行检查后,禁用的 `Sign Up` 按钮被替换为另一个现在已启用的按钮。