自動等待
簡介
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 |
---|---|
assertThat(locator).isAttached() | 元素已附加 |
assertThat(locator).isChecked() | 核取方塊已勾選 |
assertThat(locator).isDisabled() | 元素已停用 |
assertThat(locator).isEditable() | 元素可編輯 |
assertThat(locator).isEmpty() | 容器為空 |
assertThat(locator).isEnabled() | 元素已啟用 |
assertThat(locator).isFocused() | 元素已聚焦 |
assertThat(locator).isHidden() | 元素不可見 |
assertThat(locator).isInViewport() | 元素在視窗中 |
assertThat(locator).isVisible() | 元素可見 |
assertThat(locator).containsText() | 元素包含文字 |
assertThat(locator).hasAttribute() | 元素有 DOM 屬性 |
assertThat(locator).hasClass() | 元素有類別屬性 |
assertThat(locator).hasCount() | 列表有確切的子項數量 |
assertThat(locator).hasCSS() | 元素有 CSS 屬性 |
assertThat(locator).hasId() | 元素有 ID |
assertThat(locator).hasJSProperty() | 元素有 JavaScript 屬性 |
assertThat(locator).hasText() | 元素匹配文字 |
assertThat(locator).hasValue() | 輸入框有值 |
assertThat(locator).hasValues() | 選擇框有選中的選項 |
assertThat(page).hasTitle() | 頁面有標題 |
assertThat(page).hasURL() | 頁面有 URL |
assertThat(response).isOK() | 回應狀態為 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
按鈕被替換為另一個現在啟用的按鈕。