自动等待
简介
Playwright 在执行操作之前,会对元素执行一系列可操作性检查,以确保这些操作按预期执行。它会自动等待所有相关的检查通过,然后才执行请求的操作。如果在给定的 timeout
内,所需的检查未通过,则操作失败,并抛出 TimeoutError
。
例如,对于 locator.click(),Playwright 将确保:
以下是为每个操作执行的完整可操作性检查列表:
操作 | 可见 | 稳定 | 接收事件 | 启用 | 可编辑 |
---|---|---|---|---|---|
locator.check() | 是 | 是 | 是 | 是 | - |
locator.click() | 是 | 是 | 是 | 是 | - |
locator.dblclick() | 是 | 是 | 是 | 是 | - |
locator.set_checked() | 是 | 是 | 是 | 是 | - |
locator.tap() | 是 | 是 | 是 | 是 | - |
locator.uncheck() | 是 | 是 | 是 | 是 | - |
locator.hover() | 是 | 是 | 是 | - | - |
locator.drag_to() | 是 | 是 | 是 | - | - |
locator.screenshot() | 是 | 是 | - | - | - |
locator.fill() | 是 | - | - | 是 | 是 |
locator.clear() | 是 | - | - | 是 | 是 |
locator.select_option() | 是 | - | - | 是 | - |
locator.select_text() | 是 | - | - | - | - |
locator.scroll_into_view_if_needed() | - | 是 | - | - | - |
locator.blur() | - | - | - | - | - |
locator.dispatch_event() | - | - | - | - | - |
locator.focus() | - | - | - | - | - |
locator.press() | - | - | - | - | - |
locator.press_sequentially() | - | - | - | - | - |
locator.set_input_files() | - | - | - | - | - |
强制操作
某些操作(如 locator.click())支持 force
选项,该选项禁用非必要的可操作性检查。例如,向 locator.click() 方法传递真值 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
按钮被另一个现在已启用的按钮替换。