1.显示等待
webdriver等待某个条件成立则继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)
webdriver 中提供了WebDriverWait()显示等待方法。
格式为:
# driver:浏览器驱动 # timeout:最长超时时间,默认以秒为单位 # poll_frequency:检测的间隔(步长)时间,默认0.5 # ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常 WebDriverWait(driver, timeout, poll_frequency=0.5,ignore_exceptions = None)
方法 | 说明 |
title_is | 判断当前页面的标题是否等于预期 |
title_contains | 判断当前页面的标题是否包含预期字符串 |
presence_of_element_located | 判断元素是否被加在DOM树里,并不代表该元素一定可见 |
visibility_of_element_located | 判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0) |
visibility_of | 与上个方法作用相同,上个参数为定位,本方法接收的参数为定位后的元素 |
presence_of_all_elements_located |
判断是否至少有一个元素存在于DOM树中。 例如:页面中有n个元素class为“wp”,那么只要有个元素存在于DOM树中就返回True |
text_to_be_available_and_switch_to_it | 判断该表单是否可以切换进去,如果可以,返回True并切换进去,否则返回False |
invisibility_of_element_located | 判断某个元素是否不在DOM树中或不可见 |
element_to_be_clickable | 判断某个元素是否可见并可以点击 |
staleness_of | 等到一个元素从DOM树中移除 |
element_to_be_selected | 判断某个元素是否被选中,一般用在下拉列表中 |
element_selection_state_to_be | 判断某个元素的选中状态是否符合预期 |
element_located_selection_state_to_be | 与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位 |
alert_is_present | 判断呢页面上是否存在alert |
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") # until(method,message=''):直到返回值为True;until_not():直到返回值为False element = WebDriverWait(driver, 5, 0.5).until( EC.visibility_of_element_located((By.ID, "kw")) ) element.send_keys("selenium") driver.quit()
还可以利用is_displayed()实现显示等待
from selenium import webdriver from time import sleep, ctime driver = webdriver.Chrome() driver.get("http://www.baidu.com") print(ctime()) for i in range(10): try: el = driver.find_element_by_id("kw22") # is_displayed():判断元素是否可见 if el.is_displayed(): break except: pass sleep(1) else: print("time out") print(ctime()) driver.quit()
执行结果如下:
Tue Sep 10 14:47:30 2019
time out
Tue Sep 10 14:47:41 2019
2.隐式等待
webdriver中的implicitly_wait()方法可用来实现隐式等待。
from time import ctime from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Firefox() # 设置隐式等待10s # 1.这10s并非固定等待时间,它并不影响脚本的执行速度。 # 2.它会等待页面上的所有元素 # 3.当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,则以轮询的方式不断地判断元素是否存在 driver.implicitly_wait(10) driver.get("http://www.baidu.com") try: print(ctime()) driver.find_element_by_id("kw22").send_keys("selenium") except NoSuchElementException as e: print(e) finally: print(ctime()) driver.quit()
执行结果为:
Tue Sep 10 15:58:03 2019 Message: Unable to locate element: [id="kw22"] Tue Sep 10 15:58:13 2019