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
相关产品推荐
相关产品推荐

