Selenium 显式等待 WebDriverWait
一、为什么抛弃 time.sleep()
python
time.sleep(3)
硬等待:强制卡死3秒,不管页面是否加载完成
缺点:
- 元素提前加载好了,依然要等 → 脚本运行慢
- 元素加载超过3秒 → 直接抛找不到元素异常
✅ 显式等待 WebDriverWait:循环判断元素条件,满足条件立刻放行;超过超时时间才报错。灵活高效,工作必用。
二、需要导入包
python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
三、标准模板(背诵!固定写法)
python
# 参数1:driver对象;参数2:超时总时间(秒);参数3:轮询间隔(多久检查一次,默认0.5s)
wait = WebDriverWait(driver, 10, 0.5)
# until:直到满足条件
ele = wait.until(
EC.presence_of_element_located( (By.XPATH, "//input[@id='kw']") )
)
⚠️ 注意:
()里面是元组,两个参数必须括号包起来!
四、常用 expected_conditions 条件(高频)
presence_of_element_located:元素存在DOM中(html加载出来,不一定可见)visibility_of_element_located:元素可见(推荐大多数场景,能看到才能点击输入)element_to_be_clickable:元素可点击(按钮可用,无遮挡,优先用于按钮)text_to_be_present_in_element:元素文本包含指定内容
五、完整可运行示例(百度搜索)
python
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
web_driver = webdriver.Edge(service=Service(r"D:\Software\edgedriver_win64\msedgedriver.exe"))
web_driver.get("https://www.baidu.com")
web_driver.maximize_window()
# 实例化等待对象,最长等待10秒
wait = WebDriverWait(web_driver, 10)
# 等待搜索框可见,找到元素
search_input = wait.until(
EC.visibility_of_element_located( (By.ID, "kw") )
)
search_input.send_keys("显式等待学习")
# 等待按钮可点击
search_btn = wait.until(
EC.element_to_be_clickable( (By.ID, "su") )
)
search_btn.click()
# 等待结果文本出现
wait.until(
EC.text_to_be_present_in_element( (By.XPATH, "//h3"), "显式等待学习" )
)
web_driver.quit()
六、隐式等待(补充了解,不推荐混用)
python
driver.implicitly_wait(10)
全局设置,整个会话生效;显式、隐式不要一起使用,容易出现奇怪超时bug,企业主流只用【显式等待】
七、常见报错
TimeoutException:规定时间内,条件始终不满足
排查:xpath写错 / 元素被遮挡 / 在iframe内 / 页面跳转没加载完成- 忘记元组括号:
EC.xxx(By.ID,"kw")❌ →EC.xxx( (By.ID,"kw") )✅