Selenium请求过快 解决方法

 等待界面元素出现

在进行网页操作的时候,有的元素内容不是可以理解出现的,可能会等待一段时间,比如

百度搜索一个词语,点击搜索后,浏览器需要把这个搜索请求发送给百度服务器,百度服务

器处理后,再把搜索结果返回

所以,从点击搜索到得到结果,需要一定的时间

只是通常百度服务器的处理比较快,感觉是立即出现了搜索结果。

百度搜索的每个结果对应界面元素其ID分别是数字1,2,3,4.....

如下:

 

 

 过快请求实例:

from selenium import webdriver  # 导包
import time
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get('https://www.baidu.com')

ele = borwser.find_element_by_id('kw')
ele.send_keys('老祝头博客园')
cl = borwser.find_element_by_id('su').click()

eles = borwser.find_element_by_id('1')
print(eles.text)

 运行会抛出如下异常:

 

 在短暂的瞬间,网页上是没有id为1的元素的(因为还没搜索到结果)自然会报错id为1的元素不存在

如果用 sleep等待几秒钟,等百度服务返回结果后再去选择元素,那样会浪费大量时间

 

Selenium提供了一个更合理的解决方案:

当发现元素没有找到的时候,并不立即返回找不到元素的错误。

而是周期性(每隔半秒)重新查找该元素,直到找到该元素

或者超出指定最大等待时间,才抛出异常,(若是find_elements 方法,则返回空列表)

 Selenium 的 Webdrive 对象有一个方法: implictly_wait(隐式等待)

该方法接收一个参数用来指定最大等待时间。

实例代码:

borwser.implicitly_wait(10)

后续的 find_element 等方法的调用都会采用上面的策略;

此方法会偷偷的设置等待时间 每隔半秒再找元素 最大上限为10秒

实例代码:

from selenium import webdriver  # 导包
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get('https://www.baidu.com')
# 隐式等待 每隔半秒请求
borwser.implicitly_wait(10)

ele = borwser.find_element_by_id('kw')
ele.send_keys('老祝头博客园')
cl = borwser.find_element_by_id('su').click()

eles = borwser.find_element_by_id('1')
print(eles.text)
posted @ 2020-06-22 22:10  老祝头  阅读(1021)  评论(0编辑  收藏  举报