跳至主要内容

自动等待

简介

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 包含自动重试断言,通过等待条件满足来消除间歇性问题,类似于在操作之前自动等待。

断言描述
assertThat(locator).isAttached()元素已附加
assertThat(locator).isChecked()复选框已选中
assertThat(locator).isDisabled()元素已禁用
assertThat(locator).isEditable()元素可编辑
assertThat(locator).isEmpty()容器为空
assertThat(locator).isEnabled()元素已启用
assertThat(locator).isFocused()元素已获得焦点
assertThat(locator).isHidden()元素不可见
assertThat(locator).isInViewport()元素与视窗相交
assertThat(locator).isVisible()元素可见
assertThat(locator).containsText()元素包含文本
assertThat(locator).hasAttribute()元素具有 DOM 属性
assertThat(locator).hasClass()元素具有类属性
assertThat(locator).hasCount()列表具有确切数量的子元素
assertThat(locator).hasCSS()元素具有 CSS 属性
assertThat(locator).hasId()元素具有 ID
assertThat(locator).hasJSProperty()元素具有 JavaScript 属性
assertThat(locator).hasText()元素与文本匹配
assertThat(locator).hasValue()输入具有值
assertThat(locator).hasValues()选择具有选定的选项
assertThat(page).hasTitle()页面具有标题
assertThat(page).hasURL()页面具有 URL
assertThat(response).isOK()响应具有 OK 状态

断言指南 中了解更多信息。

可见

当元素具有非空边界框且没有 `visibility:hidden` 计算样式时,则认为该元素可见。

请注意,根据此定义

  • 大小为零的元素 **不** 视为可见。
  • 具有 `display:none` 的元素 **不** 视为可见。
  • 具有 `opacity:0` 的元素 **视为** 可见。

稳定

当元素在至少两个连续的动画帧中保持相同的边界框时,则认为该元素稳定。

启用

除非元素是具有 `disabled` 属性的 `<button>`、`<select>`、`<input>` 或 `<textarea>`,否则认为该元素已启用。

可编辑

当元素 启用 且未设置 `readonly` 属性时,则认为该元素可编辑。

接收事件

当元素是操作点处指针事件的命中目标时,则认为该元素正在接收指针事件。例如,当点击 `(10;10)` 点时,Playwright 会检查是否有其他元素(通常是叠加层)会在 `(10;10)` 点处捕获点击事件。

例如,假设 Playwright 会点击 `Sign Up` 按钮,无论何时进行 Locator.click() 调用

  • 页面正在检查用户名是否唯一,并且 `Sign Up` 按钮已禁用;
  • 在与服务器进行检查后,禁用的 `Sign Up` 按钮被替换为另一个现在已启用的按钮。