自动等待
简介
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 选项,该选项会禁用非必要的可靠性检查,例如向 Locator.click() 方法传递 truthy 的 force 值将不会检查目标元素是否实际接收到点击事件。
断言
Playwright 包含自动重试断言,通过等待条件满足来消除不稳定性,这与操作前的自动等待类似。
在 断言指南 中了解更多信息。
可见
当元素具有非空边界框且没有 visibility:hidden 计算样式时,该元素被认为是可见的。
请注意,根据此定义:
- 零大小的元素不被认为是可见的。
- 具有
display:none的元素不被认为是可见的。 - 具有
opacity:0的元素被认为是可见的。
稳定
当元素在至少两个连续动画帧中保持相同的边界框时,该元素被认为是稳定的。
启用
当元素未被禁用时,该元素被认为是启用的。
当以下情况时,元素被禁用:
- 它是带有
[disabled]属性的<button>、<select>、<input>、<textarea>、<option>或<optgroup>; - 是
<button>、<select>、<input>、<textarea>、<option>或<optgroup>,它是带有[disabled]属性的<fieldset>的一部分; - 它是带有
[aria-disabled=true]属性的元素的后代。
可编辑
当元素启用且未被只读时,该元素被认为是可编辑的。
当以下情况时,元素被只读:
- 它是带有
[readonly]属性的<select>、<input>或<textarea>; - 它具有
[aria-readonly=true]属性和一个支持它的 aria 角色。
接收事件
当元素是操作点的指针事件的目标时,它被认为正在接收指针事件。例如,当点击点 (10;10) 时,Playwright 会检查是否有其他元素(通常是覆盖层)会 대신 捕获 (10;10) 处的点击。
例如,考虑这样一个场景:无论何时调用 Locator.click(),Playwright 都会点击 Sign Up 按钮
- 页面正在检查用户名是否唯一,并且
Sign Up按钮被禁用; - 与服务器检查后,禁用的
Sign Up按钮被另一个现在已启用的按钮替换。