Webdriver的三大等待
当浏览器在加载页面时,网络不好、设备的性能差导致与服务器进行数据交互慢或者页面渲染需要时间久等等,这些原因均会导致页面的元素不是同时被加载完成的,所以元素定位可能会因为ElementNotVisibleException而定位不到,就会降低我们自动化测试脚本的稳定性;故可通过设置元素等待来改善这种情况。
以下几种情况是需要等待的
1、网络不好,服
Webdriver的三大等待
显式等待
隐式等待
强制等待
1、显式等待
显式等待是WebDriver等待某个条件成立则继续执行,否则在达到最大时长时抛出异常(TimeoutException)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('http://www.baidu.com)
ele = WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located((By.ID, 'kw')))
ele.send_keys('selenium')
driver.quit()
WebDriverWait类是有Webdriver提供的等待方法,在设置的时间内,默认每隔一段时间检查一次当前页面元素是否可见,如果超出设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5 S
ignored_exceptions=None:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。
until(method,message=‘’),调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method,message=‘’),调用该方法提供的驱动程序作为一个参数,直到返回值为False
2、隐式等待
隐式等待是通过等待一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素还没加载完成,则抛出NoSuchElementException异常。WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0.
from selenium import webdriver
from selenium.common.exceptions import
NoSuchElementException
driver = webdriver.Chrome()
# 设置隐式等待为10s
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
try:
driver.find_element_by_id('kw1').send_keys('test')
except NoSuchElementException as e:
print(e)
finally:
print('no exception')
driver.quit()
implicitly_wait()默认参数的单位为秒,而且这时间并非是一个固定的等待时间,不影响脚本的执行速度;其次,它也并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,若定位到则继续运行脚本,若定位不到,则它以轮询的方式不断地判断元素是否被定位到。
3、强制等待
当运行脚本希望在某一个位置时做固定的等待(休眠),就可以使用time.sleep()方法。
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(5)
ele = driver.find_element_by_id('kw')
ele.click()
如上脚本所示,当运行到sleep()方法时会休眠5S,然后继续执行。sleep()默认参数的单位为秒,若设置时长小于1s,则可以用小数点表示,如:sleep(0.5)