8.1 Selenium等待条件
| 方法 | 方法描述 | 返回类型 |
|---|---|---|
| title_is | 判断title,是否出现 | 布尔 |
| title_contains | 判断title,是否包含某些字符 | 布尔 |
| presence_of_element_located | 判断某个元素是否被加到dom树里,并不代表该元素一定可见 | WebElement |
| url_contains | 判断当前url是否包含某个url | 布尔 |
| url_matches | 判断当前url是否符合某种格式 | |
| url_to_be | 判断当前url是否出现 | |
| url_changes | 判断当前url是否已经发生了变化 | |
| visibility_of_element_located | 判断某个元素是否被添加到了dom树里,并且可见,宽和高都大于0 | WebElement |
| visibility_of | 判断元素是否可见,如果可见就返回这个元素 | WebElement |
| presence_of_all_elements_located | 判断是否至少有1个元素存在于dom树中 | 列表 |
| visibility_of_any_elements_located | 判断是否至少有1个元素在页面中可见 | 列表 |
| text_to_be_present_in_element | 判断指定的元素中是否包含了预期的字符串 | 布尔 |
| text_to_be_present_in_element_value | 判断指定的元素的属性值中是否包含了预期的字符串 | 布尔 |
| frame_to_be_available_and_switch_to_it | 判断该frame是否可以switch进去 | 布尔 |
| invisibility_of_element_located | 判断某个元素是否存在于dom或不可见 | 布尔 |
| element_to_be_clickable | 判断某个元素是否可见并且是enable的,代表可点击 | 布尔 |
| staleness_of | 等待某个元素从dom树中移除 | 布尔 |
| element_to_be_selected | 判断某个元素是否被选中了,一般用在下拉列表 | 布尔 |
| element_selection_state_to_be | 判断某个元素的选中状态是否符合语气 | 布尔 |
| element_located_selection_state_to_be | 判断某个元素的选中状态是否符合语气 | 布尔 |
| alert_is_present | 判断页面上是否存在alert | 布尔 |
7.2 固定等待 time.sleep()
固定等待可以自定义等待时间,但是在网络条件比较好时,还按固定时间执行,会导致项目运行时间过长,比较不友好,项目中不推荐用。但是调试的时候可以用,比较方便。
使用方法:
from time import sleepfrom selenium import webdriverclass 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')# 固定等待2ssleep(2)# 点击百度一下self.driver.find_element_by_id('su').click()# 固定等待3ssleep(3)# 关闭浏览器self.driver.quit()if __name__ == '__main__':case = TestCase()case.sleep_test()
7.3 隐式等待 implicitly_wait()
隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成则执行下一步,否则一直等到时间结束,然后执行下一步。这样的隐式等待会有个坑,我们都知道Javascript一般都是在我们的body的最后进行加载,实际这时页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。
隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。
使用方法:
from selenium import webdriverclass TestCase(object):def __init__(self):self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.get('https://www.baidu.com')def test_implicitly(self):# 隐式等待设置为10sself.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 webdriverfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitclass 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)# 直到页面加载完,页面标题显示了,再执行下一步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()
运行过程:
