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

