
在 Ubuntu 上给 Chromium 安装最新版 ChromeDriver这事儿看着简单真正动手弄过的都知道坑有多深。最常见的就是版本号对不上浏览器是 151 系列驱动却是 140 系列一启动 Selenium 就甩一个红通通的SessionNotCreatedException而且报错信息还写得模棱两可新手根本不知道去哪查。这篇文章把这套流程从原理到实操完整捋一遍。我会先讲清楚为什么 Chromium 和 ChromeDriver 的版本必须严格对应然后给你三种安装方案的选型对比再手把手走一遍当前最新的下载、部署、验证流程顺手把我在真实环境里踩过的坑、排过的雷全部列出来。不管你是在物理机、虚拟机还是 WSL 里用 Ubuntu照着做基本都能一次搞定。1. 版本匹配逻辑为什么 ChromeDriver 必须跟着 Chromium 走1.1 浏览器和驱动的“遥控器”关系很多新手把 ChromeDriver 当成一个独立软件觉得“装最新的就对了”。这其实是个误解。ChromeDriver 本质上是一个翻译器它负责把 Selenium 这类自动化工具发出的命令翻译成浏览器能理解的内部指令。你可以把它当成电视机的遥控器遥控器必须先知道电视的遥控协议版本按下去才有反应。Chromium 每次大版本升级内部协议都可能微调。比如 140 系列和 154 系列的 DevTools 协议就有差异。如果一个 140 的遥控器去按 154 的电视电视压根不理会。ChromeDriver 也一样它内部只实现了特定浏览器版本支持的协议子集版本跨度一旦拉大命令要么执行不了要么直接拒绝启动会话。所以“安装最新版本 ChromeDriver”这句话正确的理解应该是安装与你当前 Chromium 版本匹配的、最新的 ChromeDriver。真正的“最新版本”指的不是官网首页那个大版本号而是和你浏览器精确对应的 release 版本。1.2 版本号怎么对才算“对”Chrome/Chromium 和 ChromeDriver 的版本号都有 4 段比如154.0.6519.0。关键看前三位154、0、6519。官方要求是前三位必须完全一致第四位可以有微小差异通常不影响使用。我见过不少人只对到第一位比如浏览器是 154.x装了 140.x 的驱动觉得“都是三位数开头差不多”。这就大错特错了。判断版本是否匹配最靠谱的方式是打开终端分别跑两个命令看输出# 查看 Chromium 或 Chrome 版本 chromium --version # 或者如果是谷歌 Chrome google-chrome --version # 查看 ChromeDriver 版本 chromedriver --version对比两个输出的前三位版本号。如果一致说明匹配没问题如果不一致继续往下看实操步骤替换驱动即可。1.3 版本不匹配时的典型报错特征提前认识一下这些报错真遇到的时候心里有底SessionNotCreatedException: This version of ChromeDriver only supports Chrome version 140session not created: Chrome failed to start: exited normallyunknown error: cannot find Chrome binary驱动启动后日志里出现INFO: Launched chrome但紧接着就报错退出几条报错指向完全不同的问题但 80% 的情况最后都能归结为版本匹配失败、二进制文件找不到、环境变量没配好这三大类。后面我会单独开一节专门做排查。2. 动手前先确认环境系统、架构、浏览器现状2.1 确认 Linux 发行版和 CPU 架构安装前花 30 秒确认三件事系统发行版、系统架构、是否已经装了浏览器。指令很简单# 发行版信息确认是 Ubuntu 多少 cat /etc/os-release | head -n 2 # 系统架构x86_64 还是 aarch64ARM uname -m为什么要先看架构因为现在很多云主机、开发板用的是 ARM 架构Chrome for Testing 官方下载地址里赫然分着linux64和linux-arm64两种包。你要是把 x86 的驱动塞到 ARM 系统里运行直接报 “Exec format error”特别莫名其妙。我自己吃过这个亏。之前在 ARM 开发板上编译过 Chromium忘了驱动也要对应架构浪费了大半天排查看不出来问题最后file chromedriver一看才发现是 x86 的二进制。2.2 检查系统里已有的浏览器版本再确认系统里到底装了哪种浏览器which chromium chromium-browser google-chrome google-chrome-stable 2/dev/null这里有个关键背景要提Ubuntu 从 22.04 开始chromium-browser其实是一个指向 snap 版本的转发命令不再是传统的 deb 包。而 Ubuntu 20.04 及其以上其他有些版本装的还是 deb 版 Chromium。两种来源的 Chromium 装驱动的路径完全不一样这个坑下文单独讲。如果你发现系统里三种命令都找不到说明还没装浏览器。有两种选择装 Google Chromedeb 包wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.debARM 架构需用对应架构包然后sudo dpkg -i安装直接用下文的 Chrome for Testing 免安装版 Chromium不需要系统性安装解压即用2.3 先刷新系统和软件源安装之前执行一次完整的系统更新这是很多人跳过的步骤。Chromedriver 依赖的libnss3、libatk-bridge2.0-0等库如果不能那个版本后面启动会各种莫名其妙sudo apt update sudo apt upgrade -y这一步特别重要尤其是装完驱动后 Chrome 启动时报error while loading shared libraries: libnss3.so的十有八九是系统库版本太旧。提前刷新能省不少麻烦。3. 三种安装方案选型别再死磕 apt 老包了3.1 方案一apt 直接安装不推荐但需要知道sudo apt install chromium-chromedriver这条命令很多人都试过。问题在于 Ubuntu 仓库里的这个包版本更新极其滞后。仓库维护者不可能每出一个新版本就同步一次经常落后小版本半年、大版本两三个版本。你的 Chromium 是 154仓库里却还是 140 驱动装了基本等于白装。另外 apt 自带的驱动大部分是精简构建有些新特性没编译进去。如果你的自动化脚本用到了新增的 DevTools 命令装了也会报不支持。所以这个方案我只建议在要求不高、浏览器版本恰好和仓库包接近时才考虑。3.2 方案二官方 Chrome for Testing 包最推荐的通用方案Chrome for Testing 是 Google 官方推出的测试专用分发渠道专门服务于自动化场景。它同时提供免安装版 Chromium 和配套 ChromeDriver两者的版本号严格对应下载地址也完全公开。这套方案的好处有三点版本一定配套、不需要 root 权限就能运行、更新机制简单重新下载替换即可。对跑 Selenium、Puppeteer、Playwright 的人来说是目前最稳的路径。3.3 方案三Selenium Manager 自动接管省心但有条件Selenium 4.6 以上内置了 Selenium Manager你只要写代码时不手动指定 ChromeDriver 路径它会在首次运行时自动去匹配浏览器版本并下载驱动。这方案对数人来说体验最好一条代码都不改完全托管。但我不建议新手一上来就用。因为自动下载依赖网络环境而且出了问题你看不到中间过程排查起来很被动。我更建议先手动装一遍搞清楚里头的机制再决定要不要交给工具托管。三种方案对比如下维度apt 包Chrome for Testing 手动包Selenium Manager版本匹配度低滞后严重官方同步严格匹配自动匹配通常准确安装难度低中极低可追溯性低依赖仓库维护高文件在手可控中自动完成不透明适合场景临时测试、要求不高的环境CI、生产、长期稳定维护本地快速验证、个人项目4. 完整实操下载最新版并与 Chromium 打通4.1 获取当前最新准确版本号先说一下版本现状。Chrome/Chromium 每六周左右发一次大版本目前已经滚动到 154 系列。如果你的浏览器是 154.x那驱动也必须找 154 系列对应版本。最准确的做法不是去搜索引擎找“最新版下载”而是直接查询官方 API。Chrome for Testing 维护了两个 JSON 接口https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json只给最近一个稳定版本和它的下载链接https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json给历史所有版本的下载链接我自己习惯用第一个接口内容短、信息直接。执行curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json | grep -A 20 stable返回的 JSON 里stable节点的version字段就是当前最新稳定版本号。比如如果显示154.0.6519.0操作时就把下面的版本号全替换成这个。4.2 下载并解压 ChromeDriver拿到版本号后下载地址其实是有规律的。官方下载包分chromedriver-linux64.zip和chromedriver-linux-arm64.zip两种按架构选择。直接在终端执行# 定义版本号变量方便后续替换 CHROME_DRIVER_VERSION154.0.6519.0 # 根据架构下载对应包 # 如果 uname -m 显示 aarch64把 linux64 改成 linux-arm64 wget https://storage.googleapis.com/chrome-for-testing-public/${CHROME_DRIVER_VERSION}/linux64/chromedriver-linux64.zip # 解压 unzip chromedriver-linux64.zip # 把驱动放到 PATH 目录并赋执行权限 sudo mv chromedriver-linux64/chromedriver /usr/local/bin/ sudo chmod x /usr/local/bin/chromedriver # 验证 chromedriver --version执行完最后一步看到输出类似ChromeDriver 154.0.6519.0 (...)驱动就装好了。提示如果系统提示wget: command not found说明这台机器没有装 wget。用sudo apt install -y wget unzip先装上unzip 通常也是缺的一并装了。4.3 为什么要把驱动放到 /usr/local/bin/usr/local/bin是所有用户在 PATH 里默认会搜索的目录之一而且它的优先级高于/usr/bin。放在这里的程序不需要为当前用户额外配置环境变量。当然如果你没有 sudo 权限比如公司机器也可以解压到~/bin然后把下面这段加到~/.bashrc里export PATH$HOME/bin:$PATH然后执行source ~/.bashrc让配置生效。但无论如何我要多说一句检查环境变量配置是否正确用which chromedriver如果它能输出路径恭喜你配置没问题。4.4 如果系统里是 snap 版 Chromium直接换方案这是 Ubuntu 22.04 用户最常遇到的问题。先在你的终端跑一下chromium --version如果命令找不到或者输出前面带了snap的提示信息说明你用的是 snap 版 Chromium。snap 包的隔离机制导致 ChromeDriver 无法直接驱动它因为 Chromium 进程被沙箱关在一个独立环境里外部驱动发过去的命令根本传不进去。解决方式两种卸载 snap 版 Chromium装 Google Chrome deb 包搭配对应版 ChromeDriver直接用 Chrome for Testing 的免安装 Chromium它和配套驱动放在一起解压即可第二个方案更适合自动化环境而且不需要系统级安装# 和驱动同版本的 Chromium 下载 wget https://storage.googleapis.com/chrome-for-testing-public/${CHROME_DRIVER_VERSION}/linux64/chrome-linux64.zip unzip chrome-linux64.zip # 解压后的 chrome-linux64 目录里有 chrome 可执行文件 # 后续代码里指定二进制路径为 ~/chrome-linux64/chrome 即可这时候which chromium查不到任何东西是正常的因为系统里压根没装常规浏览器。Selenium 代码里指定二进制路径就行。4.5 用 Python Selenium 验证整个链路驱动和浏览器都就位后写个最小验证脚本跑一把。以 Python 环境为例pip install selenium然后写一个最简单的测试脚本from selenium import webdriver from selenium.webdriver.chrome.service import Service options webdriver.ChromeOptions() options.binary_location /root/tools/chrome-linux64/chrome # 如果用系统 Chrome 可以注释掉这行 options.add_argument(--headlessnew) # 无头模式服务器环境必备 options.add_argument(--no-sandbox) # root 用户运行必须加 service Service(/usr/local/bin/chromedriver) # 指向刚才装好的驱动 driver webdriver.Chrome(serviceservice, optionsoptions) driver.get(https://example.com) print(driver.title) driver.quit()跑通了这个脚本打印出Example Domain说明 ChromeDriver 和 Chromium 之间的链路已经彻底打通后面你想做什么自动化都有基础了。注意--no-sandbox这个参数只在 root 用户下必须加普通用户可以直接去掉。原因很简单Chromium 在 root 下默认不让启动沙箱需要显式关闭才能跑起来。5. 实际操作中的高频坑和排查思路5.1 报错速查表这里是我在实践中整理的一份常见问题速查表基本覆盖了绝大多数场景现象根本原因解决方案This version of ChromeDriver only supports Chrome version xxx驱动和浏览器版本不匹配重新下载与浏览器前三位版本一致的驱动cannot find Chrome binary没告诉驱动浏览器路径或系统里没装浏览器用options.binary_location指定浏览器路径chromedriver: command not found驱动没放进 PATH 目录检查/usr/local/bin是否存在该文件或补环境变量error while loading shared libraries: libnss3.so系统依赖库版本过旧执行sudo apt update sudo apt install -y libnss3 libatk-bridge2.0-0Failed to move to new namespace: Permission deniedDocker/CI 环境中沙箱权限不足加--no-sandbox --disable-dev-shm-usageExec format error驱动架构和系统架构不符用uname -m确认架构后重新下载404 下载失败版本号写错或该版本无对应包回官网 API 确认版本号再下载5.2 下载网址慢或 400 的解决办法有朋友遇到过wget下载 404 的情况其实大多数时候是版本号拼错了。Chrome for Testing 的下载链接必须是完整版本号不能拿主版本号154去拼链接。如果你拿不定哪个版本号能下载直接把known-good-versions-with-downloads.json里对应的 URL 粘出来用最保险。如果你所处的网络环境访问不了 Google 相关域名也别硬扛在两个机器之间用 U 盘或者内网传输把 zip 包拷过去就行。驱动是纯二进制文件拷贝过去以后记得重新执行chmod x其他没有区别。5.3 WSL 2 和虚拟机环境下的特殊处理很多人在 WSL 2 或者虚拟机里跑 Ubuntu这时候浏览器启动经常会出现图形相关的报错。核心原因是 WSL 默认环境没有完整的显示服务Chromium 尝试初始化 GPU 和窗口管理器时会出现各种问题。解决方案就是在启动参数里加几个开关options.add_argument(--headlessnew) options.add_argument(--disable-gpu) options.add_argument(--no-sandbox) options.add_argument(--disable-dev-shm-usage)--disable-dev-shm-usage这个参数尤其重要。WSL 里/dev/shm默认只有 64MBChromium 一开多标签页瞬间打满然后整个浏览器直接崩掉。加上这个参数后Chromium 会改用/tmp存放共享内存问题就消除了。如果你虚拟机里系统是带桌面的但跑自动化脚本时黑屏或者不渲染优先检查的也是这几个参数而不是怀疑机器配置不够。5.4 环境变量配错导致终端打不开的急救这个坑虽然和 ChromeDriver 关系不大但一旦遇到特别致命。有些朋友在~/.bashrc里写 PATH 时手滑export PATH/usr/local/bin本来是要追加结果覆盖了连ls、cat、sudo这些基础命令全部失效终端一开就报command not found。遇到这种情况别慌用绝对路径把环境变量救回来/usr/bin/env PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bash这行命令会重新设定一个完整的 PATH并启动一个新的 shell。在这个新 shell 里编辑~/.bashrc把刚才写错的那行改掉source ~/.bashrc就恢复了。给写完驱动环境变量的朋友一个建议写完先开个新终端试一下常用命令再继续往下操作。6. 自动化环境里版本维护的一点心得体会6.1 要不要每次大版本都手动更新驱动Chrome/Chromium 六周一个大版本如果你只是在本地偶尔跑跑脚本完全可以不追新。浏览器先用着驱动也继续用旧版只要两者版本匹配功能上没有任何区别。真正需要紧跟版本的是跑 CI 流水线或者生产环境爬虫的人因为 Docker 镜像里往往是最新的 Chromium驱动不跟着更新就会立刻出问题。6.2 我的做法一个检查脚本搞定版本同步我自己的习惯是写一个小脚本每次要跑自动化之前先检查一下官方最新版本和本地版本的差异不一致就自动下载。脚本核心逻辑很简单不依赖 jq用 Python 解析 JSONimport json import os import subprocess import urllib.request # 获取本地驱动版本 local_version subprocess.run( [chromedriver, --version], capture_outputTrue, textTrue ).stdout.split()[1] # 获取官方最新稳定版 data json.load(urllib.request.urlopen( https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json )) latest data[channels][Stable][version] print(f本地: {local_version}) print(f官方最新: {latest}) if local_version.split(.)[:3] ! latest.split(.)[:3]: os.system(f wget -q {data[channels][Stable][downloads][chromedriver][0][url]} unzip -o chromedriver-linux64.zip sudo mv chromedriver-linux64/chromedriver /usr/local/bin/ ) print(驱动已更新) else: print(版本已匹配无需更新)这个脚本我每隔一段时间就手动跑一次一旦输出版本不一致不用动任何测试代码只替换驱动即可。自动化环境里版本同步最大的意义就在于此代码不用改环境自己保持可用状态。6.3 最后分享一个实操细节装完驱动别急着写一大段业务代码先用上面那个最小化脚本跑一次通。一个月前我再处理同事的问题时他死活说是“Selenium 代码有毛病”结果我过去一看驱动是 140Chrome 是 154不到一分钟就定位了。养成先验证版本、再跑脚本的习惯能帮你节约大量排查时间。