使用Selenium与ChromeDriver时Backtrace: Ordinal0堆栈错误是什么含义?
报错含义说明
你看到的Backtrace: Ordinal0 [0x00723AB3+2505395]是ChromeDriver底层C++代码的调用栈内存偏移信息,仅用于Chrome内核开发人员排查底层问题,普通业务开发不需要关注,只需要看栈顶明确抛出的Python异常类型和提示信息即可。
错误类型区分
你本次运行共产生3类错误,按触发顺序排列如下:
- 第一类:
NoSuchElementException(第一次)
触发位置是代码中查找input[name="btnBack"]的步骤,属于你预期内的异常,已经被你写的except NoSuchElementException块捕获。 - 第二类:
NoSuchElementException(第二次)
触发位置是except块内查找//td[@class="title"]的步骤,属于未被捕获的异常,是导致你脚本直接崩溃的根因。 - 第三类:
TimeoutError: [WinError 10060]
属于PyCharm调试器的次生错误,是前面脚本崩溃后,调试器和ChromeDriver的连接超时断开触发的,和你的业务逻辑无关。
根因分析
你的代码存在两处核心逻辑错误:
- 预期条件(EC)的使用方法完全错误
EC.presence_of_element_located接收的参数是(定位方式, 定位值)的元组,不是browser.find_element的返回结果。你直接调用browser.find_element查找元素,找不到就会直接抛异常,根本不会进入EC的判断逻辑。 - 没有设置等待时间,也没有做异常兜底
所有find_element调用都没有加显式等待,页面还未渲染完成就开始查找元素,极易触发找不到元素的异常;且except块内的所有元素查找逻辑都没有加异常捕获,一旦报错直接导致脚本终止。
修复方案
你可以参考如下修改后的代码逻辑:
import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException # 初始化全局等待,最长等待10秒,可根据页面加载速度调整 wait = WebDriverWait(browser, 10) no_slot = True while no_slot: for i in range(60): try: # 先等待搜索按钮可点击再点击 search_button = wait.until(EC.element_to_be_clickable((By.NAME, "btnSearch"))) search_button.click() # 短等待避免页面跳转抖动 time.sleep(1) try: noslot_back_button = browser.find_element(By.CSS_SELECTOR, 'input[name="btnBack"]') # 找到返回按钮说明没有名额,继续下一次查询 continue except NoSuchElementException: # 没找到返回按钮,判断是否进入预约页 try: # 等待预约页标题元素出现,超时则抛异常 wait.until(EC.presence_of_element_located((By.XPATH, '//td[@class="title"]'))) # 后续预约逻辑,所有元素操作都用wait包裹避免提前查找 slot_radio_info = wait.until(EC.presence_of_element_located((By.NAME, 'slot'))) slot_id = slot_radio_info.get_attribute('id') radio_button = wait.until(EC.element_to_be_clickable((By.XPATH, f'//input[@id="{slot_id}"]'))) radio_button.click() slot_submit_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[value="Submit"]'))) slot_submit_button.click() double_cfm_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[value="Confirm"]'))) double_cfm_button.click() # 预约完成退出循环 no_slot = False break except TimeoutException: # 标题元素超时未出现,判断页面标题是否符合预期 if not EC.title_contains('BBDC: Booking For TP Driving Simulator Lesson')(browser): print("Connection timed out or something else happened") else: print("unaccounted condition") # 出现异常后刷新页面继续循环,可根据你的业务调整为返回上一页 browser.refresh() time.sleep(2) except Exception as e: # 全局兜底捕获,避免脚本直接崩溃 print(f"循环过程中出现未预期错误: {str(e)}") browser.refresh() time.sleep(2)
后续排查建议
如果修复后仍然出现元素找不到的问题,可以在报错前加代码打印当前页面的源码,确认元素的属性是否和你写的定位符一致,也可以适当调长全局等待的时长,适配网络波动导致的页面加载变慢问题。
内容的提问来源于stack exchange,提问作者user17230900
相关产品推荐
相关产品推荐

