自动等待
引言
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>
、<option>
或<optgroup>
; - 它是一个带有
[disabled]
属性的<fieldset>
的一部分的<button>
、<select>
、<input>
、<textarea>
、<option>
或<optgroup>
; - 它是带有
[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
按钮被替换为另一个现已启用的按钮。