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

Selenium已配置try except捕获NoSuchElementException仍报错如何解决

问题根因

你的程序实际已经进入了except分支,报错日志中明确存在During handling of the above exception, another exception occurred提示,说明NoSuchElementException已经被捕获并触发了预约逻辑,只是预约逻辑中出现了新的未捕获异常ElementClickInterceptedException,导致程序直接终止,才让你误以为没有进入except块。


现存问题与修复方案

1. 刷新逻辑缺失返回按钮点击操作

原代码仅在try块中查询了返回按钮,没有执行点击操作,页面无法回到上一页,循环刷新逻辑实际无法正常运行。同时建议替换强制查询为显示等待,避免页面加载慢导致的偶发元素查询失败。

首先导入依赖的模块和异常类:

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

修复后的完整逻辑:

wait = WebDriverWait(browser, 10) # 配置最长10秒的元素等待时间
no_slot = True
while no_slot:
    for i in range(60):
        # 等待搜索按钮可点击再执行操作
        search_button = wait.until(EC.element_to_be_clickable((By.NAME, "btnSearch")))
        search_button.click()
        try:
            # 等待返回按钮出现,超时则代表没有返回按钮、进入预约流程
            noslot_back_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="btnBack"]')))
            noslot_back_button.click()
        except TimeoutException:
            try:
                # 去掉冗余的二次元素查询,直接操作已找到的slot单选框
                slot_radio = wait.until(EC.element_to_be_clickable((By.NAME, 'slot')))
                slot_radio.click()
                # 用JS点击提交按钮,绕过元素遮挡限制
                slot_submit_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[value="Submit"]')))
                browser.execute_script("arguments[0].click();", slot_submit_button)
                double_cfm_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[value="Confirm"]')))
                double_cfm_button.click()
                no_slot = False
                break # 跳出当前for循环
            except Exception as e:
                # 捕获预约流程的异常,可打印日志后重试
                print(f"预约流程出错: {str(e)}")
                break
    if not no_slot:
        break # 跳出外层while循环

2. 点击被拦截问题修复

报错ElementClickInterceptedException是因为提交按钮被其他元素遮挡、或者页面未完全渲染就执行了点击操作,上述代码中使用browser.execute_script("arguments[0].click();", slot_submit_button)的JS点击方式,可直接绕过前端元素遮挡限制。

3. 冗余逻辑清理

原代码中已经通过By.NAME, 'slot'找到了单选框元素,不需要再获取id重新查询一次,直接调用click方法即可,减少不必要的查询操作避免额外报错。

4. 循环终止逻辑完善

原代码设置no_slot = False后没有主动跳出循环,当前的for循环和外层while循环还会继续执行,补充break语句可主动终止循环避免重复操作。

内容的提问来源于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 04:15:05