解决Selenium 页面加载慢

问题描述

使用 Selenium 进行 CSDN 的模拟刷新时,发现 webdriver.get 方法会阻塞直到网页全部加载完成,对于刷新 CSDN 来说,网页中所需要的元素很快就能加载完成,但是整个页面加载完成却需要很久,所以如何才能使得网页在加载完所需要元素后即停止是本文所需要解决的问题。

问题解决

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 属性可以设置为以下三种属性:

属性 详细描述
eager 即正常情况下,selenium会等待整个界面加载完成(指对html和子资源的下载与解析,不包括ajax
normal 要等待整个dom树加载完成,即DOMContentLoaded这个事件完成,仅对html的内容进行下载解析
none html下载完成之后,不等待解析完成,selenium会直接返回

上面的代码用了最后一种解析方式——none,不作等待,直接返回,然后在后面的代码中可以用 explicit_wait 或者 implicit_wait 等方式来对特定元素进行等待捕捉,具体使用可以参考官方文档,这里不做详细描述。

发布了20 篇原创文章 · 获赞 15 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_42059060/article/details/104522742