一、问题现象
使用selenium测试中发现,页面元素已经加载出来可以进行操作,但是浏览器地址栏旁边还是一直在转圈,后面的代码也一直无法往下执行。
二、问题原因
selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的,所以在页面未完成加载前,代码会一直等待页面加载不继续执行。
三、解决方式
1、设置WebDriver的页面加载时间(set_page_load_timeout)
set_page_load_timeout(time) 方法可以设置页面的加载超时时间,在页面加载超出设置时间时会报错,Timed out receiving message from renderer: time
我们可以使用try…except 和 Javascript 的 window.stop() 方法结合使用,在超时后强制停止页面加载,继续执行之后的操作。
import time
from selenium import webdriver
start = time.time()
driver = webdriver.Chrome()
# 设置页面加载时间
driver.set_page_load_timeout(5)
try:
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
except:
# 超时后执行Javascript停止页面加载
driver.execute_script('window.stop()')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>6.229357481002808
* 设置页面加载时间的方式只适用于使用 get() 方式打开网页,如果是通过操作进行跳转的页面不适用
2、修改 WebDriver 的页面加载策略(page_load_strategy)
WebDriver在加载页面时,根据默认的加载策略,是把get地址的页面及所有静态资源都下载完。
除了默认的策略,还可以选择eager和none两种策略,根据实际情况调整页面加载策略缩短等待时间,提高执行速度。
- normal(默认):等待整个页面加载完成,包括文件、css、js等等
- eager:等待整个dom树加载完成,即DOMContentLoaded事件完成,也就是只要html完全加载和解析完成。放弃等待图片、样式、子框架的加载。
- none:等待html下载完成,哪怕还没开始解析。
1)页面加载策略为normal
import time
from selenium import webdriver
start = time.time()
# 默认加载策略为normal,可以不进行设置
driver = webdriver.Chrome()
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>22.998253345489502
2)页面加载策略为eager
import time
from selenium import webdriver
start = time.time()
options = webdriver.ChromeOptions()
# 设置加载策略为eager
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>1.859546184539795
3)页面加载策略为none
import time
from selenium import webdriver
start = time.time()
options = webdriver.ChromeOptions()
# 设置加载策略为none
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>1.1394140720367432
* 修改页面加载策略的方式时可以配合显示等待,避免所需元素非可交互的状态时,就过早的进行之后的操作,导致产生报错