跳到主要内容

自动等待

介绍

Playwright 在执行操作之前会对元素执行一系列操作可行性检查,以确保这些操作按预期进行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的 timeout(超时)时间内通过,操作将失败并抛出 TimeoutError

例如,对于 locator.click(),Playwright 会确保:

  • locator 定位到恰好一个元素
  • 元素是 可见
  • 元素是 稳定的,即没有动画或已完成动画
  • 元素 接收事件,即未被其他元素遮挡
  • 元素是 可用

以下是针对每个操作执行的完整操作可行性检查列表:

操作可见稳定接收事件可用可编辑
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() 方法传递真值 (truthy) force 不会检查目标元素是否实际接收点击事件。

断言

Playwright 包含自动重试的断言,它们通过等待条件满足来消除不稳定性(flakiness),与操作前的自动等待类似。

断言描述
expect(locator).to_be_attached()元素已附加
expect(locator).to_be_checked()复选框已选中
expect(locator).to_be_disabled()元素已禁用
expect(locator).to_be_editable()元素可编辑
expect(locator).to_be_empty()容器为空
expect(locator).to_be_enabled()元素可用
expect(locator).to_be_focused()元素获得焦点
expect(locator).to_be_hidden()元素不可见
expect(locator).to_be_in_viewport()元素与视口相交
expect(locator).to_be_visible()元素可见
expect(locator).to_contain_text()元素包含文本
expect(locator).to_have_attribute()元素具有 DOM 属性
expect(locator).to_have_class()元素具有 class 属性
expect(locator).to_have_count()列表包含精确数量的子元素
expect(locator).to_have_css()元素具有 CSS 属性
expect(locator).to_have_id()元素具有 ID
expect(locator).to_have_js_property()元素具有 JavaScript 属性
expect(locator).to_have_text()元素匹配文本
expect(locator).to_have_value()输入框有值
expect(locator).to_have_values()select 元素有选中的选项
expect(page).to_have_title()页面有标题
expect(page).to_have_url()页面有 URL
expect(response).to_be_ok()响应状态为 OK

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

可见

当元素具有非空的边框盒 (bounding box) 且没有计算样式 visibility:hidden 时,它被视为可见。

请注意,根据此定义:

  • 尺寸为零的元素被视为可见。
  • 具有 display:none 的元素被视为可见。
  • 具有 opacity:0 的元素视为可见。

稳定

当元素在至少两个连续的动画帧中保持相同的边框盒 (bounding box) 时,它被视为稳定。

可用

当元素未被禁用时,它被视为可用。

当元素满足以下条件时,它被禁用

  • 它是带有 [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 role 支持此属性

接收事件

当元素是操作点上指针事件的命中目标时,它被视为接收指针事件。例如,当点击点 (10;10) 时,Playwright 会检查是否有其他元素(通常是覆盖层)会捕获点 (10;10) 的点击。

例如,考虑一个场景,Playwright 会点击 Sign Up 按钮,而不管何时调用了 locator.click()

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