自動等待
簡介
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
選項,該選項會停用非必要的可操作性檢查。例如,將 truthy force
傳遞給 locator.click() 方法將不會檢查目標元素是否實際接收到點擊事件。
斷言
Playwright 包含自動重試斷言,它會等待直到條件滿足,從而消除不穩定性,這與動作之前的自動等待類似。
斷言 | 描述 |
---|---|
expect(locator).toBeAttached() | 元素已附加 |
expect(locator).toBeChecked() | 核取方塊已勾選 |
expect(locator).toBeDisabled() | 元素已停用 |
expect(locator).toBeEditable() | 元素可編輯 |
expect(locator).toBeEmpty() | 容器為空 |
expect(locator).toBeEnabled() | 元素已啟用 |
expect(locator).toBeFocused() | 元素已聚焦 |
expect(locator).toBeHidden() | 元素不可見 |
expect(locator).toBeInViewport() | 元素與視窗相交 |
expect(locator).toBeVisible() | 元素可見 |
expect(locator).toContainText() | 元素包含文字 |
expect(locator).toHaveAttribute() | 元素具有 DOM 屬性 |
expect(locator).toHaveClass() | 元素具有 class 屬性 |
expect(locator).toHaveCount() | 列表具有確切數量的子元素 |
expect(locator).toHaveCSS() | 元素具有 CSS 屬性 |
expect(locator).toHaveId() | 元素具有 ID |
expect(locator).toHaveJSProperty() | 元素具有 JavaScript 屬性 |
expect(locator).toHaveText() | 元素符合文字 |
expect(locator).toHaveValue() | 輸入框具有值 |
expect(locator).toHaveValues() | 選取器已選取選項 |
expect(page).toHaveTitle() | 頁面具有標題 |
expect(page).toHaveURL() | 頁面具有 URL |
expect(response).toBeOK() | 回應具有 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 role。
接收事件
當元素是動作點處指標事件的命中目標時,即視為接收指標事件。例如,當點擊點 (10;10)
時,Playwright 會檢查是否另一個元素(通常是覆蓋層)將會改為捕獲 (10;10)
處的點擊。
例如,考慮這樣一種情況:無論何時調用 locator.click(),Playwright 都將點擊 Sign Up
按鈕:
- 頁面正在檢查使用者名稱是否唯一,並且
Sign Up
按鈕已停用; - 與伺服器檢查後,已停用的
Sign Up
按鈕將被另一個現在已啟用的按鈕替換。