Selenium 页面加载慢
Posted wodeboke-y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium 页面加载慢相关的知识,希望对你有一定的参考价值。
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
以上是关于Selenium 页面加载慢的主要内容,如果未能解决你的问题,请参考以下文章
如何用python的selenium提取页面所有资源加载的链接