You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Selenium的WebDriverWait未触发等待直接报错是什么原因?

问题根因分析
  1. 核心原因是你使用的旧版本Safari 14.1.2对应的SafariDriver存在兼容性缺陷,配合Selenium显式等待逻辑时异常处理不符合预期。
    Selenium的WebDriverWait默认仅会忽略NoSuchElementException类异常触发重试逻辑,你遇到的NoSuchFrameException不在默认忽略的异常列表中,因此异常触发时会直接抛出,不会执行10秒的等待重试。
  2. 点击登录提交按钮后,页面处于跳转/iframe加载的中间状态,此时驱动的上下文还未切换到新页面/加载完成的iframe,此时查询元素会直接抛出NoSuchFrameException,进而直接终止等待逻辑。
    time.sleep(10)有效的原因是强制等待了足够长的时间,让页面跳转、资源加载完全,驱动上下文恢复正常,后续的元素查询逻辑就不会触发异常。
解决方案

你可以通过修改显式等待的配置,将NoSuchFrameException加入忽略异常列表即可解决该问题,不需要使用强制等待:

from selenium.common.exceptions import NoSuchFrameException, NoSuchElementException

# 登录提交
login_submit.click() 

# 显式指定需要忽略的异常,触发对应异常时会自动重试直到超时
WebDriverWait(
    driver=browser, 
    timeout=10,
    ignored_exceptions=[NoSuchElementException, NoSuchFrameException]
).until(EC.element_to_be_clickable((By.ID, 'hoge')))

如果你的目标元素嵌套在iframe中,也可以先增加一步iframe加载等待的逻辑,再进行元素查询:

# 先等待iframe加载完成并切换上下文
WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "目标iframe的ID")))
# 再查询目标元素
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.ID, 'hoge')))

内容的提问来源于stack exchange,提问作者kensuke1984

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:09:00