跳到主内容

自动等待

介绍

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

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

以下是为每个操作执行的操作性检查的完整列表

操作可见稳定接收事件启用可编辑
Locator.CheckAsync()-
Locator.ClickAsync()-
Locator.DblClickAsync()-
Locator.SetCheckedAsync()-
Locator.TapAsync()-
Locator.UncheckAsync()-
Locator.HoverAsync()--
Locator.DragToAsync()--
Locator.ScreenshotAsync()---
Locator.FillAsync()--
Locator.ClearAsync()--
Locator.SelectOptionAsync()---
Locator.SelectTextAsync()----
Locator.ScrollIntoViewIfNeededAsync()----
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()元素具有 class 属性
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>;
  • 它是一个具有 [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.ClickAsync() 何时调用。

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