Selenium 页面加载慢

Selenium 页面加载慢

问题描述

使用Selenium进行QQ空间的模拟登陆时,发现webdriver.get方法会阻塞直到网页全部加载完成,官方提供的三种wait方法仅对网页的ajax有比较明显的效果。对于登陆QQ空间来说,网页中所需要的元素很快就能加载完成,但是整个页面加载完成却需要很久,所以如何才能使得网页在加载完所需要元素后即停止是本文所需要解决的问题。

问题解决

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

  1. normal

    即正常情况下,selenium会等待整个界面加载完成(指对html和子资源的下载与解析,不包括ajax

  2. eager

    要等待整个dom树加载完成,即DOMContentLoaded这个事件完成,仅对html的内容进行下载解析

  3. none

    html下载完成之后,不等待解析完成,selenium会直接返回

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

driver.set_page_load_timeout()实测不通,望解疑

按照网上查来的说法,这个方法的思路是通过设置网页加载超时,然后在try-catch的过程中进行处理,我按照这个思路进行了代码的编写,但是发现在try-except之后的driver总是提示为timeout,已经失去了对driver的可操作性,下面是我的部分代码

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


driver = webdriver.Chrome('browsers/chromedriver.exe')
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)

try:
    driver.get('http://qzone.qq.com/')
except TimeoutException:
    driver.execute_script("window.stop();")  # 调用js脚本使浏览器停止加载

wait = WebDriverWait(driver, 5)
frame = wait.until(
    EC.presence_of_element_located(
        (By.XPATH, '//*[@id="login_frame"]')
    )
)  # 卡在这直到timeout
driver.switch_to.frame(frame)

wait.until(
    EC.element_to_be_clickable(
        (By.XPATH, '//*[@id="login_frame"]')
    )
).click()  # 讲道理这一步走完了应该到登陆界面
# some code to work.

小结

上述即我在问题解决中碰到的一些小问题及解决方案,其实除了文中提到的以外,还有开辟线程对程序进行监控,然后超时发送js脚本来停止网页加载等方法,这里不作详细描述。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页