selenium_三大等待

1. 强制等待 sleep()

导入

from time import sleep

语法

sleep(2)  # 代码暂停,固定等待2秒

原理

单纯暂停Python代码执行,和浏览器页面加载无关。不管页面是否加载完成,必须等够设定时长才继续执行。

✅ 优点

  • 写法最简单,调试脚本临时使用很方便。

❌ 缺点

  1. 死等:页面1秒加载完成,也要等待满时间;页面加载慢于设置时间,直接报错。
  2. 脚本运行效率低,稳定性差。
  3. 正式自动化项目禁止大量使用。

使用场景

临时调试脚本;少量不稳定场景临时兜底。

2. 隐式等待 implicitly_wait()

语法

driver.implicitly_wait(5)  # 设置全局最长等待5秒

原理

设置一次,整个driver生命周期全局生效。
调用find_element() / find_elements()查找元素时:

  • 元素立刻找到,直接执行,不等待;
  • 找不到元素,会循环查找,最多等待设置的时间;
  • 超时仍然找不到元素,抛出 NoSuchElementException。

✅ 优点

  • 只需要写一行,全局生效,代码简洁。

❌ 缺点

  1. 仅能等待DOM元素,无法等待alert弹窗、iframe、元素可见、元素可点击。
  2. 只能判断元素存在于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

✅ 优点

  1. 局部针对性等待,满足条件立刻执行,节省运行时间。
  2. 支持弹窗、iframe、元素可见、可点击等复杂场景。
  3. 稳定性最好,企业UI自动化项目标准方案。

❌ 缺点
代码量相比另外两种更多,每个需要等待的地方单独编写。

使用场景

正式自动化测试项目,优先使用显式等待。

4. 三大等待对比总表

等待类型 代码写法 生效范围 能够等待的对象 缺点
强制等待 sleep(n) 单行代码 Python代码暂停,和浏览器无关 固定死等,不稳定,执行慢
隐式等待 driver.implicitly_wait(n) 全局,一次设置全程生效 仅DOM元素(find_element查找) 不能等弹窗、iframe;只能判断DOM存在
显式等待 WebDriverWait + EC 局部,仅当前一行生效 元素可点击、可见、alert弹窗、iframe等 代码编写稍繁琐

5. 初学者高频坑点总结

  1. 隐式等待 和 显式等待不要混用,会出现不可预期的等待超时bug。
  2. implicitly_wait 不能等待alert弹窗,弹窗只能使用显式等待 EC.alert_is_present()。
  3. sleep仅用于调试,正式测试用例尽量全部替换为显式等待。
  4. EC.until() 的定位器一定要写元组 (By.XPATH, "//button"),漏括号直接报错。
  5. 隐式等待只对find_element生效,对元素点击、输入等操作没有等待效果。

6. 面试简答背诵版

  1. sleep强制等待:固定时长死等,效率低,只调试用。
  2. 隐式等待:全局生效,只等待DOM元素出现,不能等弹窗、iframe。
  3. 显式等待:局部条件等待,可以等待元素可点击、弹窗、iframe,稳定性最强,项目首选。

一句话口诀:sleep死等;隐式全局等DOM;显式条件判断,全能稳定。

posted @ 2026-10-08 16:00  一只鹿吖  阅读(12)  评论(0)    收藏  举报