问题背景:由于工作原因,需要用到selenium,博主在使用selenium时,经常遇到某些元素加载不出来网址卡慢等麻烦,使用selenium经验不足,如有错误之处,还请多多包涵,欢迎指出。
解决方案一:
设置隐式等待,加载延时报错
implicitly_wait(5) # 隐式等待5s,如果5s钟后还找不到元素或者不能操作元素会报错:no such element
大体意思是如果5s钟后还找不到对应元素或者不能操作对应元素会报错:no such element,但是单单只这样设置可能会存在一个问题,假如某个网站特别卡,有一个元素一直加载不出来的话,浏览器会一直卡住,甚至连quit等操作都会失效(网上解释是上述chrome是阻塞方式启动的),所以设置了一个网页加载时长,最长为10s,于是就有了
set_page_load_timeout(10) # 如果10s钟内,所有元素还未加载完毕,就直接报timeout的错误
# selenium.common.exceptions.TimeoutException: Message: timeout
在设置完隐式等待和加载延时之后看起来天衣无缝,利用隐式等待和加载延时可以元素出现立马操作而且避免了浏览器一直卡住,但我们是否要考虑一种情况呢?
假如我们在登录一个淘宝账号查看快递情况的时候,页面已经显示登录成功,并成功跳转至淘宝主页,但是主页各种图片,小视频等信息飞入,我们用的网络又不够快,导致某些图片、JS迟迟加载不出来,这时候呢,明明是可以进入个人中心查看订单到哪了,可是这位浓眉大眼的chrome兄缺不受webdriver的操控,最惨的事,某些http请求丢失了,页面就一直转下去了,最终我们的程序就直接挂了,一步之遥,却要异常报错,这不是我们想要的,于是就有了今天的重头戏,DesiredCapabilities--pageLoadStrategy,接下来讲讲它的好处以及用法
解决方案二:
设置参数DesiredCapabilities--pageLoadStrategy
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# 注释这两行会导致最后输出结果的延迟,即等待页面加载完成再输出
desired_capabilities = DesiredCapabilities.CHROME # 修改页面加载策略页面加载策略
desired_capabilities["pageLoadStrategy"] = "none" # none表示将browser操作方法改为非阻塞模式,在页面加载过程中也可以给browser发送指令,如获取url,pagesource等资源,get新的url等。
一旦加上了这几行代码,就不用担心浏览器会一直卡在某个地方称为“永不动机”了
特别说明:我不太喜欢每个地方都是用显示等待WebDriverWait+expected_conditions(EC),故使用隐式等待+异步操作,即使页面加载不出来,在隐式等待时间内,该有的操作也会走一遍,如果还走不通,该报错就报错吧
网友评论