ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ChromeDriver与Chrome win64版本匹配指南:从报错到自动化实战

ChromeDriver与Chrome win64版本匹配指南:从报错到自动化实战 简介本资源面向Web自动化测试开发者与Selenium学习者提供Windows 64位系统下ChromeDriver与Chrome浏览器的配套组合解决版本不匹配导致的驱动兼容问题。压缩包共84个文件约150.08MB以58个pak语言与资源包、11个dll动态库、6个exe可执行程序为主另含chromedriver驱动、manifest清单、json配置及bin快照数据等覆盖浏览器运行与驱动调用的完整依赖。其中ChromeDriver版本为123.0.6312.122与同版本Chrome浏览器严格对应可直接用于搭建稳定的自动化测试环境。已有324人学习下载适合需要快速部署Selenium测试环境、避免版本冲突的开发者参考使用帮助减少环境配置与排错时间。1. ChromeDriver 与 Chrome win64 配套包一次把版本匹配这件事说透做 Web 自动化、爬虫或者端到端测试的人几乎都绕不开 ChromeDriver 和 Chrome 这对组合。但真正让人头疼的从来不是写代码而是环境搭好之后跑起来报的那句session not created: This version of ChromeDriver only supports Chrome version XX。这个报错背后其实就一件事ChromeDriver 的版本必须和本机 Chrome 浏览器的大版本号严格对齐。这份 win64 资源包把 ChromeDriver 和对应版本的 Chrome 浏览器打包在一起解决的正是「版本对不上、下载找不到入口、装完跑不起来」这条链路上的问题。适合谁刚接触 Selenium、Playwright、Puppeteer 的测试和爬虫方向从业者以及需要在一台 Windows 机器上快速拉起自动化环境的工程师。下面从版本对应关系讲起一路落到实际调用和排错。2. 版本对应关系与 win64 环境准备为什么你下的 ChromeDriver 总是报错2.1 ChromeDriver 和 Chrome 的版本绑定逻辑ChromeDriver 从很早的版本开始就采用了一套「大版本号必须一致」的策略。Chrome 的主版本号是版本号的第一段比如 Chrome 136 对应 ChromeDriver 136.x.x.xChrome 109 对应 ChromeDriver 109.x.x.x。注意这里说的是主版本号对齐不是完全相等。ChromeDriver 136.0.7103.94 可以驱动 Chrome 136.0.7103.59但驱动不了 Chrome 137 或者 Chrome 135。这个规则听起来简单实际踩坑的人非常多原因在于 Chrome 的自动更新机制。Chrome 默认会在后台静默升级你今天装好的 ChromeDriver 明天可能就对不上了。尤其是 win64 环境下Chrome 的安装路径和更新行为跟 macOS、Linux 都有差异很多人连自己当前 Chrome 到底是哪个版本都没确认就开始下驱动。确认 Chrome 版本最直接的方式是打开浏览器地址栏输入chrome://version/第一行就是完整版本号。另一个方式是通过注册表或者文件属性查看但chrome://version/是最快的。拿到版本号之后取第一段数字去找对应主版本的 ChromeDriver。常见做法是去 ChromeDriver 的官方发布页按版本号找目录但国内访问有时候不太顺畅而且历史版本翻起来费劲。这份 win64 资源包的价值就在于把 ChromeDriver 和匹配的 Chrome 安装包放在一起省掉了「先查版本、再找驱动、还得确认位数」这三步来回折腾。2.2 win64 下的目录结构与文件说明拿到资源包之后先别急着双击运行。win64 环境下 Chrome 和 ChromeDriver 的存放位置会直接影响后续能不能被代码正确调用。我一般建议按下面的结构来组织C:\webdriver\ ├── chrome\ │ └── chrome.exe # Chrome 浏览器主程序 ├── chromedriver\ │ └── chromedriver.exe # ChromeDriver 可执行文件 └── projects\ └── your_script.py # 你的自动化脚本这样分开放的好处是Chrome 和 ChromeDriver 各自独立升级其中一个不会影响另一个的路径引用。很多人习惯把 chromedriver.exe 直接丢到 Python 的 Scripts 目录或者系统 PATH 里短期能用但一旦需要切换版本就会互相覆盖排查起来很痛苦。确认文件完整性的时候重点看两个东西chrome.exe的文件属性里「详细信息」标签页能看到版本号chromedriver.exe在命令行执行chromedriver --version会输出对应的版本。两个版本号的主版本段必须一致。# 检查 ChromeDriver 版本 C:\webdriver\chromedriver\chromedriver.exe --version # 输出示例ChromeDriver 136.0.7103.94 (xxxxxxx) # 检查 Chrome 版本通过命令行读取文件版本信息 wmic datafile where nameC:\\webdriver\\chrome\\chrome.exe get Version /value # 输出示例Version136.0.7103.59上面两条命令分别验证驱动和浏览器的版本。--version是 ChromeDriver 自带参数直接输出自身版本。wmic那行是 Windows 下读取 exe 文件版本信息的通用方式注意路径里的反斜杠要转义。如果wmic在新版 Windows 上不可用可以用 PowerShell 的(Get-Item C:\webdriver\chrome\chrome.exe).VersionInfo.ProductVersion替代。注意Chrome 的版本号在文件属性里可能显示为136.0.7103.59而 ChromeDriver 显示为136.0.7103.94这是正常的只要第一段136一致就能配合使用。2.3 环境变量配置与多版本共存如果你机器上只有一个 Chrome 和一个 ChromeDriver那直接把 chromedriver 所在目录加到系统 PATH 里就行。但实际工作中经常遇到需要同时维护多个版本的情况比如一个项目跑在 Chrome 109 上做兼容测试另一个项目用最新版 Chrome。这时候 PATH 里放多个 chromedriver 就会冲突。我的做法是不把 chromedriver 放进 PATH而是在代码里显式指定路径。Selenium 的Service对象和 Playwright 的executable_path都支持传入绝对路径。这样每个项目可以绑定自己的驱动版本互不干扰。from selenium import webdriver from selenium.webdriver.chrome.service import Service # 显式指定 ChromeDriver 路径避免 PATH 冲突 service Service(executable_pathrC:\webdriver\chromedriver\chromedriver.exe) options webdriver.ChromeOptions() options.binary_location rC:\webdriver\chrome\chrome.exe driver webdriver.Chrome(serviceservice, optionsoptions) driver.get(https://www.example.com) print(driver.title) driver.quit()这段代码里有两个关键参数。executable_path告诉 Selenium 用哪个 ChromeDriverbinary_location告诉它用哪个 Chrome 浏览器。两个都显式指定之后就完全不依赖系统 PATH 和默认安装路径了。options还可以继续加--headless、--no-sandbox、--disable-gpu等参数win64 下如果遇到渲染问题加--disable-gpu通常能解决。如果确实需要把 chromedriver 加到 PATH操作是右键「此电脑」→ 属性 → 高级系统设置 → 环境变量 → 在系统变量里找到 Path → 编辑 → 新增一行C:\webdriver\chromedriver。加完之后要重开命令行窗口才生效这个「重开」经常被人忽略导致以为没配成功。3. 用 Python 和 Selenium 跑通第一个自动化脚本从调用到参数调优3.1 安装依赖与最小可运行示例环境准备好之后Python 侧需要装 selenium 库。版本选择上Selenium 4.x 和 3.x 的 API 差异比较大新项目直接用 4.x。安装命令很简单pip install selenium # 如果需要指定版本 pip install selenium4.21.0装完之后用上一节那段代码就能跑起来。但实际跑的时候经常会遇到几个问题这里展开说。第一个问题是 Chrome 启动后闪退。原因通常是 ChromeDriver 和 Chrome 版本不匹配或者 Chrome 被安全软件拦截。排查方式是先在命令行单独运行 chromedriver看它输出的日志里有没有Starting ChromeDriver和Only local connections are allowed如果有说明驱动本身没问题问题出在 Chrome 侧。第二个问题是脚本跑着跑着浏览器卡住。win64 下常见原因是 Chrome 的自动更新在后台下载新版本导致运行中的实例被干扰。可以在 ChromeOptions 里加--disable-background-networking和--disable-component-update来减少后台活动。from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options options Options() options.binary_location rC:\webdriver\chrome\chrome.exe # 关闭后台网络活动和组件更新减少 win64 下的干扰 options.add_argument(--disable-background-networking) options.add_argument(--disable-component-update) options.add_argument(--disable-gpu) options.add_argument(--window-size1920,1080) service Service(executable_pathrC:\webdriver\chromedriver\chromedriver.exe) driver webdriver.Chrome(serviceservice, optionsoptions) try: driver.get(https://www.example.com) # 等待页面加载完成最多 10 秒 driver.implicitly_wait(10) print(页面标题:, driver.title) finally: driver.quit()这段代码比上一节多了几个参数。--disable-background-networking阻止 Chrome 在后台偷偷联网更新--disable-component-update关掉组件自动更新--window-size设定初始窗口大小避免默认窗口太小导致元素定位失败。implicitly_wait(10)是隐式等待给页面元素加载留出缓冲时间。try...finally保证即使中间报错浏览器也能正常关闭不然会残留一堆 chrome.exe 进程。3.2 常见启动参数与 win64 特有配置Chrome 的启动参数非常多但日常自动化里真正高频的就那么十几个。下面这张表整理了我常用的参数和适用场景参数作用适用场景--headlessnew无头模式运行服务器环境、批量任务--disable-gpu禁用 GPU 加速win64 下避免渲染异常--no-sandbox关闭沙箱权限受限环境--disable-dev-shm-usage使用磁盘代替共享内存内存较小的机器--user-data-dir指定用户数据目录保持登录状态、复用配置--disable-extensions禁用所有扩展避免扩展干扰自动化--remote-debugging-port9222开启调试端口连接已运行的 Chrome 实例--user-data-dir这个参数值得单独说。默认情况下每次启动 ChromeDriver 都会创建一个临时用户目录这意味着你的登录状态、Cookie、书签都不会保留。如果脚本需要登录某个网站每次都要重新走登录流程就很麻烦。指定一个固定的用户数据目录之后第一次手动登录后续脚本启动就能复用登录态。options.add_argument(r--user-data-dirC:\webdriver\chrome_profile)注意这个目录不要和日常使用的 Chrome 用户目录共用否则可能互相干扰。单独建一个给自动化用就行。--remote-debugging-port是另一个实用参数。有时候你需要连接一个已经打开的 Chrome 实例而不是让 ChromeDriver 重新启动一个。比如你想在已经登录好的浏览器上跑脚本就可以先手动启动 Chrome 并带上调试端口然后用 Selenium 的debugger_address连上去。options Options() options.add_experimental_option(debuggerAddress, 127.0.0.1:9222) driver webdriver.Chrome(serviceservice, optionsoptions)这种方式下 ChromeDriver 不会启动新的 Chrome而是接管已有的实例。前提是那个 Chrome 启动时带了--remote-debugging-port9222。3.3 元素定位与等待策略的实操建议元素定位是自动化脚本里最容易翻车的环节。Selenium 提供了八种定位方式但实际用得最多的就三种find_element(By.ID, ...)、find_element(By.CSS_SELECTOR, ...)、find_element(By.XPATH, ...)。ID 最稳CSS Selector 次之XPath 最灵活但也最容易因为页面结构变化而失效。等待策略上隐式等待和显式等待要配合用。隐式等待设一个全局的兜底时间显式等待针对具体元素设条件。不要用time.sleep()硬等那是血泪经验——页面加载快了浪费时间加载慢了照样报错。from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 隐式等待作为兜底 driver.implicitly_wait(5) # 显式等待等某个按钮可点击 try: button WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, #submit-btn)) ) button.click() except Exception as e: print(按钮未找到或不可点击:, e) # 截图保存现场方便排查 driver.save_screenshot(error_screenshot.png)WebDriverWait的第二个参数是超时时间单位秒。EC.element_to_be_clickable会同时检查元素存在且可点击。如果超时没找到抛异常这时候截图保存现场是个好习惯能直观看到页面当时的状态。save_screenshot在 win64 下保存的路径如果包含中文偶尔会有编码问题建议用英文路径。4. 避坑与排查ChromeDriver 在 win64 上最容易翻车的五个场景4.1 报错「session not created」但版本号看着一样现象ChromeDriver 和 Chrome 的主版本号都是 136但启动时仍然报session not created: This version of ChromeDriver only supports Chrome version 136。原因Chrome 的实际版本可能比chrome://version/显示的更新。Chrome 的更新是分阶段的有时候界面显示 136.0.7103.59但后台已经下载了 136.0.7103.98 的补丁重启后生效。ChromeDriver 对补丁版本也有一定要求跨度过大时会拒绝。解决完全关闭 Chrome包括后台进程重新打开chrome://version/确认版本然后去 ChromeDriver 发布页找同主版本下最新的驱动。如果还是不行把 Chrome 和 ChromeDriver 都换成资源包里配套的那一组确保是同一批次。4.2 Chrome 启动后空白页或闪退现象脚本执行后 Chrome 窗口一闪而过或者打开后停在about:blank不动。原因win64 下常见的是--disable-gpu没加或者 Chrome 的沙箱和某些安全软件冲突。另一个可能是 ChromeDriver 被 Windows Defender 拦截。解决先加--disable-gpu和--no-sandbox试试。如果还不行把 ChromeDriver 所在目录加入 Windows Defender 的排除项。再不行就在命令行手动运行 chromedriver看它的日志输出通常会提示具体原因。4.3 脚本跑一段时间后报「chrome not reachable」现象脚本运行几分钟后突然报chrome not reachable或者disconnected。原因Chrome 在后台自动更新替换了正在运行的 chrome.exe导致 ChromeDriver 和 Chrome 之间的连接断开。win64 下 Chrome 的更新服务是常驻的很容易触发这个问题。解决在 ChromeOptions 里加--disable-background-networking和--disable-component-update。更彻底的方式是禁用 Chrome 的更新服务在服务管理器里找到Google 更新服务 (gupdate)和Google 更新服务 (gupdatem)把启动类型改成「手动」或「禁用」。但注意这样 Chrome 就不会自动更新了需要定期手动升级。4.4 多线程下 ChromeDriver 端口冲突现象用多线程同时启动多个 Chrome 实例时部分实例启动失败报端口被占用。原因ChromeDriver 默认使用 9515 端口多个实例同时启动会争抢同一个端口。解决给每个 ChromeDriver 实例指定不同的端口。Selenium 的Service对象支持port参数service Service(executable_pathrC:\webdriver\chromedriver\chromedriver.exe, port9516)每个线程用不同的端口号或者干脆让 ChromeDriver 自动分配端口不指定 port 参数时它会自己找可用端口。多线程下更推荐用concurrent.futures.ThreadPoolExecutor配合独立的 driver 实例每个线程创建和销毁自己的 driver。4.5 中文路径导致的启动失败现象Chrome 或 ChromeDriver 放在包含中文的路径下启动时报错或直接无响应。原因ChromeDriver 在处理非 ASCII 路径时存在兼容性问题尤其是 win64 下路径编码和系统区域设置不一致时。解决把 Chrome 和 ChromeDriver 都放在纯英文路径下比如C:\webdriver\。用户数据目录--user-data-dir也避免用中文路径。如果项目路径本身包含中文至少保证浏览器和驱动的路径是英文的。5. 进阶技巧用 Chrome DevTools Protocol 做更细粒度的控制Selenium 能做的事不少但有些场景它确实力不从心比如拦截网络请求、修改响应内容、获取页面性能指标。这些需求用 Chrome DevTools ProtocolCDP来做会更顺手。ChromeDriver 本身支持通过execute_cdp_cmd方法发送 CDP 命令不需要额外装库。# 启用网络拦截获取所有请求的 URL driver.execute_cdp_cmd(Network.enable, {}) # 拦截特定请求并修改响应头 driver.execute_cdp_cmd(Network.setRequestInterception, { patterns: [{urlPattern: *example.com*, resourceType: Document}] }) # 获取页面性能指标 metrics driver.execute_cdp_cmd(Performance.getMetrics, {}) for m in metrics[metrics]: if m[name] in (DomContentLoaded, Load): print(m[name], m[value])execute_cdp_cmd的第一个参数是 CDP 的方法名第二个是参数字典。Network.enable开启网络监听Network.setRequestInterception设置拦截规则Performance.getMetrics拿性能数据。这些命令的完整列表在 CDP 的官方文档里能查到ChromeDriver 基本都支持转发。另一个实用技巧是用 CDP 模拟移动设备。Selenium 本身有--window-size和 user-agent 设置但 CDP 的Emulation.setDeviceMetricsOverride能做得更精细包括设备像素比、触摸支持等。driver.execute_cdp_cmd(Emulation.setDeviceMetricsOverride, { width: 390, height: 844, deviceScaleFactor: 3, mobile: True }) driver.execute_cdp_cmd(Emulation.setTouchEmulationEnabled, { enabled: True, maxTouchPoints: 5 })这段代码把浏览器模拟成 iPhone 14 的尺寸和触摸行为。deviceScaleFactor是设备像素比mobile标记为移动设备maxTouchPoints设置触摸点数量。做移动端适配测试的时候比单纯改窗口大小准确得多。验证 CDP 命令是否生效最简单的办法是截图看效果或者用driver.execute_script(return navigator.userAgent)检查 user-agent 有没有变。如果命令没生效通常是 CDP 方法名拼错了或者参数格式不对ChromeDriver 会静默忽略而不是报错这点比较坑。从那以后我每次搭新环境都强制先跑一遍chrome://version/和chromedriver --version的版本比对确认主版本号一致再往下走。这个习惯帮我省掉了至少一半的「玄学」启动失败。希望帮到你。本文还有配套的精品资源点击获取
返回列表