等待时间,在实际过程中有这样的场景,如果同学们原来接触过UFC或者QTB,就会遇到这样的场景,要等待一个元素加载完毕之后,再进行后面的操作。
在Selenium中,也有类似的等待。为什么要等待呢,因为部分页面的资源较多,当浏览器加载页面时,页面上的元素,并不会同时加载,这时候,如果你快速地想去定位这个元素,可能会报错,所以在学习QTB也好,FTB或者Selenium也好,面临最大的问题是什么?对象的识别和元素的定位。
元素定位过程中,Selenium提供了这样的方法,有两种类型,分别是显示等待和隐式等待:
显示等待也就是WebDriverWait类实现,使WebDriver等待某个条件成立时继续执行,否则在达到最大时限之后抛出超时异常。
隐式等待(implicitly_wait),就是等待页面上元素加载完成,超时元素仍然为被加载,则抛出NoSuchElementException。
显示等待
显示等待在webdriver的common包和support.ui包中实现:
selenium.webdriver.common.by.By
selenium.webdriver.support.ui.WebDriverWait
selenium.webdriver.support.expected_conditions
来看具体的WebDriverWait实例如何创建:
# 创建WebDriverWait实例
# driver: 浏览器驱动
# Timeout: 最大超时,默认以秒为单位
# Poll_frequency: 检测时间间隔,默认为0.5s
# Ignored_exceptions: 超时后的异常信息,默认情况抛出NoSuchElementException
# WebDriverWait一般要与until、until_not()方法配合使用
webDriverWait = WebDriverWait(driver, Timeout, Poll_frequency)
WebDriverWait一般要与until、until_not结合使用,用于等待或者不等待某个元素的出现,如果元素等到了,就返回该元素,否则就抛出异常,可以通过try方法来捕获。
看一个实例代码:
如上代码,间隔0.5s检查时间,总共5s的等待时间,寻找ID为kww的元素。很明显,百度搜索页面没有这个元素。以上代码将运行5s,看结果:
正如预期,打开百度搜索页面,5s后报错,Excetion为TimeoutException表示超时异常了。