selenium中使用三种时间等待方式:强制等待、隐式等待、显示等待
正文:
- 强制等待
- 隐式等待
- 显示等待
强制等待
from time import sleep from selenium import webdriver driver = webdriver.Chrome("../resources/chromedriver.exe") 20) # 访问网址 driver.get("http://www.baidu.com") # ===强制等待3秒才执行下一步=== sleep(3) # 找到搜索框 inputElement = driver.find_element_by_id("kw")
隐式等待
implicitly_wait()的参数是时间,单位为秒,设置的等待时间为 10s时将每间隔0.5s以轮询的方式不断地判断元素是否存在。
假设在第 6s 定位到了元素,则继续执行, 若直到超出设置时间(20s)还没有定位到元素,则抛出异常
from selenium import webdriver # 加载驱动 driver = webdriver.Chrome("../resources/chromedriver.exe") # ===隐性等待20s=== driver.implicitly_wait(20) # 访问网址 driver.get("http://www.baidu.com") # 找到搜索框 inputElement = driver.find_element_by_id("kw")
显式等待
显式等待是 WebDriver 等待某个条件成立则继续执行,否则在达到最大时长时抛出超 时异常(TimeoutException)
from selenium import webdriver from selenium.webdriver.common.by import By
# 需要导入WebDriverWait方法 from selenium.webdriver.support.ui import WebDriverWait
# 通过 as 关键字将 expected_conditions 重命名为 EC
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome() driver.get("http://www.baidu.com")
# 调用visibility_of_ element_located()方法判断元素是否存在 element = WebDriverWait(driver, 5, 0.5).until( EC.visibility_of_element_located((By.ID, "kw"))
)
element.send_keys('selenium')
driver.quit()
在设置时间内,默认每隔一段时间检 测一次当前页面元素是否存在,如果超过设置时间仍检测不到,则抛出异常。
格式如下:
webDriverwait(driver实例,超时时长,调用频率,忽略的异常).until(要调用的 方法,超时时返回的信息)
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
- driver:浏览器驱动。
- timeout:最长超时时间,默认以秒为单位。
- poll_frequency:检测的间隔(步长)时间,默认为 0.5s。
- ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException 异常
WebDriverWait()一般与 until()或 until_not()方法配合使用
until(method, message=″) # 调用该方法提供的驱动程序作为一个参数,直到返回值为 True until_not(method, message=″) # 调用该方法提供的驱动程序作为一个参数,直到返回值为 False
expected_conditions 类提供的预期条件判断方法如表 4-2 所示
两个官方示例
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id("someId").is_displayed())
使用显示等待封装Xpath定位方法:
def base_find_ele(self,x_path,timeout=5,poll_frequency=0.5,):
return WebDriverWait(self.driver,timeout=timeout,poll_frequency=poll_frequency).\
until(lambda x:x.find_element(By.XPATH,x_path))
参考学习:
Selenium3自动化测试实战——虫师