Skip to main content

自動等待

簡介

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

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

  • 定位器解析為恰好一個元素
  • 元素是可見
  • 元素是穩定的,即沒有在動畫中或已完成動畫
  • 元素接收事件,即沒有被其他元素遮蔽
  • 元素是啟用

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

動作可見穩定接收事件啟用可編輯
Locator.check()-
Locator.click()-
Locator.dblclick()-
Locator.setChecked()-
Locator.tap()-
Locator.uncheck()-
Locator.hover()--
Locator.dragTo()--
Locator.screenshot()---
Locator.fill()--
Locator.clear()--
Locator.selectOption()---
Locator.selectText()----
Locator.scrollIntoViewIfNeeded()----
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()元素具有 class 屬性
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 的元素視為可見。

穩定

當元素在至少連續兩個動畫影格中保持相同的邊界框時,則被視為穩定。

啟用

當元素不是停用時,則被視為啟用。

在以下情況下元素停用

  • 它是具有 [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 角色。

接收事件

當元素是動作點指標事件的點擊目標時,則被視為接收指標事件。例如,在點 (10;10) 點擊時,Playwright 會檢查是否有其他元素(通常是覆蓋層)會代替捕獲在 (10;10) 的點擊。

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

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