Skip to main content

自動等待

簡介

Playwright 在執行操作之前會對元素進行一系列的可操作性檢查,以確保這些操作按預期進行。它會自動等待所有相關檢查通過,然後才執行請求的操作。如果在給定的 timeout 內未通過所需的檢查,操作將因 TimeoutError 而失敗。

例如,對於 Locator.click(),Playwright 會確保:

  • 定位器解析為確切的一個元素
  • 元素是 [可見的]
  • 元素是 [穩定的],即不在動畫中或動畫已完成
  • 元素 [接收事件],即不被其他元素遮擋
  • 元素是 [啟用的]

以下是為每個動作執行的完整可操作性檢查清單:

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 選項,該選項會停用非必要的可操作性檢查,例如傳遞真值 forceLocator.click() 方法將不會檢查目標元素是否實際接收到點擊事件。

斷言

Playwright 包含自動重試的斷言,通過等待條件滿足來消除不穩定性,類似於在操作前自動等待。

AssertionDescription
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

了解更多在 assertions 指南

可見

元素在具有非空的邊界框且未計算出 visibility:hidden 樣式時被認為是可見的。

請注意,根據此定義:

  • 零大小的元素不會被認為是可見的。
  • display:none 的元素不會被認為是可見的。
  • opacity:0 的元素被認為是可見的。

穩定

當元素在至少兩個連續的動畫幀中保持相同的邊界框時,則認為該元素是穩定的。

啟用

Element 被認為是啟用的,除非它是具有 disabled 屬性的 <button><select><input><textarea>

可編輯

元素在 enabled 且未設置 readonly 屬性時被視為可編輯。

接收事件

元素被認為正在接收指標事件,當它是在操作點的指標事件的命中目標時。例如,當點擊點在 (10;10) 時,Playwright 會檢查是否有其他元素 (通常是覆蓋層) 會捕捉到 (10;10) 的點擊。

例如,考慮一個場景,無論何時進行 Locator.click() 呼叫,Playwright 都會點擊 Sign Up 按鈕:

  • 頁面正在檢查用戶名是否唯一且Sign Up按鈕被停用;
  • 與伺服器檢查後,被停用的Sign Up按鈕被替換為另一個現在啟用的按鈕。