在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果不做任何处理的话,代码会由于没有找到元素而报错,另外,一种情况就是页面使用ajax异步加载机制。这时我们就要用到wait,而在Selenium中,我们可以用到三种等待,每一种等待都有自己的优点或缺点。
第一种:time.sleep(固定等待)
在开发自动化框架过程中,最忌讳使用python自带模块的time的sleep方式进行等待,虽然可以自定义等待时间,但当网络条件良好时,依旧按照预设定的时间继续等待,导致整个项目的自动化时间无限延长,不建议使用 (注:脚本调试过程时,还是可以使用的,方便快捷)
第二种:implicitly_wait(隐式等待)
第三种:WebDriverWait(显式等待)
- WebDriverWait是Selenium提供得显示等待模块引入路径:
- from selenium.webdriver.support.wait import WebDriverWait
参数 | 说明 |
---|
driver | 传人WebDriver实例 | timeout | 超时时间,等待的最长时间 | poll_frequency | 调用until或until_not中的方法的间隔时间,默认是0.5秒 | ignored_exceptions | 忽略的异常 |
- 这个模块中,一共有两种方法 until与until_not
参数 | 说明 |
---|
method | 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是false | message | 如果超时,抛出timeoutException,将message传入异常 |
from telnetlib import EC
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
def test_sleep(self):
self.driver.maximize_window()
self.driver.find_element_by_id('kw').send_keys('selenium')
sleep(2)
self.driver.find_element_by_id('su').click()
sleep(3)
self.driver.quit()
def test_implicitly(self):
self.driver.implicitly_wait(10)
self.driver.maximize_window()
self.driver.find_element_by_id('kw').send_keys('selenium')
self.driver.find_element_by_id('su').click()
self.driver.quit()
def test_wait(self):
wait = WebDriverWait(self.driver,5)
wait.until(EC.title_is('百度一下,你就知道'))
self.driver.maximize_window()
self.driver.find_element_by_id('kw').send_keys('selenium')
self.driver.find_element_by_id('su').click()
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_wait()
|