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 按鈕被替換為另一個現在啟用的按鈕。