《最新出爐》系列初窺篇-Python+Playwright 自動化測試-3-離線搭建 playwright 環境
1.簡介
在介紹 selenium 的時候,宏哥也介紹過等待,是因為在某些元素出現後,才可以進行操作。有時候我們自己忘記新增等待時間後,查了半天程式碼確定就是沒有問題,奇怪的就是獲取不到元素。然後搞了好久,或者經過別人的提示才恍然大悟沒有新增等待時間。而 playwright 為了避免我們犯這麼 low 的錯誤,它對元素執行操作前,會進行一系列可操作性檢查,以確保這些行動按預期執行。它會自動等待所有相關檢查透過,然後才執行請求的操作。如果所需的檢查未在給定的範圍內透過則丟擲 timeout,操作將失敗並顯示 TimeoutError。正是由於 playwright 新增了預設等待時間才會增加指令碼穩定性。
2.自動等待
什麼是 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 | - | - | - | - | - |
3.slow_mo
透過前邊的學習和實踐,想必大家和宏哥有同樣的感覺吧:Playwright 開啟瀏覽器執行指令碼的速度那就是一個字:快!相對於 selenium,playwright 執行速度會更快,眨眼間就完事了。因此為了便於我們檢視執行的過程,我們可以加上等待來減緩執行,但是與 selenium 不同,playwright 透過 slow_mo(單位是毫秒)減慢執行速度,它的作用範圍是全域性的,從啟動瀏覽器到操作元素每個動作都會有等待間隔,方便在出現問題的時候看到頁面操作情況。使用方法如下:
chromium.launch(headless=False, slow_mo=50)
3.1 牛刀小試
宏哥就按照上邊的方法實踐一下,看一下是否真的可以減緩執行速度。
3.1.1 參考程式碼
# coding=utf-8🔥
# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行
# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2023-05-25
@author: 北京-宏哥 QQ交流群:705269076
公眾號:北京宏哥
Project: 《《最新出爐》系列初窺篇-Python+Playwright自動化測試-4-playwright自動等待及擴充套件
'''
# 3.匯入模組
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=5000)
page = browser.new_page()
page.goto("https://image.baidu.com/search/down?url=https://www.baidu.com")
print(page.title())
page.fill('#kw', "北京-宏哥")
page.click('#su')
browser.close()
3.1.2 執行程式碼
1.執行程式碼,右鍵 Run'test',控制檯輸出,如下圖所示:
2.程式碼的執行過程,如下圖所示:
4.time.sleep()
與 selenium 不同,playwright 不再支援 time.sleep(),而是使用 page.wait_for_timeout() 來實現等待,當我們除錯時需要等待,即可使用該方法。Playwright 在查詢元素的時候具有自動等待功能,如果你在除錯的時候需要使用等待,你應該使用 page.wait_for_timeout(5000) 代替 time.sleep(5) 並且最好不要等待超時。
注:請使用 wait( wait_for_timeout) 方法而不是 time 模組。這是因為我們內部依賴於非同步操作,並且在使用時 time.sleep(5) 無法正確處理它們。
4.1 牛刀小試
宏哥就按照上邊的方法實踐一下。
4.1.1 參考程式碼
# coding=utf-8🔥
# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行
# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2023-05-25
@author: 北京-宏哥 QQ交流群:705269076
公眾號:北京宏哥
Project: 《《最新出爐》系列初窺篇-Python+Playwright自動化測試-4-playwright自動等待及擴充套件
'''
# 3.匯入模組
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=1000)
page = browser.new_page()
page.goto("https://image.baidu.com/search/down?url=https://www.baidu.com")
print(page.title())
# 等待5秒
page.wait_for_timeout(5000)
page.fill('#kw', "北京-宏哥")
page.click('#su')
# 等待3秒
page.wait_for_timeout(3000)
browser.close()
4.1.2 執行程式碼
1.執行程式碼,右鍵 Run'test',控制檯輸出,如下圖所示:
2.程式碼的執行過程,如下圖所示:
5.小結
本文主要介紹了一些 playwright 的使用與 selenium 有一些不同,我們需要注意不同點,比如 playwright 預設是無頭模式執行以及等待的改變。下一篇文章我們將介紹 playwright 定位元素的方法。
好了,今天時間也不早了,宏哥就講解和分享到這裡,感謝您耐心的閱讀,希望對您有所幫助。
5.1 自行設定等待
即使 Playwright 已經做了充分準備,但是也並不完全穩定,在實際專案中依舊容易出現因頁面載入導致事件沒有生效等問題,為了避免這些問題,需要自行設定等待。
# 固定等待1秒
page.wait_for_timeout(1000)
# 等待事件
page.wait_for_event(event)
# 等待載入狀態
page.get_by_role("button").click()
page.wait_for_load_state()
相關文章
- 《最新出爐》系列初窺篇-Python+Playwright 自動化測試-1-環境準備與搭建Python
- 《最新出爐》系列初窺篇-Python+Playwright 自動化測試-4-playwright 等待淺析Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-37-如何截圖-上篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-19-處理滑鼠拖拽-中篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-20-處理滑鼠拖拽-下篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-17-處理滑鼠懸停Python
- 《最新出爐》系列初窺篇-Python+Playwright 自動化測試-2-playwright 的 API 及其他知識PythonAPI
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-31-JavaScript的呼叫執行-上篇PythonJavaScript
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-32-JavaScript的呼叫執行-下篇PythonJavaScript
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-23-處理select下拉框-下篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-35-處理web頁面定位toast-上篇PythonWebAST
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-36-處理web頁面定位toast-下篇PythonWebAST
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-28-處理日曆時間控制元件-上篇Python控制元件
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-29-處理日曆時間控制元件-中篇Python控制元件
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-30-處理日曆時間控制元件-下篇Python控制元件
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-25-處理單選和多選按鈕-中篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-24-處理單選和多選按鈕-上篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-26-處理單選和多選按鈕-下篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-27-處理單選和多選按鈕-番外篇Python
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-33-處理https 安全問題或者非信任站點-上篇PythonHTTP
- 《最新出爐》系列初窺篇-Python+Playwright自動化測試-34-處理https 安全問題或者非信任站點-下篇PythonHTTP
- 《最新出爐》系列入門篇-Python+Playwright自動化測試-40-錄製生成指令碼Python指令碼
- 搭建自動化測試環境
- 自動化測試之Selenium篇(一):環境搭建
- 自動化測試 selenium 環境搭建
- Web自動化測試 —— 測試環境搭建 (Selenium+Python) Windows篇WebPythonWindows
- Android自動化測試第二篇 Appnium環境搭建AndroidAPP
- IOS自動化測試環境搭建(Python & Java)iOSPythonJava
- 搭建appium+python自動化測試環境APPPython
- 【自動化】使用PlayWright+代理IP實現多環境隔離
- Web自動化測試 環境搭建(selenium+python)WebPython
- python3自動化測試環境搭建-依賴軟體下載(用於離線安裝)Python
- mac上搭建appium+IOS自動化測試環境(一)MacAPPiOS
- 自動化測試系列 —— UI自動化測試UI
- 騰訊出品小程式自動化測試框架【Minium】系列(一)環境搭建之第一個測試程式框架
- python+selenium UI自動化測試環境搭建及使用PythonUI
- Appium+Python實現iOS自動化測試~環境搭建APPPythoniOS
- Playwright自動化測試工具之高階使用