跳至主要内容

自动等待

简介

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

例如,对于Locator.ClickAsync(),Playwright将确保:

  • 定位器解析为恰好一个元素
  • 元素是Visible
  • 元素处于稳定状态,即没有动画或已完成动画
  • 元素 接收事件,即未被其他元素遮挡
  • 元素是Enabled

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

ActionVisibleStableReceives EventsEnabledEditable
Locator.CheckAsync()YesYesYesYes-
Locator.ClickAsync()YesYesYesYes-
Locator.DblClickAsync()YesYesYesYes-
Locator.SetCheckedAsync()YesYesYesYes-
Locator.TapAsync()YesYesYesYes-
Locator.UncheckAsync()YesYesYesYes-
Locator.HoverAsync()YesYesYes--
Locator.DragToAsync()YesYesYes--
Locator.ScreenshotAsync()YesYes---
Locator.FillAsync()Yes--YesYes
Locator.ClearAsync()Yes--YesYes
Locator.SelectOptionAsync()Yes--Yes-
Locator.SelectTextAsync()Yes----
Locator.ScrollIntoViewIfNeededAsync()-Yes---
Locator.BlurAsync()-----
Locator.DispatchEventAsync()-----
Locator.FocusAsync()-----
Locator.PressAsync()-----
Locator.PressSequentiallyAsync()-----
Locator.SetInputFilesAsync()-----

强制操作

某些操作如Locator.ClickAsync()支持force选项,该选项会禁用非必要的可操作性检查,例如向Locator.ClickAsync()方法传递真值force时,将不会检查目标元素是否实际接收到了点击事件。

断言

Playwright包含自动重试断言功能,通过等待直到条件满足来消除不稳定性,类似于操作前的自动等待。

断言描述
Expect(Locator).ToBeAttachedAsync()元素已附加
Expect(Locator).ToBeCheckedAsync()复选框已选中
Expect(Locator).ToBeDisabledAsync()元素已禁用
Expect(Locator).ToBeEditableAsync()元素可编辑
Expect(Locator).ToBeEmptyAsync()容器为空
Expect(Locator).ToBeEnabledAsync()元素已启用
Expect(Locator).ToBeFocusedAsync()元素已聚焦
Expect(Locator).ToBeHiddenAsync()元素不可见
Expect(Locator).ToBeInViewportAsync()元素与视口相交
Expect(Locator).ToBeVisibleAsync()元素可见
Expect(Locator).ToContainTextAsync()元素包含文本
Expect(Locator).ToHaveAttributeAsync()元素具有DOM属性
Expect(Locator).ToHaveClassAsync()元素具有类属性
Expect(Locator).ToHaveCountAsync()列表具有确切数量的子元素
Expect(Locator).ToHaveCSSAsync()元素具有CSS属性
Expect(Locator).ToHaveIdAsync()元素具有ID
Expect(Locator).ToHaveJSPropertyAsync()元素具有JavaScript属性
Expect(Locator).ToHaveTextAsync()元素匹配文本
Expect(Locator).ToHaveValueAsync()输入框具有值
Expect(Locator).ToHaveValuesAsync()选择框具有选中选项
Expect(Page).ToHaveTitleAsync()页面具有标题
Expect(Page).ToHaveURLAsync()页面具有URL
Expect(Response).ToBeOKAsync()响应具有OK状态

了解更多内容,请参阅断言指南

可见

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

请注意,根据这个定义:

  • 尺寸为零的元素不会被视为可见。
  • 带有display:none属性的元素不被视为可见。
  • 带有opacity:0的元素会被视为可见。

稳定版

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

已启用

当元素未被禁用时,被视为已启用。

元素在以下情况下会被禁用

  • 它是一个带有[disabled]属性的<button><select><input><textarea><option><optgroup>元素;
  • 它是一个<button><select><input><textarea><option><optgroup>元素,并且属于带有[disabled]属性的<fieldset>的一部分;
  • 它是带有[aria-disabled=true]属性的元素的后代。

可编辑

当元素处于启用状态且非只读时,被视为可编辑。

元素在以下情况下是只读的:

  • 它是一个带有[readonly]属性的<select><input><textarea>元素;
  • 它具有[aria-readonly=true]属性和一个支持该属性的ARIA角色。

接收事件

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

例如,考虑这样一个场景:无论何时调用Locator.ClickAsync(),Playwright都会点击Sign Up按钮:

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