跳至主要内容

自动等待

简介

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

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

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

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

ActionVisibleStableReceives EventsEnabledEditable
Locator.check()YesYesYesYes-
Locator.click()YesYesYesYes-
Locator.dblclick()YesYesYesYes-
Locator.setChecked()YesYesYesYes-
Locator.tap()YesYesYesYes-
Locator.uncheck()YesYesYesYes-
Locator.hover()YesYesYes--
Locator.dragTo()YesYesYes--
Locator.screenshot()YesYes---
Locator.fill()Yes--YesYes
Locator.clear()Yes--YesYes
Locator.selectOption()Yes--Yes-
Locator.selectText()Yes----
Locator.scrollIntoViewIfNeeded()-Yes---
Locator.blur()-----
Locator.dispatchEvent()-----
Locator.focus()-----
Locator.press()-----
Locator.pressSequentially()-----
Locator.setInputFiles()-----

强制操作

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

断言

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

断言描述
assertThat(locator).isAttached()元素已附加
assertThat(locator).isChecked()复选框已选中
assertThat(locator).isDisabled()元素已禁用
assertThat(locator).isEditable()元素可编辑
assertThat(locator).isEmpty()容器为空
assertThat(locator).isEnabled()元素已启用
assertThat(locator).isFocused()元素已聚焦
assertThat(locator).isHidden()元素不可见
assertThat(locator).isInViewport()元素与视口相交
assertThat(locator).isVisible()元素可见
assertThat(locator).containsText()元素包含文本
assertThat(locator).hasAttribute()元素具有DOM属性
assertThat(locator).hasClass()元素具有类属性
assertThat(locator).hasCount()列表具有确切的子元素数量
assertThat(locator).hasCSS()元素具有CSS属性
assertThat(locator).hasId()元素具有ID
assertThat(locator).hasJSProperty()元素具有JavaScript属性
assertThat(locator).hasText()元素匹配文本
assertThat(locator).hasValue()输入框具有值
assertThat(locator).hasValues()选择框具有选中选项
assertThat(page).hasTitle()页面具有标题
assertThat(page).hasURL()页面具有URL
assertThat(response).isOK()响应具有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)处捕获该点击。

例如,考虑一个场景,Playwright 将点击 Sign Up 按钮,无论何时调用 Locator.click()

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