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

使用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的连接超时断开触发的,和你的业务逻辑无关。
根因分析

你的代码存在两处核心逻辑错误:

  1. 预期条件(EC)的使用方法完全错误
    EC.presence_of_element_located接收的参数是(定位方式, 定位值)的元组,不是browser.find_element的返回结果。你直接调用browser.find_element查找元素,找不到就会直接抛异常,根本不会进入EC的判断逻辑。
  2. 没有设置等待时间,也没有做异常兜底
    所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:07