在介紹selenium的時候,宏哥也介紹過等待,是因為在某些元素出現後,才可以進行操作。有時候我們自己忘記新增等待時間後,查了半天程式碼確定就是沒有問題,奇怪的就是獲取不到元素。然後搞了好久,或者經過別人的提示才恍然大悟沒有新增等待時間。而playwright為了避免我們犯這麼low的錯誤,它對元素執行操作前,會進行一系列可操作性檢查,以確保這些行動按預期執行。它會自動等待所有相關檢查通過,然後才執行請求的操作。如果所需的檢查未在給定的範圍內通過則丟擲timeout,操作將失敗並顯示TimeoutError。正是由於playwright新增了預設等待時間才會增加指令碼穩定性。
什麼是playwright的自動等待?在官網我們可以看到這樣一段話:
Auto-wait. Playwright waits for elements to be actionable prior to performing actions. It also has a rich set of introspection events. The combination of the two eliminates the need for artificial timeouts - the primary cause of flaky tests.
翻譯過來的大概意思就是說:自動等待:playwright對元素執行操作前,會進行一系列可操作性檢查,以確保這些行動按預期執行。它會自動等待所有相關檢查通過,然後才執行請求的操作。如果所需的檢查未在給定的範圍內通過則丟擲timeout,操作將失敗並顯示TimeoutError。
如元素點選操作,在操作元素之前需要預判:
以下是針對每個操作執行的可操作性檢查的完整列表:
Action | Attached | Visible | Stable | Receives Events | Enabled | Editable |
---|---|---|---|---|---|---|
check | Yes | Yes | Yes | Yes | Yes | - |
click | Yes | Yes | Yes | Yes | Yes | - |
dblclick | Yes | Yes | Yes | Yes | Yes | - |
setChecked | Yes | Yes | Yes | Yes | Yes | - |
tap | Yes | Yes | Yes | Yes | Yes | - |
uncheck | Yes | Yes | Yes | Yes | Yes | - |
hover | Yes | Yes | Yes | Yes | - | - |
scrollIntoViewIfNeeded | Yes | - | Yes | - | - | - |
screenshot | Yes | Yes | Yes | - | - | - |
fill | Yes | Yes | - | - | Yes | Yes |
selectText | Yes | Yes | - | - | - | - |
dispatchEvent | Yes | - | - | - | - | - |
focus | Yes | - | - | - | - | - |
getAttribute | Yes | - | - | - | - | - |
innerText | Yes | - | - | - | - | - |
innerHTML | Yes | - | - | - | - | - |
press | Yes | - | - | - | - | - |
setInputFiles | Yes | - | - | - | - | - |
selectOption | Yes | Yes | - | - | Yes | - |
textContent | Yes | - | - | - | - | - |
type | Yes | - | - | - | - | - |
通過前邊的學習和實踐,想必大家和宏哥有同樣的感覺吧:Playwright 開啟瀏覽器執行指令碼的速度那就是一個字:快!相對於selenium,playwright執行速度會更快,眨眼間就完事了。因此為了便於我們檢視執行的過程,我們可以加上等待來減緩執行,但是與selenium不同,playwright通過slow_mo (單位是毫秒)減慢執行速度,它的作用範圍是全域性的,從啟動瀏覽器到操作元素每個動作都會有等待間隔,方便在出現問題的時候看到頁面操作情況。使用方法如下:
chromium.launch(headless=False, slow_mo=50)
宏哥就按照上邊的方法實踐一下,看一下是否真的可以減緩執行速度。
# coding=utf-8