自动等待
引言
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 包含自动重试的断言,这些断言通过等待条件满足来消除不稳定性,类似于动作前的自动等待。
断言 | 描述 |
---|---|
expect(locator).toBeAttached() | 元素已附加 |
expect(locator).toBeChecked() | 复选框已选中 |
expect(locator).toBeDisabled() | 元素已禁用 |
expect(locator).toBeEditable() | 元素可编辑 |
expect(locator).toBeEmpty() | 容器为空 |
expect(locator).toBeEnabled() | 元素已启用 |
expect(locator).toBeFocused() | 元素已聚焦 |
expect(locator).toBeHidden() | 元素不可见 |
expect(locator).toBeInViewport() | 元素与视口相交 |
expect(locator).toBeVisible() | 元素可见 |
expect(locator).toContainText() | 元素包含文本 |
expect(locator).toHaveAttribute() | 元素具有 DOM 属性 |
expect(locator).toHaveClass() | 元素具有类属性 |
expect(locator).toHaveCount() | 列表具有准确的子元素数量 |
expect(locator).toHaveCSS() | 元素具有 CSS 属性 |
expect(locator).toHaveId() | 元素具有 ID |
expect(locator).toHaveJSProperty() | 元素具有 JavaScript 属性 |
expect(locator).toHaveText() | 元素匹配文本 |
expect(locator).toHaveValue() | 输入框有值 |
expect(locator).toHaveValues() | 下拉选择框已选中选项 |
expect(page).toHaveTitle() | 页面有标题 |
expect(page).toHaveURL() | 页面有 URL |
expect(response).toBeOK() | 响应状态为 OK |
在断言指南中了解更多信息。
可见
当元素具有非空边界框且没有计算样式 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
按钮被另一个现在已启用的按钮替换。