Selenium 頁面加載慢
問題描述:
使用Selenium獲取網頁,發現webdriver.get方法會阻塞直到網頁全部加載完成,官方提供的三種wait方法僅對網頁的ajax有比較明顯的效果。對於部分網頁,網頁中所需要的元素很快就能加載完成,但是整個頁面加載完成卻需要很久,所以如何才能使得網頁在加載完所需要元素后即停止。
問題解決:
pageLoadStrategy設置(推薦)
For commands that cause a new document to load, the point at which the command returns is determined by the session’s page loading strategy.
上面這段話的大致意思是,對於一個新加載的dom,頁面什么時候開始接受命令由頁面的加載策略決定,也就是說,我們通過修改頁面加載策略,可以使頁面即使處於加載中,也能接受我們的命令,從這點可以解決webdriver.get的阻塞問題。而每類webdriver都有一個對應的配置文件放在特定的類DesiredCapabilities里面,通過修改里面的pageLoadStrategy,可以使webdriver的頁面加載策略發生改變。
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
desired_capabilities = DesiredCapabilities.CHROME # 修改頁面加載策略
desired_capabilities["pageLoadStrategy"] = "none" # 注釋這兩行會導致最后輸出結果的延遲,即等待頁面加載完成再輸出
driver = webdriver.Chrome('browsers/chromedriver.exe')
wait = WebDriverWait(driver, 10) #后面可以使用wait對特定元素進行等待
driver.get('http://qzone.qq.com/')
# some code to work.
print("Reach end.")
上面我們可以看到,將頁面加載策略修改為none之后,頁面即使在加載過程中,程序也可以繼續執行。代碼中的pageLoadStrategy屬性可以設置為以下三種屬性:
normal
即正常情況下,selenium會等待整個界面加載完成(指對html和子資源的下載與解析,不包括ajax)
eager
要等待整個dom樹加載完成,即DOMContentLoaded這個事件完成,僅對html的內容進行下載解析
none
當html下載完成之后,不等待解析完成,selenium會直接返回
上面的代碼用了最后一種解析方式——none,不作等待,直接返回,然后在后面的代碼中可以用explicit_wait或者implicit_wait等方式來對特定元素進行等待捕獲。
總結
- 不建議使用eager模式,會導致browser沒有生成,返回異常;
- 使用none模式相當於生成了dom,但不加載其它文件(圖片等)。
問題:
DOMContentLoaded事件
http://www.softwhy.com/article-9783-1.html