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