一、需求背景
1、driver.get(url)方法要根据desired_capabilities的pageLoadStrategy字段的值,确定执行结束的时机:
(1)NONE:html下载完成,不等待解析完成即返回;
(2)EAGER:要等待整个dom树加载完成,即DOMContentLoaded这个事件完成,仅对html的内容进行下载解析;
(3)NORMAL: 等待整个界面加载完成(指对html和子资源的下载与解析,如JS文件,图片等,不包括ajax).
2、需求1:统计某前端页面的性能数据,比如说DNS查找耗时、TCP链接耗时、DOM解析耗时等。统计上述参数,需要页面完全加载解析完,这时需要把desired_capabilities的pageLoadStrategy字段设置为 normal;
3、需求2:计算某网页视频首帧出现的时间。计算首帧出现时间,需要driver.get(url)方法在页面html加载完就执行结束,因此需要将desired_capabilities的pageLoadStrategy字段设置为 none,如果不设置成none的话,可能会出现页面视频已经开始播放了,但driver.get(url)方法还没执行结束。
二、遇到的问题
(1)错误代码:
通过下述代码,定义pageLoadStrategy属性不同的两个webdriver,结果发现,第一个webdriver的pageLoadStrategy属性一直与第二个webdriver相同。
(2)错误原因:DesiredCapabilities.CHROME为全局变量,如果是浅拷贝,后面对其属性的更改,会覆盖掉前面其属性的设置。
(3)解决办法:深拷贝DesiredCapabilities.CHROME。
#错误的做法
def method1():
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "normal"
driver = webdriver.Chrome(executable_path = r'F:\webdriver\chromedriver.exe', desired_capabilities = desired_capabilities)
driver.get('https://www.baidu.com')
driver.quit()
def method2():
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(executable_path = r'F:\webdriver\chromedriver.exe', desired_capabilities = desired_capabilities)
driver.get('https://www.jianshu.com')
driver.quit()
三、解决办法
定义两个webdriver,且定义desired_capabilities时使用深拷贝。如下:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import copy
def method1():
desired_capabilities = copy.deepcopy(DesiredCapabilities.CHROME)
desired_capabilities["pageLoadStrategy"] = "normal"
driver = webdriver.Chrome(executable_path = r'F:\webdriver\chromedriver.exe', desired_capabilities = desired_capabilities)
driver.get('https://www.baidu.com')
driver.quit()
def method2():
desired_capabilities = copy.deepcopy(DesiredCapabilities.CHROME)
desired_capabilities["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(executable_path = r'F:\webdriver\chromedriver.exe', desired_capabilities = desired_capabilities)
driver.get('https://www.jianshu.com')
driver.quit()
method1()
method2()