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()

固定等待可以自定义等待时间,但是在网络条件比较好时,还按固定时间执行,会导致项目运行时间过长,比较不友好,项目中不推荐用。但是调试的时候可以用,比较方便。

使用方法:

  1. from time import sleep
  2. from selenium import webdriver
  3. class TestCase(object):
  4. def __init__(self):
  5. self.driver = webdriver.Chrome()
  6. self.driver.maximize_window()
  7. self.driver.get('https://www.baidu.com')
  8. def sleep_test(self):
  9. # 输入搜索内容
  10. self.driver.find_element_by_id('kw').send_keys('selenium')
  11. # 固定等待2s
  12. sleep(2)
  13. # 点击百度一下
  14. self.driver.find_element_by_id('su').click()
  15. # 固定等待3s
  16. sleep(3)
  17. # 关闭浏览器
  18. self.driver.quit()
  19. if __name__ == '__main__':
  20. case = TestCase()
  21. case.sleep_test()

运行过程:
241.gif

7.3 隐式等待 implicitly_wait()

隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成则执行下一步,否则一直等到时间结束,然后执行下一步。这样的隐式等待会有个坑,我们都知道Javascript一般都是在我们的body的最后进行加载,实际这时页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。

隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。

使用方法:

  1. from selenium import webdriver
  2. class TestCase(object):
  3. def __init__(self):
  4. self.driver = webdriver.Chrome()
  5. self.driver.maximize_window()
  6. self.driver.get('https://www.baidu.com')
  7. def test_implicitly(self):
  8. # 隐式等待设置为10s
  9. self.driver.implicitly_wait(10)
  10. self.driver.find_element_by_id('kw').send_keys('selenium')
  11. self.driver.find_element_by_id('su').click()
  12. self.driver.quit()
  13. if __name__ == '__main__':
  14. case = TestCase()
  15. case.test_implicitly()

运行过程:
242.gif

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 忽略的异常

image.png

(3) WebDriverWait模块的两种方法

WebDriverWait模块的两种方法分别是 until 和 until_not,两个方法的参数说明如下:

参数 参数说明
method 在等待期间,每隔一段时间调用这个传入的方法,知道返回值不是False
message 如果超时,抛出TimeoutException,将message传入异常

image.png
image.png

代码:

  1. from selenium import webdriver
  2. from selenium.webdriver.support import expected_conditions as EC
  3. from selenium.webdriver.support.wait import WebDriverWait
  4. class TestCase(object):
  5. def __init__(self):
  6. self.driver = webdriver.Chrome()
  7. self.driver.maximize_window()
  8. self.driver.get('https://www.baidu.com')
  9. def test_web_driver_wait(self):
  10. # 设置显式等待最长时间
  11. wait = WebDriverWait(self.driver, 2)
  12. # 直到页面加载完,页面标题显示了,再执行下一步
  13. wait.until(EC.title_is('百度一下,你就知道'))
  14. self.driver.find_element_by_id('kw').send_keys('selenium')
  15. self.driver.find_element_by_id('su').click()
  16. self.driver.quit()
  17. if __name__ == '__main__':
  18. case = TestCase()
  19. case.test_web_driver_wait()

运行过程:
243.gif