7.1 Selenium三种等待方式
方法/属性 | 方法/属性描述 |
---|---|
time.sleep() | 固定等待 |
implicitly_wait() | 隐式等待 |
WebDriverWait() | 显式等待 |
7.2 固定等待 time.sleep()
固定等待可以自定义等待时间,但是在网络条件比较好时,还按固定时间执行,会导致项目运行时间过长,比较不友好,项目中不推荐用。但是调试的时候可以用,比较方便。
使用方法:
from time import sleep
from selenium import webdriver
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://www.baidu.com')
def sleep_test(self):
# 输入搜索内容
self.driver.find_element_by_id('kw').send_keys('selenium')
# 固定等待2s
sleep(2)
# 点击百度一下
self.driver.find_element_by_id('su').click()
# 固定等待3s
sleep(3)
# 关闭浏览器
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.sleep_test()
7.3 隐式等待 implicitly_wait()
隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成则执行下一步,否则一直等到时间结束,然后执行下一步。这样的隐式等待会有个坑,我们都知道Javascript一般都是在我们的body的最后进行加载,实际这时页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。
隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。
使用方法:
from selenium import webdriver
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://www.baidu.com')
def test_implicitly(self):
# 隐式等待设置为10s
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()
if __name__ == '__main__':
case = TestCase()
case.test_implicitly()
7.4 显式等待 WebDriverWait()
(1) 引入路径
from selenium.webdriver.support.wait import WebDriverWait
(2) WebDriverWait() 参数说明
参数 | 参数说明 |
---|---|
driver | 传入WebDriver实例 |
timeout | 超时时间,最长等待时间 |
poll_frequency | 调用until或until_not中的方法的间隔时间,默认是0.5s |
ignored_exceptions | 忽略的异常 |
(3) WebDriverWait模块的两种方法
WebDriverWait模块的两种方法分别是 until 和 until_not,两个方法的参数说明如下:
参数 | 参数说明 |
---|---|
method | 在等待期间,每隔一段时间调用这个传入的方法,知道返回值不是False |
message | 如果超时,抛出TimeoutException,将message传入异常 |
代码:
from selenium import webdriver
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.maximize_window()
self.driver.get('https://www.baidu.com')
def test_web_driver_wait(self):
# 设置显式等待最长时间
wait = WebDriverWait(self.driver, 2)
# 直到页面加载完,页面标题显示了,再执行下一步。expected_conditions是期望等待条件模块,下一个章节会详细讲。
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_web_driver_wait()
运行过程: