Selenium_等待界面元素
为什么需要?
通常情况下,代码执行的速度比服务器响应的速度快。服务器还没有来得及返回搜索结果,代码就执行了,当代码没得到返回的搜索结果时,就可能会出现报错。
解决方法
官网地址:selenium.dev/documentation/en/webdriver/waits/
sleep()
:强制等待
线程休眠
缺点:设置时间短,服务器可能未响应,仍旧报错。设置时间长,造成时间浪费,程序执行时间变长。
# 导入sleep模块
from time import sleep
# 等待1秒
sleep(1)
# 1秒后就可以搜索页面中的元素了
implicitly_wait()
:隐式等待
设置全局的超时时间,此时每一条选择元素语句都有超时时间,超时响应则报错。
缺点:当页面未完全加载完,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成,才会执行下一句。某些情况下会影响脚本执行速度。
# 导入webdriver模块
from selenium import webdriver
webdriver.Chrome().implicitly_wait(10)
WebDriverWait
:显示等待
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
:
driver:浏览器驱动 timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5S
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait()一般由until()或 until_not()方法配合使用
until(method, message='')
:调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method, message='')
:调用该方法提供的驱动程序作为一个参数,直到返回值为False
https://www.jianshu.com/p/b8e0300415b9
注:selenium.webdriver.support.wait 和 selenium.webdriver.support.ui都是用来做显式等待的,二者没有区别。
方法一:
from selenium import webdriver
# 导入WebDriverWait模块
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
element = WebDriverWait(driver, 5, 0.5)
方法二:
from selenium import webdriver
# 导入ui模块
import selenium.webdriver.support.ui as ui
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
wait = ui.WebDriverWait(driver, 10) # 10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。