自动等待
Playwright 在执行操作之前对元素执行一系列可操作性检查,以确保这些操作按预期运行。它自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查在给定的 timeout 内未通过,则操作将失败并显示 TimeoutError。
例如,对于 page.click(selector[, options]),Playwright 将确保:
- 元素已 Attached 到 DOM
- 元素是 Visible 的
- 元素是 Stable 的,即没有动画或动画已完成
- 元素 Receives Events,即未被其他元素遮挡
- 元素是 Enabled 的
以下是为每个操作执行的可操作性检查的完整列表:
| Action | Attached | Visible | Stable | Receives Events | Enabled | Editable |
|---|---|---|---|---|---|---|
| check | 是 | 是 | 是 | 是 | 是 | - |
| click | 是 | 是 | 是 | 是 | 是 | - |
| dblclick | 是 | 是 | 是 | 是 | 是 | - |
| setChecked | 是 | 是 | 是 | 是 | 是 | - |
| tap | 是 | 是 | 是 | 是 | 是 | - |
| uncheck | 是 | 是 | 是 | 是 | 是 | - |
| hover | 是 | 是 | 是 | 是 | - | - |
| scrollIntoViewIfNeeded | 是 | - | 是 | - | - | - |
| screenshot | 是 | 是 | 是 | - | - | - |
| fill | 是 | 是 | - | - | 是 | 是 |
| selectText | 是 | 是 | - | - | - | - |
| dispatchEvent | 是 | - | - | - | - | - |
| focus | 是 | - | - | - | - | - |
| getAttribute | 是 | - | - | - | - | - |
| innerText | 是 | - | - | - | - | - |
| innerHTML | 是 | - | - | - | - | - |
| press | 是 | - | - | - | - | - |
| setInputFiles | 是 | - | - | - | - | - |
| selectOption | 是 | 是 | - | - | 是 | - |
| textContent | 是 | - | - | - | - | - |
| type | 是 | - | - | - | - | - |
强制操作
某些操作(如 page.click(selector[, options]))支持 force 选项,该选项可禁用非必要的可操作性检查,例如将真值 force 传递给 page.click(selector[, options]) 方法将不会检查目标元素是否实际接收点击事件。
断言
您也可以使用以下方法之一检查元素的可操作性状态。这通常不是必需的,但它有助于编写断言测试,以确保在某些操作之后,元素达到可操作状态:
- elementHandle.isChecked()
- elementHandle.isDisabled()
- elementHandle.isEditable()
- elementHandle.isEnabled()
- elementHandle.isHidden()
- elementHandle.isVisible()
- page.isChecked(selector[, options])
- page.isDisabled(selector[, options])
- page.isEditable(selector[, options])
- page.isEnabled(selector[, options])
- page.isHidden(selector[, options])
- page.isVisible(selector[, options])
- locator.isChecked([options])
- locator.isDisabled([options])
- locator.isEditable([options])
- locator.isEnabled([options])
- locator.isHidden([options])
- locator.isVisible([options])
Attached
当元素 连接 到 Document 或 ShadowRoot 时,它被认为是已附加的。
Visible
当元素具有非空边界框且没有 visibility:hidden 计算样式时,它被认为是可见的。请注意,零大小的元素或具有 display:none 的元素不被视为可见。
Stable
当元素在至少两个连续的动画帧中保持相同的边界框时,它被认为是稳定的。
Enabled
除非元素是具有 disabled 属性的 <button>、<select>、<input> 或 <textarea>,否则它被认为是启用的。
Editable
当元素是 enabled 且未设置 readonly 属性时,它被认为是可编辑的。
Receives Events
当元素是操作点处指针事件的命中目标时,它被视为接收指针事件。例如,当点击点 (10;10) 时,Playwright 会检查是否有其他元素(通常是覆盖层)会在 (10;10) 处捕获点击。
例如,考虑这样一种情况:无论何时调用 page.click(selector[, options]),Playwright 都会点击 Sign Up 按钮:
- 页面正在检查用户名是否唯一,并且
Sign Up按钮已禁用; - 与服务器检查后,禁用的
Sign Up按钮被另一个现在已启用的按钮替换。