Playwright 在发起操作前在元素上执行一系列可操作性检查(actionability checks),确保这些操作的行为与预期一样。它自动等待所有相关检查通过,然后执行请求的操作。如果在给定的超时时间内,需要的检查没通过,那么操作以 TimeoutError 失败。
比如,对于 page.click(selector, **kwargs),Playwright 将确保:
以下是对每个操作执行的可操作性检查的完整列表:
| Action | Attached | Visible | Stable | Receives Events | Enabled | Editable |
|---|---|---|---|---|---|---|
| check | Yes | Yes | Yes | Yes | Yes | - |
| click | Yes | Yes | Yes | Yes | Yes | - |
| dblclick | Yes | Yes | Yes | Yes | Yes | - |
| setChecked | Yes | Yes | Yes | Yes | Yes | - |
| tap | Yes | Yes | Yes | Yes | Yes | - |
| uncheck | Yes | Yes | Yes | Yes | Yes | - |
| hover | Yes | Yes | Yes | Yes | - | - |
| scrollIntoViewIfNeeded | Yes | - | Yes | - | - | - |
| screenshot | Yes | Yes | Yes | - | - | - |
| fill | Yes | Yes | - | - | Yes | Yes |
| selectText | Yes | Yes | - | - | - | - |
| dispatchEvent | Yes | - | - | - | - | - |
| focus | Yes | - | - | - | - | - |
| getAttribute | Yes | - | - | - | - | - |
| innerText | Yes | - | - | - | - | - |
| innerHTML | Yes | - | - | - | - | - |
| press | Yes | - | - | - | - | - |
| setInputFiles | Yes | - | - | - | - | - |
| selectOption | Yes | Yes | - | - | Yes | - |
| textContent | Yes | - | - | - | - | - |
| type | Yes | - | - | - | - | - |
一些操作(比如 page.click(selector, **kwargs))支持 force 选项,它禁用不必要的可操作性检查,比如给 page.click(selector, **kwargs) 方法传递真 force 将不检查目标元素是否真正地接收点击事件。
你也可使用下面的方法检查元素的可操作性状态。这通常不需要,但它有助于写断言测试,确保在特定的操作后,元素到达可操作状态:
当元素连接(connected)到 Document 或 ShadowRoot 时,认为它已附加。
当元素有非空边界框,没有 visibility:hidden 计算样式时,认为它是可见的。注意零大小或具有 display:none 的元素被认为是不可见的。
元素在至少两个连续动画帧中保持相同的边界框时被认为是稳定的。
元素被认为是启用的,除非它是具有 disabled 属性的 <button>、<select>、<input> 或 <textarea>。
元素在被启用(enabled),并且没有 readonly 属性设置时,被认为是可编辑的。
当元素是操作点上指针事件的命中目标时,认为它接收指针事件。比如,当点击点 (10;10) 时,Playwright 检查是否有其它元素(通常是覆盖)将捕获在 (10;10) 处的点击。
比如,考虑一种场景,不管何时进行 page.click(selector, **kwargs) 调用,Playwright 将点击 Sign Up 按钮:
Sign Up 按钮被禁用Sign Up 按钮被替换为另一个启用的按钮