Skip to main content

自動等待

簡介

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

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

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

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

動作可見穩定接收事件啟用可編輯
locator.check()-
locator.click()-
locator.dblclick()-
locator.set_checked()-
locator.tap()-
locator.uncheck()-
locator.hover()--
locator.drag_to()--
locator.screenshot()---
locator.fill()--
locator.clear()--
locator.select_option()---
locator.select_text()----
locator.scroll_into_view_if_needed()----
locator.blur()-----
locator.dispatch_event()-----
locator.focus()-----
locator.press()-----
locator.press_sequentially()-----
locator.set_input_files()-----

強制動作

某些動作如 locator.click() 支援 force 選項,可停用非必要的可操作性檢查。例如,向 locator.click() 方法傳遞真值的 force 將不會檢查目標元素是否實際接收點擊事件。

斷言

Playwright 包含自動重試斷言,透過等待直到條件符合來消除不穩定性,類似於動作前的自動等待。

斷言描述
expect(locator).to_be_attached()元素已附加
expect(locator).to_be_checked()核取方塊已勾選
expect(locator).to_be_disabled()元素已停用
expect(locator).to_be_editable()元素可編輯
expect(locator).to_be_empty()容器為空
expect(locator).to_be_enabled()元素已啟用
expect(locator).to_be_focused()元素已聚焦
expect(locator).to_be_hidden()元素不可見
expect(locator).to_be_in_viewport()元素與檢視區相交
expect(locator).to_be_visible()元素可見
expect(locator).to_contain_text()元素包含文字
expect(locator).to_have_attribute()元素具有 DOM 屬性
expect(locator).to_have_class()元素具有 class 屬性
expect(locator).to_have_count()清單具有確切的子元素數量
expect(locator).to_have_css()元素具有 CSS 屬性
expect(locator).to_have_id()元素具有 ID
expect(locator).to_have_js_property()元素具有 JavaScript 屬性
expect(locator).to_have_text()元素符合文字
expect(locator).to_have_value()輸入欄位具有值
expect(locator).to_have_values()選擇框具有已選取的選項
expect(page).to_have_title()頁面具有標題
expect(page).to_have_url()頁面具有 URL
expect(response).to_be_ok()回應狀態為 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 按鈕被替換為另一個現在啟用的按鈕。