一、前言
有不少粉絲,甚至一些行業中有一定經驗的朋友都說selenium性能差、很慢,打開一個網頁要等半天才開始執行,初學的粉絲提出這個問題我能夠理解,行業作業經驗數年還這樣說我就有點詫異了,看來很多小伙伴還是沒有閱讀官方檔案的習慣,這里就簡單的講解一下為什么你會覺得selenium慢以及如何解決這個問題:
當我們通過webdriver(比如啟動谷歌瀏覽器:webdriver.Chrome())啟動瀏覽器時,會啟動一個沒有任何快取、cookie的瀏覽器,這個時候通過driver.get("https://xxx")去訪問頁面自然是慢的,因為它需要加載該頁面的資源,如果它的圖片、樣式、js檔案過大時,這個時候就會變得更慢,
跟我們平時直接將瀏覽器清除快取再訪問是一個道理,這并不是Selnium本身性能存在缺陷,
但這時小伙伴們肯定會有疑惑,就算清了瀏覽器快取重新訪問,也沒有通過Selnium來跑的那么慢呀!想要點擊的按鈕都出現半天了,它都還不進行點擊,這不叫慢嗎?
這其實跟Selenium的頁面加載策略有關,
文章目錄
- 一、前言
- 二、Selenium的頁面加載策略詳解
- 三、總結
二、Selenium的頁面加載策略詳解
Selnium的頁面加載策略(pageLoadStrategy)有三種:
- normal:等待整個頁面加載完畢再開始執行操作
- eager:等待整個dom樹加載完成,即
DOMContentLoaded這個事件完成,也就是只要 HTML 完全加載和決議完畢就開始執行操作,放棄等待圖片、樣式、子幀的加載, - none:等待html下載完成,哪怕還沒開始決議就開始執行操作,
默認情況下,當 Selenium WebDriver 加載頁面時,它遵循的是normal加載策略,所以就會導致頁面加載過慢,特別是在圖片、樣式等檔案過大時,慢的就尤其明顯了,
所以我們可以根據實際情況調整Selenium的頁面加載策略來縮短等待時間,提高執行速度,
下圖是默認情況(未手動指定加載策略)來訪問愛奇藝首頁,然后點擊電影,共耗時:7s左右

下圖是使用eager加載策略來訪問愛奇藝首頁,然后點擊電影,共耗時:3.6s左右
配置代碼如下:
chrome_options = Options()
chrome_options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=chrome_options)

可以明顯的看到訪問速度變快了,
以為就這樣了嗎?還可以更快!
加載策略設定為none,并引入retry做重試(目的是為了防止報錯,當然設定隱式等待也可,但沒retry穩妥)可以只用2s左右就能執行完成,完整代碼如下:
import datetime
from retrying import retry # 需第三方庫,需pip進行安裝
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
@retry(wait_fixed=10, stop_max_attempt_number=1)
def click(path):
driver.find_element(By.XPATH, path).click()
chrome_options = Options()
chrome_options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=chrome_options)
start_time = datetime.datetime.now()
driver.get('https://www.iqiyi.com/')
click('//*[@id="block-C"]/div/div/div/div[1]/div[1]/div/div[1]/div/div/a/span[2]')
end_time = datetime.datetime.now()
print(end_time - start_time)
三、總結
所以selenium并不慢,只是你加載策略沒有選擇對而誤認為它慢,
當我們遇到比較費解或疑惑的問題時,應該第一時間去看看官方檔案,說不定它已經有了解決方案了,
另外,本專欄教程將無限期停止更新,因為最近在寫更有意思、更干貨的專欄《從0構建自動化測驗平臺》 歡迎訂閱支持!
在線演示地址:http://121.43.43.59/ (帳號:admin 密碼:123456)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/381995.html
標籤:python
