显式等待是什么
Selenium 显式等待用 WebDriverWait 加 expected_conditions(EC)对「元素出现、可点击、文本变化」等具体条件轮询,直到条件成立或超时抛异常。相比固定 sleep,它在页面就绪时立即继续,在超时时给出等待条件与时长。适用于 Selenium 4 的 Python/Java 绑定;核心 API 为 WebDriverWait(driver, timeout, poll_frequency).until(条件)。
基本信息
| 适用平台 | Selenium 4(Python / Java 同名 API) |
|---|---|
| 关键类 | WebDriverWait、expected_conditions(EC) |
| 常用条件 | presence_of_element_located、element_to_be_clickable、visibility_of_element_located |
| 超时异常 | selenium.common.exceptions.TimeoutException |
典型使用场景
- 点击前等待按钮可交互:Ajax 渲染完成后元素才可点击
- 提交表单后等待结果提示或跳转:以文本或 URL 条件收口
- 等待列表数据加载:等目标行可见再断言字段
- 等待遮罩消失:until_not 配合 invisibility_of_element_located
- 等待异步 toast 出现再抓取文本,避免时序竞态
等待示例
等待示例
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
wait = WebDriverWait(driver, 10) # 默认每 0.5 秒轮询一次
cond = EC.element_to_be_clickable((By.ID, "submit")) # 条件单独成对象,便于报错时输出
try:
wait.until(cond).click()
wait.until(EC.text_to_be_present_in_element((By.ID, "msg"), "成功"))
except TimeoutException:
raise AssertionError("点击提交后未出现成功提示:等待条件=" + repr(cond))常用等待条件
| 条件 | 判定 | 使用时机 |
|---|---|---|
| presence_of_element_located | 元素出现在 DOM(未必可见) | 只需存在的隐藏字段 |
| visibility_of_element_located | 可见且尺寸大于零 | 抓取文本与数值 |
| element_to_be_clickable | 可见且处于可交互状态 | 点击动作前的标准等待 |
| invisibility_of_element_located | 不可见或已从 DOM 移除 | 等待加载遮罩消失 |
| text_to_be_present_in_element | 指定元素文本包含目标串 | 等待异步结果文本 |
超时值按业务响应上限设置:过大拖慢失败用例,过小在数据波动下造成假失败;轮询间隔默认 0.5 秒一般无需调整。
Selenium 官方文档提示:隐式等待与显式等待混用会让等待时长不可预测,二者应选其一,统一使用显式等待便于定位。
Java 绑定可用 FluentWait 自定义轮询间隔与忽略的异常类型;Python 侧 WebDriverWait 同样支持自定义 poll_frequency 与 ignored_exceptions,例如忽略查找瞬间的找不到元素异常。