自动等待
简介
Playwright在执行操作之前会对元素进行一系列可操作性检查,以确保这些操作按预期进行。它会自动等待所有相关检查通过后,才会执行请求的操作。如果在给定的timeout
内未通过必要的检查,操作将失败并抛出TimeoutError
错误。
例如,对于locator.click(),Playwright将确保:
以下是针对每个操作执行的可操作性检查的完整列表:
Action | Visible | Stable | Receives Events | Enabled | Editable |
---|---|---|---|---|---|
locator.check() | Yes | Yes | Yes | Yes | - |
locator.click() | Yes | Yes | Yes | Yes | - |
locator.dblclick() | Yes | Yes | Yes | Yes | - |
locator.setChecked() | Yes | Yes | Yes | Yes | - |
locator.tap() | Yes | Yes | Yes | Yes | - |
locator.uncheck() | Yes | Yes | Yes | Yes | - |
locator.hover() | Yes | Yes | Yes | - | - |
locator.dragTo() | Yes | Yes | Yes | - | - |
locator.screenshot() | Yes | Yes | - | - | - |
locator.fill() | Yes | - | - | Yes | Yes |
locator.clear() | Yes | - | - | Yes | Yes |
locator.selectOption() | Yes | - | - | Yes | - |
locator.selectText() | Yes | - | - | - | - |
locator.scrollIntoViewIfNeeded() | - | Yes | - | - | - |
locator.blur() | - | - | - | - | - |
locator.dispatchEvent() | - | - | - | - | - |
locator.focus() | - | - | - | - | - |
locator.press() | - | - | - | - | - |
locator.pressSequentially() | - | - | - | - | - |
locator.setInputFiles() | - | - | - | - | - |
强制操作
某些操作如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
按钮被替换为另一个现在已启用的按钮。