在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果不做任何处理的话,代码会由于没有找到元素而报错,另外,一种情况就是页面使用ajax异步加载机制。这时我们就要用到wait,而在Selenium中,我们可以用到三种等待,每一种等待都有自己的优点或缺点。
第一种:time.sleep(固定等待)
在开发自动化框架过程中,最忌讳使用python自带模块的time的sleep方式进行等待,虽然可以自定义等待时间,但当网络条件良好时,依旧按照预设定的时间继续等待,导致整个项目的自动化时间无限延长,不建议使用
(注:脚本调试过程时,还是可以使用的,方便快捷)
第二种:implicitly_wait(隐式等待)
-
隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。这样的隐式等待会有个坑,我们都知道javascript一般都是放在我们的body的最后进行加载,实际这是页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。
-
隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。
第三种: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')
#time.sleep(固定等待)
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()
#implicitly_wait(隐式等待)
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()
#WebDriverWait(显式等待)
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_sleep()
# case.test_implicitly()
case.test_wait()