尧图精选

Selenium安装chromedriver全攻略:版本匹配与环境变量配置详解

🕒 发布时间:2026/10/1 6:25:02 📁 来源:尧图网络
我记得第一次用Selenium做自动化测试的时候pip install selenium执行得很顺利代码也是从官方文档直接抄的结果运行到driver webdriver.Chrome()这一行控制台直接给我泼了一盆冷水WebDriverException: Message: chromedriver executable needs to be in PATH。当时我还以为是selenium没装好愣是在各种版本问题里折腾了好几个钟头。后来才搞明白Selenium本身只是一个自动化协议和客户端库真正干活的“手”是Chrome浏览器旁边的那个webDriver——chromedriver。下面我从这个最容易被忽视的环节讲起把下载、安装、配置、验证和排错完整走一遍。如果你正在被“驱动装不上”“版本对不上”“环境变量配了没用”这种问题困扰或者刚想入坑Selenium建议你把这篇文章当成一份安装手册来用。1. 为什么Selenium离不开一个“中间人”1.1 第一次跑自动化脚本时最常见的报错在Selenium的所有报错里chromedriver executable needs to be in PATH可能是出场率最高的一个。它出现的位置非常固定通常是webdriver.Chrome()这一行因为Selenium在创建一个Chrome实例时会去寻找一个名为chromedriver的可执行文件。找不到就直接抛异常而不是等你要操作页面的时候才报错。这个报错信息对新手其实很不友好因为它只说了“需要增加一个可执行文件到PATH”没有告诉你这个文件是什么、从哪来、怎么放。我见过不少人卡在这一步甚至怀疑是Python版本、Selenium安装包出了问题在乱七八糟的环节里浪费了一整天。其实问题非常朴素浏览器没有“遥控器”你没法让Selenium隔空指挥Chrome。1.2 WebDriver在Selenium架构中扮演的角色要理解为什么会这样得先搞清楚Selenium的整体结构。Selenium并不是一个浏览器插件也不会直接操作浏览器。它由三部分组成运行在脚本里的客户端库、浏览器对应的WebDriver驱动、以及浏览器本身。以Chrome为例这三者分别是selenium这个Python包、chromedriver、Google Chrome。它们之间的关系可以理解成一个餐厅的传菜过程。你的脚本是点菜的客人Chrome是厨房而chromedriver就是那位传菜的服务员。客人把“打开百度”“点击登录按钮”写进菜单服务员要把这些需求翻译成后厨能听懂的语言再把结果端回给客人。如果没有这位服务员菜单就只能停在客人手里厨房一点反应都没有。具体到技术实现上Selenium客户端会通过HTTP协议把命令发到chromedriver的某个端口chromedriver接下来会把这些命令转成Chrome能理解的原生操作并最终通过Chrome DevTools ProtocolCDP驱动浏览器。浏览器执行完操作后把结果原路返回。正因如此只要你的电脑上没有chromedriver这个“翻译官”脚本就一步都跑不动。1.3 WebDriver、Chrome、Selenium三者的版本关系很多人以为Selenium装好就等于自动化环境装好了实际上还有一个隐藏条件chromedriver和Chrome浏览器的大版本必须一致。比如Chrome 120的浏览器就建议使用120.x版本的chromedriver。版本差太远即便文件路径配好了浏览器也很可能在创建session那一步拒绝你。这里还有一个误区需要澄清Windows上安装chromedriver时很多人执着于64位驱动其实到目前为止chromedriver for Windows通常只有一个win32架构的压缩包64位的Windows系统同样运行它。别在架构选择上太纠结真正需要纠结的是版本号。2. chromedriver版本匹配最容易翻车的一环2.1 版本对应关系不是玄学网上经常有人问“为什么我的webdriver.Chrome()报session not created”十有八九是版本不匹配。chromedriver从某个版本开始版本号直接跟随Chrome的大版本。Chrome的版本格式类似120.0.6099.109chromedriver也是同样的格式只要大版本号都是120基本就可以用。小版本有点差异通常不影响但主版本必须严格一致。这里有个值得注意的细节早期chromedriver版本号并不是这样的。在Chrome 62/63时代驱动版本叫2.37.544315这类数字。如果公司的老项目里还锁着这种驱动版本那么它对应的是非常老的Chrome拿到今天的新Chrome上肯定会挂。看到这种版本号正确的做法不是硬配置而是去Chrome官方历史版本列表里重新找匹配当前浏览器的新驱动。2.2 版本不匹配时的典型报错版本不匹配时错误信息其实很容易读懂但初学者看到一长串英文就慌了。典型报错是selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 120.0.6099.109 with binary path C:\Program Files\Google\Chrome\Application\chrome.exe报错信息已经写得很直白当前这个chromedriver只支持Chrome 114而你的浏览器是120。解决思路有两种要么把Chrome降回114要么把chromedriver升到120.x。对于多数项目升级驱动远比降级浏览器来得靠谱。2.3 查看本机Chrome版本并选择对应驱动如何查看本机Chrome版本方法很简单在浏览器地址栏输入chrome://version回车第一行就是完整的版本号也可以在右上角菜单里进入帮助-关于Google Chrome。拿到版本号后去官方渠道下载chromedriver。官方页面经历了调整老地址chromedriver.chromium.org在多数情况下会引导到新的Chrome for Testing页面也就是googlechromelabs.github.io/chrome-for-testing/。在这个页面里能找到稳定版、测试版等不同的通道和对应的下载链接。一定要认准官方来源不要从第三方下载站随便拉一个包那些包轻则带广告重则可能被注入恶意代码。我整理了一张常见大版本对应示意表Chrome主版本chromedriver主版本示例版本号125125125.0.6422.xx122122122.0.6261.xx121121121.0.6167.xx120120120.0.6099.xx114114114.0.5735.xx下载前先核对“支不支持当前Chrome版本”别凭印象随便下。3. 三个平台下的chromedriver下载与安装实操3.1 Windows下载zip、解压、配置PathWindows用户的操作路径比较固定。第一步打开Chrome for Testing页面找到对应版本的Windows压缩包下载下来是一个zip。第二步把压缩包解压到一个稳定的目录比如C:\WebDriver\解压后里面有一个chromedriver.exe文件。然后进入系统环境变量配置。右键“此电脑”-属性-高级系统设置-环境变量在“系统变量”列表里找到Path点击编辑新建一行填入C:\WebDriver。注意填的是解压后的目录不是C:\WebDriver\chromedriver.exe更不是zip文件路径。配置完成后重新打开一个cmd窗口输入chromedriver --version如果能看到版本号说明已经进入PATH。很多人在这一步反复失败原因是修改环境变量后没有重开终端。PATH这个环境变量是在终端启动时读取的旧窗口不会自动刷新。所以看到“不是内部或外部命令”时先别怀疑配置过程把命令行窗口全部关掉再重开一次。3.2 macOS不只下载解压还要处理权限macOS用户的流程和Windows类似但多了一个权限障碍。下载时要根据芯片选择mac-arm64还是mac-x64。苹果芯片M1/M2/M3优先选arm64Intel芯片选x64。如果选错了架构运行时会报无法执行或内核崩溃相关错误。解压后建议把chromedriver移动到/usr/local/bin/下面让系统默认路径能直接找到。此时第一个坑马上会出现运行时macOS提示“无法打开因为无法验证开发者”。这是Gatekeeper在作怪。官方下载的chromedriver同样会被拦因为苹果只认经过App Store或开发者公证的应用。解决办法是执行一行命令手动移除隔离属性sudo xattr -d com.apple.quarantine /usr/local/bin/chromedriver之后再运行chromedriver --version应该就通了。如果还不行检查一下文件是否有执行权限sudo chmod x /usr/local/bin/chromedriver顺便提醒一句如果你用的是M系列芯片本机Chrome也需要是ARM版本。如果Chrome本身是x86的驱动反而要选x64两者架构要对应。这个细节很容易被忽略。3.3 Linux服务器无头环境下的驱动安装Linux服务器上装chromedriver通常是为了部署自动化测试任务或爬虫服务多数场景没有图形界面。步骤是下载linux64.zip解压把文件放到/usr/local/bin/然后赋予执行权限unzip chromedriver-linux64.zip sudo mv chromedriver /usr/local/bin/ sudo chmod x /usr/local/bin/chromedriver如果系统提示缺少共享库比如error while loading shared libraries: libnss3.so说明还缺运行Chrome所需的基础依赖。Debian/Ubuntu系系统可以执行sudo apt-get update sudo apt-get install -y libnss3 libx11-6 libxcb1 libxext6 libxi6 libxtst6 libatk-bridge2.0-0 libgbm1装完这些chromedriver --version一般就能正常输出了。注意Linux环境下常见的问题是启动Chrome时没有显示设备会报Missing X server or $DISPLAY。解决办法是在Python代码里给Chrome加上--headlessnew参数。如果项目依赖xvfb也可以用xvfb-run包一层这里不做重点展开。3.4 不想折腾环境变量用代码直接指定驱动路径配置环境变量虽然标准但并不是唯一办法。如果你只是想在某个项目里用或者当前用户没有权限改系统环境变量完全可以在代码里直接指定驱动路径。这也是我实际项目里更常用的方式因为不同项目可能依赖不同版本的驱动写死在脚本里反而更容易控制。from selenium import webdriver from selenium.webdriver.chrome.service import Service service Service(/usr/local/bin/chromedriver) driver webdriver.Chrome(serviceservice) driver.get(https://example.com) print(driver.title) driver.quit()每一行都值得解释Service负责管理外部驱动的生命周期构造时传绝对路径可以绕开PATH查找driver.get打开指定网页print(driver.title)输出页面标题用作验证driver.quit()是收尾动作如果没有这一行进程不会自己退出后台会残留chromedriver。4. 初始化WebDriver的代码写法与验证4.1 用最简代码验证驱动是否已经通驱动装完下一步就是验证。用一个最短的脚本测试整条链路from selenium import webdriver driver webdriver.Chrome() driver.get(https://example.com) print(driver.title) driver.quit()如果打印出Example Domain说明驱动环境完全正常。如果这里抛异常问题大概率还是出在前面几步路径没配好、版本不匹配或者文件被系统拦截。注意如果你没有配置环境变量这段最简代码会报错这时要用Service指定路径。4.2 常用Options参数与使用场景实际项目里裸奔式的webdriver.Chrome()很少见因为真实环境总有各种需求。最常见的是无头模式、禁用沙箱、固定窗口尺寸等。这些都可以通过chrome.options参数设置from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headlessnew) options.add_argument(--no-sandbox) options.add_argument(--disable-gpu) options.add_argument(--window-size1920,1080) options.add_argument(--disable-dev-shm-usage) driver webdriver.Chrome(optionsoptions) driver.get(https://example.com) print(driver.title) driver.quit()逐一说明--headlessnew是无头模式浏览器不出现在桌面上适合服务器--no-sandbox通常在Linux root用户或Docker容器里必须加否则Chrome会拒绝启动--disable-gpu在部分云主机上能避免显卡驱动问题--window-size是为了保证页面按指定分辨率渲染很多响应式页面截图时会用到--disable-dev-shm-usage是容器环境下的常见保命参数因为/dev/shm太小会导致页面渲染崩溃。4.3 进阶验证驱动就绪后定位一个div/ul/li组合下拉框驱动安装成功只是起点你很快就会遇到真正的页面自动化难题。搜索引擎上有个很典型的问题就是selenium怎么定位下拉框元素——注意这里说的不是原生select下拉框而是前端用divulli组合出来的自定义下拉框。这种结构在主流前端框架里太常见了。原生下拉框可以用Select类处理自定义下拉框就没这个便利只能老老实实去点li。比如页面结构是这样的div classcustom-select ul classoptions li>from selenium.webdriver.common.by import By driver.get(https://example.com/page) select_btn driver.find_element(By.CLASS_NAME, custom-select) select_btn.click() option driver.find_element(By.XPATH, //li[text()选项二]) option.click()这个例子的意义不止于“定位一个元素”而是告诉你只要能正常往下执行说明前面辛辛苦苦装的chromedriver已经真正在替你操控浏览器了。如果你的脚本能走到点击按钮这一步安装这件事就算彻底过关了。5. 实测踩坑记录装chromedriver时最容易遇到的几个问题5.1 PATH配置好却仍然提示找不到驱动这个问题我在Windows上踩得最深。现象是环境变量里明明加了C:\WebDriver新开的cmd里where chromedriver能查出来但Python脚本一跑还是报“executable needs to be in PATH”。最后的根子在于运行脚本的进程不是终端里启动的。比如你用的是PyCharm里的Run按钮或者Jupyter NotebookIDE继承的PATH可能是它自己启动时保存的那份而不是你改完系统变量后的那份。解决办法很简单完全退出IDE再重新打开让新PATH生效。如果是跑在系统服务里那就必须重启服务或机器。还有一种情况是把变量名填错了。Windows环境变量有用户变量和系统变量之分如果你在用户变量里加了路径但是当前登录的用户不是跑任务的服务账户那服务账号那边自然读不到。自动化任务如果挂在Jenkins这类工具下面记得把路径配到系统变量里或者直接用绝对路径的Service写法。5.2 版本不匹配、浏览器自动更新引发的批量失败另一个高频坑是“驱动版本没问题但浏览器悄悄升级了”。Chrome默认开启了自动更新可能前一周还好好的某天CI上全部用例在创建session时挂掉查下来才发现Chrome 121变成了Chrome 122而chromedriver还停在121。我在实际项目中的对策是把浏览器升级流程纳入控制。一种是让CI流水线每次运行前自动去下载与当前Chrome完全匹配的驱动另一种更彻底——使用Chrome for Testing提供的固定版本因为Chrome for Testing版本本身不会自动更新驱动也去同一个通道下形成版本锁定。这样环境才真正可复现。5.3 macOS的隔离属性与Linux的权限问题这两个平台各有一个典型问题。macOS上几乎所有从网页下载的chromedriver都会被打上com.apple.quarantine隔离标记导致“无法打开/已损坏”。解决方案在前面已经提过用xattr -d com.apple.quarantine处理。如果嫌每个文件都处理太麻烦也可以在系统设置的“安全性与隐私”里手动允许。Linux上更多是权限和依赖问题。解压出来的chromedriver默认带执行权限但如果你通过Windows拖拽或者FTP传输再解压权限可能会丢失。轻则Permission denied重则cannot open shared object file。养成习惯移动完文件后立刻执行chmod x能省很多事。5.4 杀毒软件把chromedriver当病毒处理这个坑在国内环境尤其常见。chromedriver本质上是一个可以在浏览器外控制浏览器的程序行为上很像某些恶意软件。火绒、360等安全软件都出现过误杀的情况。如果你运行时报chrome not reachable去安全软件的隔离区看一眼十有八九能找到被隔离的chromedriver.exe。处理方式不是关掉杀毒软件而是把它加进白名单。毕竟自动化项目以后还要反复下载、升级驱动每次都被删太痛苦。另外下载时尽量只从官方渠道获取减少安全策略拦你的概率。我再用一张表把这几个高频问题汇总一下错误现象根因解决办法chromedriver executable needs to be in PATH路径未配置或终端未刷新配置环境变量并重启终端/IDEsession not created: This version of ChromeDriver only supports ...chromedriver与Chrome主版本不一致下载匹配的chromedriverPermission denied 或 cannot open shared object fileLinux驱动没有执行权限chmod x chromedriver无法打开因为无法验证开发者macOS Gatekeeper隔离xattr -d com.apple.quarantinechrome not reachable驱动被隔离或Chrome启动崩溃加白名单检查headless参数Missing X server or $DISPLAY无图形界面环境未开无头模式代码加--headlessnew5.5 老版本驱动看到2.37.544315这类版本号要警惕最后单独说一个容易被忽略的冷门问题。网上有很多教程是在两三年前甚至更早写的里面会直接给出chromedriver2.37.544315这样的版本号。如果你照着这个配置去下载就算真的找到了历史包它也只能驱动Chrome 62/63放到今天的Chrome上必然会崩。遇到老旧教程请务必把它里面的下载地址和版本号当成参考思路而不是现成答案。版本匹配永远以当前浏览器的实际版本为准不要迷信任何一个写死的版本号。6. 安装完成后建议你按这个顺序做一次自检6.1 按顺序检查的六个步骤当你发现脚本还是跑不起来不要病急乱投医。我建议按下面的顺序排查效率会高很多先手动打开Chrome确认浏览器本身能正常运行。如果浏览器都起不来别谈驱动。打开终端执行chromedriver --version确认驱动能被系统找到以及输出的版本号是多少。检查这个版本号的大版本和chrome://version里看到的Chrome版本是否一致。不一致就下载匹配版本。在Python里用Service方式写绝对路径跑一遍最简脚本绕开环境变量因素。如果还报错看异常信息里“binary path”这段确认它找到的Chrome路径是不是你预期的那份Chrome。有些机器上装了多个Chrome可能连到另一个版本。查看安全软件隔离区、文件权限和隔离属性排除系统拦截。这六步几乎能覆盖九成以上的安装问题。不要上来就重装selenium更没必要重装Python那都是冤枉路。6.2 我的做法用一个下载脚本锁住版本我个人现在的习惯是在项目里放一个download_chromedriver.py脚本根据当前Chrome版本自动下载对应驱动而不是每次手动去网页上找。核心思路并不复杂从Chrome for Testing的JSON接口里找到匹配版本的chromedriver下载链接然后自动解压到指定目录。大致框架如下import json import urllib.request import zipfile import platform chrome_version 120.0.6099.109 system_key win64 if platform.system() Windows else linux64 url https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json with urllib.request.urlopen(url) as resp: data json.load(resp) # 从JSON中匹配chrome_version拿到对应chromedriver的下载URL # 下载后解压到项目根目录下的drivers/文件夹这样不管是同事换电脑还是CI重新搭环境只要跑一下脚本驱动版本就固定下来了不再依赖人工记忆。安装chromedriver这件事本身不难但它正好踩在“看似简单、细节极多”的区间里。把版本、路径、权限这三个核心问题提前想清楚后面做自动化测试就能少一大半糟心事。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →