由于脚本运行速度过快,页面上有些元素未刷新出来,导致定位元素失败。为解决这一问题,我们需要在脚本中加入元素等待。webdriver提供了两种等待方式:显式等待和隐身等待。另外还有一种sleep休眠法。
1.显示等待
显示等待是webdriver等待某个条件成立时继续执行,否则在达到最大时长的时候抛出TimeoutException
使用前需要导入相应的包:
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait类由webdriver提供的等待方法,在设置的时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超出设置的时间为检测出元素,则抛出异常。
语法:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver:浏览器驱动
timeout:超时时间,单位为秒
poll_frequency:检测的间隔时间,默认为0.5s
ignored_exceptions:超时后抛得异常,默认情况下抛NoSuchElementException.
WebDriverWait()一般由until()或until_not()配合使用。未完待续
2.隐式等待
隐式等待是通过一定时长来等待页面上某个元素的加载,webdriver提供了implicitly_wait()方法来实现隐式等待,默认为0.超时抛出NoSuchElementException.
语法:driver.implicitly_wait(),时间为秒。假设等待时间为8秒,这8秒不是一个固定时间,不会影响脚本的执行效率,它不针对页面上的某个元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位到,则继续执行,如果定位不到,则会轮询进行定位,假设在3秒时,元素定位到,则继续执行。如果超过8秒,则抛出异常。
3.sleep休眠法
使用sleep()方法时需要先导入该方法。该方法是一个固定时间等待的方法,脚本会固定停止一段时间,然后再继续执行
from time import sleep
语法:sleep(),单位为秒