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

Python+Selenium写循环刷新脚本,加try except仍抛出NoSuchElementException错误

问题原因分析
  • 第一个NoSuchElementException已经被正常捕获,报错栈中明确标注了「During handling of the above exception, another exception occurred」,说明程序已经进入except分支、跳出for循环后,执行while后续的提交逻辑时,触发了第二个未捕获的ElementClickInterceptedException,这才是程序崩溃的根本原因。
  • 点击拦截报错是因为找到可预约时段后,Submit按钮还被其他页面元素遮挡,或者还未完全加载到可点击状态,Selenium默认的原生点击就会触发该报错。
  • 现有代码还有个不规范的小问题:no_slot是布尔类型,while no_slot == 1虽然可以运行,但直接写while no_slot更符合Python语法规范。
  • 点击搜索按钮后没有等待页面加载就直接查找返回按钮,也可能偶发元素找不到的异常。
优化后代码

首先导入需要的依赖:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException

修改后的逻辑代码:

no_slot = True
wait = WebDriverWait(browser, 5) # 最长等待5秒,可根据页面实际加载速度调整

while no_slot:
    for i in range(60):
        # 等待搜索按钮可点击后再操作
        search_button = wait.until(EC.element_to_be_clickable((By.NAME, "btnSearch")))
        search_button.click()
        try:
            # 等待返回按钮出现,最多等3秒
            noslot_back_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="btnBack"]')))
        except TimeoutException:
            # 超时说明返回按钮不存在,已找到可预约时段
            no_slot = False
            break
        else:
            noslot_back_button.click()

# 后续提交逻辑,处理点击拦截问题
try:
    submit_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[value="Submit"].btn')))
    # 优先用原生点击
    submit_btn.click()
except ElementClickInterceptedException:
    # 原生点击被拦截就用JS点击绕过遮挡
    browser.execute_script("arguments[0].click();", submit_btn)
优化说明
  • 用显式等待替代直接find_element,避免页面加载速度波动导致的偶发元素找不到问题
  • 捕获提交按钮的点击拦截异常,用JS点击的方式绕过页面元素遮挡的问题
  • 调整了循环判断的语法规范,可读性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:45:03