遇到环境不稳定,网络慢的情况时,如果不做任何处理的话,代码会由于没有找到元素而报错。
还有一种情况就是页面使用ajax异步加载机制。这时我们就要用到wait
在selenium中,我们可以用到一共三种等待。每一种等待都有它的优缺点
1、time.sleep() 固定等待
在开发自动化框架过程中,最忌讳使用python自带模块的time的sleep方式进行等待,虽然可以自定义等待时间,但当网络条件良好时,依旧按照预设定的时间继续等待,导致整个项目的自动化时间无限延长,不建议使用
脚本调试过程中,还是可以使用的,方便快捷
2、implicitly_wait 隐式等待
实际是设置了一个最长等待时间,如在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。
这样的隐式等待有个坑,javascript一般都是放在我们的body的最后进行加载,实际这是页面上的元素都已加载完毕,我们却还在等待全部页面加载结束
隐式等待对整个driver周期都起作用,在最开始设置一次就可以了,不要当做固定等待使用,到哪都来一下隐式等待
3、WebDriverWait 显示等待
WebDriverWait是selenium提供得到显示等待模块引入路径
from selenium.webdriver.support.wait import WebDriverWait
(1)WebDriverWait参数:
driver 传入WebDriver实例
timeout 超时时间,等待的最长时间
poll_frequency 调用util或util_not中的方法的间隔时间,默认是0.5秒
ignored_exceptions 忽略的异常
(2)这个模块中一共有两种方法until和until_not
参数
method 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是false
message 如果超时,抛出TimeoutException,将message传入异常
源码:
from seleniumimport webdriver
from timeimport sleep
import os
from selenium.webdriver.support.waitimport WebDriverWait
from selenium.webdriver.supportimport expected_conditionsas EC
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
def test_sleep(self):
self.driver.find_element_by_id('kw').send_keys('selenium')
sleep(2)#线程阻塞 blocking wait
self.driver.find_element_by_id('su').click()
sleep(3)
self.driver.quit()
def test_implicitly(self):
self.driver.implicitly_wait(10)
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,2)
wait.until(EC.title_is('百度一下,你就知道'))
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()