自動等待
簡介
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>
; - 它是
<button>
、<select>
、<input>
、<textarea>
、<option>
或<optgroup>
,並且是具有[disabled]
屬性的<fieldset>
的一部分; - 它是具有
[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
按鈕被另一個現在已啟用的按鈕取代。