跳至主要内容

自动等待

简介

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

断言描述
expect(locator).toBeAttached()元素已附加
expect(locator).toBeChecked()复选框已选中
expect(locator).toBeDisabled()元素已禁用
expect(locator).toBeEditable()元素可编辑
expect(locator).toBeEmpty()容器为空
expect(locator).toBeEnabled()元素已启用
expect(locator).toBeFocused()元素已聚焦
expect(locator).toBeHidden()元素不可见
expect(locator).toBeInViewport()元素与视口相交
expect(locator).toBeVisible()元素可见
expect(locator).toContainText()元素包含文本
expect(locator).toHaveAttribute()元素具有DOM属性
expect(locator).toHaveClass()元素具有类属性
expect(locator).toHaveCount()列表具有确切数量的子元素
expect(locator).toHaveCSS()元素具有CSS属性
expect(locator).toHaveId()元素具有ID
expect(locator).toHaveJSProperty()元素具有JavaScript属性
expect(locator).toHaveText()元素匹配文本
expect(locator).toHaveValue()输入框具有值
expect(locator).toHaveValues()选择框已选中选项
expect(page).toHaveTitle()页面具有标题
expect(page).toHaveURL()页面具有URL
expect(response).toBeOK()响应状态为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.click(),Playwright都会点击Sign Up按钮:

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