自动等待
介绍
Playwright 在执行操作之前会对元素执行一系列操作可行性检查,以确保这些操作按预期进行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的 timeout
(超时)时间内通过,操作将失败并抛出 TimeoutError
。
例如,对于 locator.click(),Playwright 会确保:
以下是针对每个操作执行的完整操作可行性检查列表:
操作 | 可见 | 稳定 | 接收事件 | 可用 | 可编辑 |
---|---|---|---|---|---|
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
按钮被替换为另一个现在可用的按钮。