尧图精选

ChromeDriver与Chrome版本对齐实战:win64环境Selenium自动化避坑指南

🕒 发布时间:2026/10/2 9:05:21 📁 来源:尧图网络
简介本资源面向Web自动化测试开发者与Selenium学习者提供Windows 64位系统下ChromeDriver与Chrome浏览器的配套组合解决版本不匹配导致的驱动兼容问题。压缩包共84个文件约150.08MB包含chromedriver.exe驱动主程序、chrome.exe等6个可执行文件、11个dll动态链接库、58个pak语言与界面资源包以及json配置、bin快照、manifest版本清单等覆盖驱动与浏览器运行所需的完整组件。其中ChromeDriver版本为123.0.6312.122与同版本Chrome浏览器匹配可直接用于搭建稳定的自动化测试环境。目前已有324人学习下载适合需要快速部署Selenium测试环境、避免版本冲突的开发者参考使用也可作为学习WebDriver协议与浏览器自动化原理的实践素材。1. ChromeDriverChromewin64版本对齐这件事比写代码本身更折腾在 Windows 64 位机器上跑 Selenium十次有八次卡住的地方不是定位器写错而是 ChromeDriver 和 Chrome 浏览器版本对不上。你装好了 Python、pip 了 selenium代码也没问题一运行就抛SessionNotCreatedException: This version of ChromeDriver only supports Chrome version XX。这个标题讲的就是这件事在 win64 环境下把 ChromeDriver 和 Chrome 浏览器的版本关系理清楚让自动化脚本能稳定跑起来。适合正在做 Web 自动化测试、爬虫、RPA 的从业者也适合刚接触 Selenium 但被版本问题反复卡住的新手。核心就一句话Chrome 每次自动更新ChromeDriver 必须跟着换而 win64 下的路径、位数、环境变量又有它自己的坑。2. 版本对应关系ChromeDriver 和 Chrome 到底怎么配对2.1 为什么 Chrome 一更新ChromeDriver 就罢工ChromeDriver 本质是一个实现了 WebDriver 协议的中转进程它通过 DevTools Protocol 跟 Chrome 浏览器通信。Chrome 每个大版本会改动 CDP 的接口细节ChromeDriver 必须针对对应版本的 CDP 做适配。所以 Chrome 从 136 升到 137旧版 ChromeDriver 就无法跟新版 Chrome 建立会话直接报版本不匹配。这里有个很多人忽略的点ChromeDriver 的版本号前三段必须和 Chrome 的前三段一致。比如 Chrome 是136.0.7103.114ChromeDriver 就得是136.0.7103.x。第四段可以不严格对齐但前三段必须匹配。这就是为什么你看到chromedriver 136下载这种搜索词——大家都是在追 Chrome 的版本号跑。从 Chrome 115 开始Google 调整了 ChromeDriver 的发布方式改成了 Chrome for Testing 体系。以前有一个固定的下载页列出所有版本现在需要通过 Chrome for Testing 的 JSON 接口来查。这个变化让很多人找不到下载入口也是chromedriver下载地址成为高频搜索词的原因。2.2 查版本、下驱动的完整操作路径第一步确认本机 Chrome 的精确版本。有三个方法我一般用第一个# 方法1通过注册表查win64 最可靠 reg query HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon /v version # 方法2通过 Chrome 界面 # 地址栏输入 chrome://version/ 回车看第一行 # 方法3通过 PowerShell 查文件版本 powershell -Command (Get-Item C:\Program Files\Google\Chrome\Application\chrome.exe).VersionInfo.ProductVersion注册表方式最稳因为它读的是 Chrome 自己写入的版本记录不受安装路径影响。如果你用的是便携版 Chrome注册表可能没有记录那就得用方法三直接读 exe 文件的版本信息。第二步根据 Chrome 版本号找到对应的 ChromeDriver。Chrome for Testing 提供了一个已知版本的查询接口# 查询最新稳定版 ChromeDriver 的下载地址win64 # 返回 JSON 中包含 version 和 downloads.chromedriver 字段 curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json返回的 JSON 里channels.Stable下面有version和downloads.chromedriver其中platform为win64的那条就是你要的。如果你需要特定版本比如公司测试环境锁定了 Chrome 136可以用另一个接口# 查询所有可用版本号列表 curl -s https://googlechromelabs.github.io/chrome-for-testing/known-good-versions.json | python -c import json,sys data json.load(sys.stdin) for v in data[versions]: if v[version].startswith(136.): print(v[version]) 这段 Python 一行流的作用是从完整版本列表中筛出 136 开头的所有版本。参数说明known-good-versions.json包含每个版本的完整号和对应的驱动下载路径数据量比较大建议用脚本过滤而不是肉眼翻。第三步下载并放置。win64 的 ChromeDriver 解压后是一个chromedriver.exe你需要把它放到以下任一位置放置方式路径适用场景系统 PATH 目录C:\Windows\System32或自定义 PATH全局使用多项目共享Python 脚本同级目录与.py文件同目录单项目快速验证指定路径传参代码里写绝对路径多版本共存精确控制我一般选第三种因为测试机上有时候要同时维护两三个 Chrome 版本的兼容测试放 PATH 里反而容易搞混。2.3 在代码里锁定 ChromeDriver 路径from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options # 指定 ChromeDriver 的绝对路径避免 PATH 污染 service Service(executable_pathrD:\drivers\chromedriver_136\chromedriver.exe) # 指定 Chrome 浏览器的二进制路径便携版或多版本共存时必须 options Options() options.binary_location rC:\Program Files\Google\Chrome\Application\chrome.exe # 常用启动参数 options.add_argument(--no-sandbox) # 避免权限问题导致的启动失败 options.add_argument(--disable-gpu) # win64 远程桌面环境下建议加 options.add_argument(--window-size1920,1080) # 固定窗口尺寸避免响应式布局干扰 driver webdriver.Chrome(serviceservice, optionsoptions) driver.get(https://www.example.com) print(driver.title) driver.quit()executable_path指向你解压出来的 chromedriver.exebinary_location指向 Chrome 主程序。两个都写绝对路径的好处是不管系统里装了几个 Chrome、PATH 里放了几个版本的驱动这段代码的行为都是确定的。--no-sandbox在 Windows 上不是必须的但在 CI 环境或权限受限的机器上能省掉很多玄学问题。3. win64 环境下的部署细节路径、位数与环境变量3.1 32 位和 64 位驱动的选择ChromeDriver 在 win64 平台上有专门的win64包也有win32包。虽然 32 位的驱动在 64 位 Windows 上也能跑但如果你用的是 64 位 Chrome建议驱动也选 win64。混用虽然大多数时候没事但在高并发或长时间运行的场景下32 位驱动受限于内存寻址可能出现莫名其妙的超时。判断当前 Chrome 是 32 位还是 64 位打开chrome://version/看「命令行」那一行如果路径里有Program Files (x86)就是 32 位Program Files就是 64 位。win64 的驱动包解压后目录结构是chromedriver-win64/chromedriver.exe别把整个文件夹丢进去要的是那个 exe。3.2 环境变量配置的两种做法# 方法一临时添加到当前会话的 PATHcmd set PATH%PATH%;D:\drivers\chromedriver_136 # 方法二永久添加到用户环境变量PowerShell需要管理员权限 [Environment]::SetEnvironmentVariable( Path, [Environment]::GetEnvironmentVariable(Path, User) ;D:\drivers\chromedriver_136, User )方法一只在当前 cmd 窗口有效关掉就没了适合临时调试。方法二是永久写入用户级环境变量不影响系统级配置比较安全。改完之后要新开一个终端才生效这个坑我踩过——改完环境变量在原来的窗口里怎么试都不行以为配错了其实是没刷新。注意如果你同时装了多个版本的 ChromeDriver 并且都在 PATH 里Windows 会按 PATH 中的顺序找第一个匹配的。所以要么只保留一个在 PATH 里要么在代码里写绝对路径。3.3 用 webdriver-manager 自动管理版本手动下载驱动这件事在 Chrome 频繁更新的环境下确实烦。webdriver-manager这个库可以自动检测本机 Chrome 版本并下载匹配的驱动from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # webdriver-manager 会自动检测 Chrome 版本并下载对应驱动 service Service(ChromeDriverManager().install()) driver webdriver.Chrome(serviceservice) driver.get(https://www.example.com) driver.quit()ChromeDriverManager().install()会做三件事读本机 Chrome 版本、查询匹配的驱动版本、下载并缓存到本地Windows 下默认在~/.wdm目录。下次运行时如果缓存命中就不会重复下载。这个方案适合个人开发和快速原型但在 CI 环境里要注意缓存策略否则每次构建都重新下载会拖慢流水线。不过 webdriver-manager 也有翻车的时候它依赖网络请求去查版本信息如果公司网络有限制或者接口变动就会卡住。所以生产环境我还是倾向于手动管理驱动版本把 chromedriver.exe 作为项目资产一起版本控制。4. 避坑与排查版本对了但跑不起来的情况4.1 坑一SessionNotCreatedException 但版本号看起来是对的现象Chrome 是 136.0.7103.114ChromeDriver 也是 136.0.7103.x但启动就报SessionNotCreatedException。原因Chrome 后台自动更新了实际运行的版本和你查到的版本不一致。Chrome 的更新是静默的注册表里写的版本可能还是旧的但内存里跑的是新版本。解决完全退出 Chrome包括后台进程重新打开chrome://version/确认。或者在任务管理器里把所有 Chrome 进程杀掉再查。更彻底的做法是关掉 Chrome 自动更新在测试机上锁定版本。4.2 坑二chromedriver.exe 被杀毒软件拦截现象驱动文件明明在路径也对但代码报WebDriverException: chromedriver executable needs to be in PATH或者直接超时。原因Windows Defender 或第三方杀毒软件把 chromedriver.exe 当成可疑程序隔离了。ChromeDriver 的行为模式启动浏览器、注入脚本确实容易被误判。解决把 chromedriver.exe 所在目录加入杀毒软件白名单。如果是公司统一管理的终端可能需要找 IT 加例外规则。这个坑很隐蔽因为文件看起来还在但实际已经被隔离了。4.3 坑三多版本 Chrome 共存时 binary_location 没设对现象代码跑起来打开的是旧版 Chrome或者打开 Chrome 后页面行为异常。原因系统里装了多个 Chrome比如稳定版 测试版 便携版options.binary_location没指定或者指错了Selenium 用了默认路径的 Chrome但 ChromeDriver 是按另一个版本下载的。解决始终显式设置binary_location并且在代码注释里写清楚这个路径对应哪个版本。如果做多版本兼容测试把不同版本的 Chrome 和对应的驱动分目录存放用配置文件管理路径映射。4.4 坑四Chrome 自动更新导致 CI 流水线突然挂掉现象昨天还跑得好好的自动化测试今天 CI 上全部失败报版本不匹配。原因CI 机器上的 Chrome 自动更新到了新版本但项目里锁定的 ChromeDriver 还是旧版。解决在 CI 环境里禁用 Chrome 自动更新。Windows 下可以通过组策略或注册表关闭# 关闭 Chrome 自动更新需要管理员权限 reg add HKLM\SOFTWARE\Policies\Google\Update /v AutoUpdateCheckPeriodMinutes /t REG_DWORD /d 0 /f或者更简单的方式在 CI 脚本开头加一步每次构建时自动查询并下载匹配的驱动。这样虽然多花几秒下载时间但不会因为版本漂移导致流水线挂掉。4.5 坑五headless 模式下窗口尺寸和普通模式不一致现象同样的代码有界面时能跑通切到 headless 就找不到元素。原因headless 模式默认窗口尺寸和普通模式不同页面响应式布局会变化导致元素位置或可见性改变。解决在 options 里显式设置--window-sizeheadless 和普通模式用同一个值。新版 Chrome 的 headless 模式--headlessnew在渲染上更接近普通模式建议用新参数替代旧的--headless。5. 进阶技巧把版本管理做成自动化流程前面讲的都是手动对齐版本的方法但如果你维护的测试机不止一台或者 CI 每天跑几十次构建手动管理迟早会出错。我现在的做法是写一个启动脚本在每次运行测试之前自动完成版本检查和驱动更新。import json import subprocess import urllib.request from pathlib import Path DRIVER_DIR Path(rD:\drivers\chromedriver_current) def get_chrome_version(): 从注册表读取本机 Chrome 版本号 result subprocess.run( [reg, query, rHKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon, /v, version], capture_outputTrue, textTrue ) # 输出格式: version REG_SZ 136.0.7103.114 return result.stdout.strip().split()[-1] def get_matching_driver_url(chrome_version): 查询 Chrome for Testing 接口找到匹配的驱动下载地址 major chrome_version.split(.)[0] api https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json with urllib.request.urlopen(api) as resp: data json.load(resp) # 从后往前找优先取最新的匹配版本 for item in reversed(data[versions]): if item[version].startswith(major .): for dl in item[downloads].get(chromedriver, []): if dl[platform] win64: return item[version], dl[url] raise RuntimeError(f未找到匹配 Chrome {chrome_version} 的驱动) def ensure_driver(): 确保本地驱动与 Chrome 版本匹配 chrome_ver get_chrome_version() driver_ver_file DRIVER_DIR / version.txt if driver_ver_file.exists(): cached driver_ver_file.read_text().strip() if cached.split(.)[0] chrome_ver.split(.)[0]: return # 大版本一致直接复用 driver_ver, url get_matching_driver_url(chrome_ver) print(fChrome {chrome_ver} - 下载 ChromeDriver {driver_ver}) # 下载并解压省略解压细节可用 zipfile 模块 # ... DRIVER_DIR.mkdir(parentsTrue, exist_okTrue) driver_ver_file.write_text(driver_ver) if __name__ __main__: ensure_driver()这段脚本的核心逻辑是读本机 Chrome 版本 → 查接口找匹配驱动 → 比对本地缓存 → 不匹配就下载。get_chrome_version用注册表查询get_matching_driver_url从后往前遍历版本列表优先取最新的匹配版本。缓存策略是只比对大版本号因为小版本差异通常不影响兼容性。几个参数需要根据实际情况调整DRIVER_DIR改成你自己的驱动存放目录如果公司网络访问不了外部接口需要把 JSON 文件提前下载到本地改成读本地文件解压部分我用了zipfile模块但没展开写实际使用时注意解压后把chromedriver.exe放到DRIVER_DIR根目录。这个脚本我放在 CI 的 setup 阶段执行每次构建前跑一次耗时大概两三秒有缓存的情况下。自从加了这个步骤因为版本不匹配导致的流水线失败基本没再出现过。血泪经验就是版本对齐这件事能自动化就别手动手动迟早会忘。还有一个细节值得注意如果你用的是selenium4.x 版本webdriver.Chrome()的初始化方式跟 3.x 有区别executable_path参数被移到了Service对象里。网上很多老教程还在用webdriver.Chrome(executable_path...)的写法在 4.x 里会报TypeError。遇到这种报错先检查 selenium 版本别急着怀疑驱动。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →