自動等待
簡介
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
選項,可停用非必要的可操作性檢查。例如,將 truthy force
傳遞給 locator.click() 方法將不會檢查目標元素是否實際接收點擊事件。
斷言
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 狀態 |
請參閱斷言指南以了解更多資訊。
可見
當元素具有非空的邊界框且沒有 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] 按鈕會被另一個現在已啟用的按鈕取代。