自動等待
簡介
Playwright 在執行操作之前會對元素進行一系列的可操作性檢查,以確保這些操作按預期進行。它會自動等待所有相關檢查通過,然後才執行請求的操作。如果在給定的 timeout
內未通過所需的檢查,操作將因 TimeoutError
而失敗。
例如,對於 locator.click(),Playwright 將確保:
- 定位器解析為確切的一個元素
- 元素是 [可見的]
- 元素是 [穩定的],即不在 動畫中或動畫已完成
- 元素 [接收事件],即不被其他元素遮擋
- 元素是 [啟用的]
以下是為每個動作執行的完整可操作性檢查清單:
Action | Visible | Stable | Receives Events | Enabled | Editable |
---|---|---|---|---|---|
locator.check() | Yes | Yes | Yes | Yes | - |
locator.click() | Yes | Yes | Yes | Yes | - |
locator.dblclick() | Yes | Yes | Yes | Yes | - |
locator.setChecked() | Yes | Yes | Yes | Yes | - |
locator.tap() | Yes | Yes | Yes | Yes | - |
locator.uncheck() | Yes | Yes | Yes | Yes | - |
locator.hover() | Yes | Yes | Yes | - | - |
locator.dragTo() | Yes | Yes | Yes | - | - |
locator.screenshot() | Yes | Yes | - | - | - |
locator.fill() | Yes | - | - | Yes | Yes |
locator.clear() | Yes | - | - | Yes | Yes |
locator.selectOption() | Yes | - | - | Yes | - |
locator.selectText() | Yes | - | - | - | - |
locator.scrollIntoViewIfNeeded() | - | Yes | - | - | - |
locator.blur() | - | - | - | - | - |
locator.dispatchEvent() | - | - | - | - | - |
locator.focus() | - | - | - | - | - |
locator.press() | - | - | - | - | - |
locator.pressSequentially() | - | - | - | - | - |
locator.setInputFiles() | - | - | - | - | - |
有些操作如 locator.click() 支援 force
選項,該選項會停用非必要的可操作性檢查,例如傳遞真值 force
給 locator.click() 方法將不會檢查目標元素是否實際接收到點擊事件。
斷言
Playwright 包含自動重試的斷言,通過等待條件滿足來消除不穩定性,類似於在操作前自動等待。
Assertion | Description |
---|---|
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() | 元素具有類別屬性 |
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 |
了解更多在 assertions 指南。
可見
元素在具有非空的邊界框且未計算出 visibility:hidden
樣式時被認為是可見的。
請注意,根據此定義:
- 零大小的元素不會被認為是可見的。
display:none
的元素不會被認為是可見的。opacity:0
的元素會被認為是可見的。
穩定
當元素在至少兩個連續的動畫幀中保持相同的邊界框時,則認為該元素是穩定的。
啟用
Element 被認為是啟用的,除非它是具有 disabled
屬性的 <button>
、<select>
、<input>
或 <textarea>
。
可編輯
元素在 enabled 且未設置 readonly
屬性時被視為可編輯。
接收事件
元素被認為正在接收指標事件,當它是在操作點的指標事件的命中目標時。例如,當點擊點在 (10;10)
時,Playwright 會檢查是否有其他元素 (通常是覆蓋層) 會捕捉到 (10;10)
的點擊。
例如,考慮一個場景,無論何時進行 locator.click 呼叫,Playwright 都會點擊 Sign Up
按鈕:
- 頁面正在檢查用戶名是否唯一且
Sign Up
按鈕被停用; - 與伺服器檢查後,被停用的
Sign Up
按鈕被替換為另一個現在啟用的按鈕。