Python中Selenium的WebDriverWait未触发等待直接报错是什么原因?
问题根因分析
- 核心原因是你使用的旧版本Safari 14.1.2对应的SafariDriver存在兼容性缺陷,配合Selenium显式等待逻辑时异常处理不符合预期。
Selenium的WebDriverWait默认仅会忽略NoSuchElementException类异常触发重试逻辑,你遇到的NoSuchFrameException不在默认忽略的异常列表中,因此异常触发时会直接抛出,不会执行10秒的等待重试。 - 点击登录提交按钮后,页面处于跳转/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
相关产品推荐
相关产品推荐

