学习目标
- 能够使用隐式等待来定位元素
- 能够使用显式等待来定位元素
一、元素等待
应用场景
可能由于一些原因,我们想找的元素并没有立刻出来,此时如果直接定位可能会报错,比如以下原因:
- 由于网络速度原因
- 服务器处理请求原因
- 电脑配置原因
概念
WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程
元素等待一共分为两种类型
- 显式等待
- 隐式等待
1.1 隐式等待
应用场景
针对所有定位元素的超时时间设置为同一个值的时候
概念
等待元素加载指定的时长,超出时长抛出NoSuchElementException异常
步骤
- 在获取 driver 对象后,使用 driver 调用 implicitly_wait 方法即可
示例
在 5 秒钟内,在《设置》程序中的 ”返回“ 按钮,如果找到则点击。如果找不到则观察对应错误信息。
核心代码
from selenium.webdriver.support.wait import WebDriverWait
# -----
# 启动应用参数
# -----
driver.implicitly_wait(5)
search_button = driver.find_element_by_xpath("//*[contains(@content-desc,'收
起')]")
search_button.click()
方法参数解释
# 参数:
# timeout:超时的时长,单位:秒
implicitly_wait(timeout)
1.2 显式等待
应用场景
针对所有定位元素的超时时间设置为不同的值的时候
概念
等待元素加载指定的时长,超出时长抛出TimeoutException异常
步骤
- 导包
- 创建 WebDriverWait 对象
- 调用 WebDriverWait 对象的 until 方法
示例
在 5 秒钟内,每 1 秒在《设置》程序中的 ”返回“ 按钮,如果找到则点击。如果找不到则观察对应错误信息。
核心代码
from selenium.webdriver.support.wait import WebDriverWait
# -----
# 启动应用参数
# -----
# 创建WebDriverWait对象
wait = WebDriverWait(driver, 5, poll_frequency=1)
# 获取元素并设置超时时间和频率
search_button = wait.until(lambda x: x.find_element_by_xpath("//*
[contains(@content-desc,'收起')]"))
# 点击搜索按钮
search_button.click()
方法参数解释
# 参数:
# driver:驱动对象
# timeout:超时的时长,单位:秒
# poll_frequency:检测间隔时间,默认为0.5秒
# 返回值:
# WebDriverWait对象
WebDriverWait(driver, timeout, poll_frequency=0.5)
# 参数:
# method:lambda查找元素表达式
# 返回值:
# 定位到的元素,如果没有定位到会抛出TimeoutException异常
wait.until(method)
二. 隐式等待和显式等待的选择
作用域:
- 显式等待为单个元素有效,隐式为全局元素
方法:
- 显式等待方法封装在 WebDriverWait 类中,而隐式等待则直接通过 driver 实例化对象调用
关于 sleep 的形式?
- sleep 是固定死一个时间,不是不行,是不推荐。
- 元素等待可以让元素出来的第一时间进行操作。sleep 可能造成不必要的浪费。