跳到主要内容

自动等待

引言

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 按钮被另一个现在已启用的按钮替换。