遇到網頁加載慢,selenium運行效率降低,可以通過修改頁面加載策略提升自動化效率。
selenium加載很慢
通過URL導航到新頁面時,默認情況下,Selenium將等待文檔完全被加載才會執行下面的操作,此時網頁的加載狀態為 complete。
這種狀態可以在瀏覽器中通過document.readyState獲取,當網頁沒有完全加載時,顯示為interactive,加載完成后顯示complete。頁面加載完成后,再試圖訪問其他JAVAScript 動態加載的內容。
如果網頁打開速度很慢,可能是由于加載了一些非常耗時的內容,比如圖像、css文件和JS文件,此時會在頁面中出現正在加載的圈圈。
設置 set_page_load_timeout 解決
對于一些加載比較慢的資源,在進行自動化測試的時候沒有必要等到所有的元素加載完成,再進行元素定位。
設置一個超時時間,如果頁面加載超過了指定時間,手工終止頁面,相當于用手點擊瀏覽器的 X 按鈕,讓頁面停止加載。
# 設置加載超時時間為 5 sdriver.set_page_load_timeout(5)try:return driver.get(url)except TimeoutException:# 調用 js 腳本終止頁面加載driver.execute_script("window.stop()")
代碼有 3 個點:
- 1, 設置超時時間為 5 秒
- 2, 執行 driver.get(url) 時,頁面加載如果不超過 5 秒,不會報錯,超過 5 秒,會拋出超時異常
- 3, 使用 TimeoutException 捕獲超時異常。當超時后,執行 js 指定,終止頁面加載。
接下來,封裝頁面 get 方法:
class IndexPage(): url = '<http://jiubing> ' def __init__(self, driver, load_timeout=5): self.driver = driver self.driver.set_page_load_timeout(load_timeout) def get(self): try: return self.driver.get(self.url) except TimeoutException: self.driver.execute_script("window.stop()") ...
其他的代碼都不需要發生變化,只需要在加載耗時的地方添加 IndexPage(driver).get() 讓頁面按照設置的超時時間加載就可以了。
新的測試時間為 11.3 秒, 測試效率提升將近 60%。
應用
在網頁加載比較慢的情況下,把加載策略pageLoadStrategy設成eager或者none能有效提升自動化腳本的速度,但是這種方式不是十全十美的,由于還有資源沒有加載完成,它可能會導致之后的元素定位失敗,從而造成脆弱的測試。在實踐中還是應該結合具體情況來設置。
一般使用默認加載策略,只有部分頁面確實非常耗時,并且未加載的元素不會影響后面的定位才會視圖修改加載策略。