selenium_三大等待
1. 强制等待 sleep()
导入
from time import sleep
语法
sleep(2) # 代码暂停,固定等待2秒
原理
单纯暂停Python代码执行,和浏览器页面加载无关。不管页面是否加载完成,必须等够设定时长才继续执行。
✅ 优点
- 写法最简单,调试脚本临时使用很方便。
❌ 缺点
- 死等:页面1秒加载完成,也要等待满时间;页面加载慢于设置时间,直接报错。
- 脚本运行效率低,稳定性差。
- 正式自动化项目禁止大量使用。
使用场景
临时调试脚本;少量不稳定场景临时兜底。
2. 隐式等待 implicitly_wait()
语法
driver.implicitly_wait(5) # 设置全局最长等待5秒
原理
设置一次,整个driver生命周期全局生效。
调用find_element() / find_elements()查找元素时:
- 元素立刻找到,直接执行,不等待;
- 找不到元素,会循环查找,最多等待设置的时间;
- 超时仍然找不到元素,抛出
NoSuchElementException。
✅ 优点
- 只需要写一行,全局生效,代码简洁。
❌ 缺点
- 仅能等待DOM元素,无法等待alert弹窗、iframe、元素可见、元素可点击。
- 只能判断元素存在于DOM树,不能判断元素是否可见、是否被遮挡。
⚠️ 重点:隐式等待对原生alert/confirm/prompt弹窗无效!
使用场景
小型简单脚本,不推荐大型项目使用。
3. 显式等待 WebDriverWait + expected_conditions(EC)【企业项目首选】
导入
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
基础语法
# 参数1:浏览器driver对象;参数2:最大等待时长(秒)
wait = WebDriverWait(driver, 10)
# until:直到条件满足,返回元素;超时抛出TimeoutException
element = wait.until(EC.element_to_be_clickable((By.ID, "loginBtn")))
element.click()
⚠️ EC里面的定位器必须是元组格式
(By.ID, "值"),缺少括号会报错!
常用EC预期条件(高频)
| EC条件 | 作用 |
|---|---|
| EC.element_to_be_clickable((By.ID, "btn")) | 等待元素可点击(元素存在、可见、无遮挡,按钮首选) |
| EC.presence_of_element_located((By.ID, "xxx")) | 等待元素DOM存在页面中,不一定可见 |
| EC.visibility_of_element_located((By.ID, "xxx")) | 等待元素可见(输入框常用) |
| EC.alert_is_present() | 等待原生alert弹窗出现(隐式等待无法实现) |
| EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe")) | 等待iframe就绪,并且自动切换进入iframe |
✅ 优点
- 局部针对性等待,满足条件立刻执行,节省运行时间。
- 支持弹窗、iframe、元素可见、可点击等复杂场景。
- 稳定性最好,企业UI自动化项目标准方案。
❌ 缺点
代码量相比另外两种更多,每个需要等待的地方单独编写。
使用场景
正式自动化测试项目,优先使用显式等待。
4. 三大等待对比总表
| 等待类型 | 代码写法 | 生效范围 | 能够等待的对象 | 缺点 |
|---|---|---|---|---|
| 强制等待 | sleep(n) | 单行代码 | Python代码暂停,和浏览器无关 | 固定死等,不稳定,执行慢 |
| 隐式等待 | driver.implicitly_wait(n) | 全局,一次设置全程生效 | 仅DOM元素(find_element查找) | 不能等弹窗、iframe;只能判断DOM存在 |
| 显式等待 | WebDriverWait + EC | 局部,仅当前一行生效 | 元素可点击、可见、alert弹窗、iframe等 | 代码编写稍繁琐 |
5. 初学者高频坑点总结
- 隐式等待 和 显式等待不要混用,会出现不可预期的等待超时bug。
implicitly_wait不能等待alert弹窗,弹窗只能使用显式等待EC.alert_is_present()。- sleep仅用于调试,正式测试用例尽量全部替换为显式等待。
- EC.until() 的定位器一定要写元组
(By.XPATH, "//button"),漏括号直接报错。 - 隐式等待只对
find_element生效,对元素点击、输入等操作没有等待效果。
6. 面试简答背诵版
- sleep强制等待:固定时长死等,效率低,只调试用。
- 隐式等待:全局生效,只等待DOM元素出现,不能等弹窗、iframe。
- 显式等待:局部条件等待,可以等待元素可点击、弹窗、iframe,稳定性最强,项目首选。
一句话口诀:sleep死等;隐式全局等DOM;显式条件判断,全能稳定。

浙公网安备 33010602011771号