ARTICLE DETAIL

资讯详情

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

Selenium+chromedriver完整安装指南:版本匹配、下载与排错实战

Selenium+chromedriver完整安装指南:版本匹配、下载与排错实战 做Web自动化测试绕不开Selenium。很多新人第一次接触这个框架就是在装驱动这一步被劝退的。Selenium库本身很好装pip一行命令就搞定但真正让环境跑起来还差一个关键角色——浏览器驱动。Chrome浏览器对应chromedriverFirefox对应geckodriverEdge对应edgedriver。这篇就专门讲Chrome这一支也就是Selenium chromedriver的完整安装全流程。我会跟你把三件事说清楚版本为什么必须匹配、chromedriver到底去哪下载、装完之后怎么验证和排错。照着做十分钟内你就能跑通第一个自动化脚本。无论你是测试转行、在校学生还是开发顺手想搞点自动化回归的人这篇文章都适用。内容不整虚的尽量直白能照着操作就行。1. 先搞明白Selenium、webDriver和chromedriver三者的关系1.1 Selenium是自动化框架但不是浏览器插件Selenium的全称是Selenium自动化测试框架它是Web应用自动化领域使用最广的工具集之一。它不是一个能直接安装的浏览器插件而是一整套规范和对应各编程语言的客户端库。你可以在Python里用pip安装selenium在Java里通过Maven引入selenium-java在Node.js里用npm装selenium-webdriver。不同语言写出来的脚本尽管语法不同底层都是通过同样的协议和浏览器驱动交互这个协议就是WebDriver协议。所以你理解Selenium时心里要有一个清晰的分层概念最上层是测试代码中间层是Selenium客户端库再往下是浏览器驱动最底层才是真正的浏览器。脚本里的点击输入这些操作是一层一层传递下去的。虽然你现在只是装个环境但这个结构弄清楚了后面遇到千奇百怪的报错时就不会抓瞎。因为十有八九报错就出在这个传递链条的某一层要么是驱动没起来要么是版本对不上要么是浏览器找不到。1.2 webDriver是脚本和浏览器之间的翻译官webDriver在Chrome里的具体形态就是一个小小的可执行文件chromedriver。它本身没有图形界面是一个本地服务进程。当你运行自动化脚本时Selenium库会启动chromedriver进程脚本里的每一条操作指令都会通过HTTP协议发送给chromedriverchromedriver再把指令转换成浏览器底层能识别的控制命令驱动浏览器去执行。反过来浏览器页面上返回的状态、元素信息也会经过chromedriver翻译回代码让脚本判断操作是否成功。拿生活里的事情来类比chromedriver就像是一个同声传译。演员脚本说的是中文电视台导演浏览器只听得懂英文同声传译把中文翻译成英文导演才能执行。你要是请了一个只会日语的翻译版本不对导演当场就懵了直接以报错的方式罢工给你看。这也是为什么每篇Selenium教程都会强调版本匹配的原因。1.3 为什么版本动不动就不匹配很多新手不理解Selenium库不都是最新的吗怎么驱动还要匹配原因在于chromedriver内部实现了Chrome DevTools ProtocolCDPChrome浏览器每次大版本升级都会对CDP协议里的很多细节做调整。老版本的chromedriver不认识新版浏览器的协议指令新版chromedriver也管不了太老的浏览器。Google为了维护这套机制从Chrome 115版本开始统一使用Chrome for TestingCfT体系来发布测试用的浏览器和chromedriver。旧教程里常用的那个下载页虽然还能访问但新版本驱动基本都迁移到CfT体系维护。所以很多老博客里的下载链接早就过期了你点进去发现没有你要的版本不要慌用新入口就行。理解了这个背景你后面找驱动、对版本号就不会被各种互相矛盾的老教程带偏。2. 装之前先做两件事查浏览器版本、定驱动版本2.1 查看Chrome版本号的两种方式在下载chromedriver之前第一步永远是确认本机Chrome浏览器的版本号。这个操作很简单但很多人会忽略往往装完驱动才发现版本对不上又回头来看版本号白白浪费时间。第一种方式在Chrome地址栏输入chrome://version然后回车。页面上会显示完整的版本信息包括Google Chrome 126.0.6478.127正式版本这样的字段。你要抓的就是第一个数字段126这是大版本号。后面的0.6478.127都属于内部细节可以先不用管。第二种方式点击浏览器右上角三个点选择帮助再点关于Google Chrome。弹出的页面会显示当前版本号同时自动帮你检查更新。如果你的Chrome很久没更新这里可能会触发升级升级完版本号会变那你得重新记一下。注意Chrome如果处于后台自动更新状态版本号可能在你不经意间就变了。所以正式运行自动化脚本之前建议确认一下当前实际的浏览器版本不要拿上次记住的版本号硬套。2.2 版本匹配原则大版本号必须对上小版本不用强求chromedriver的版本号格式和Chrome保持一致例如126.0.6478.127对应的是Chrome 126。匹配原则很简单大版本号必须一致。也就是说Chrome是126chromedriver就必须选126开头的版本。小版本号比如.126和.127这种差异通常不会影响正常使用但为了保险尽量选择接近当前浏览器的小版本号。这里有一个容易犯的错Chrome自动更新到大版本121了但驱动还停留在120。脚本一启动就报SessionNotCreatedException提示only supports Chrome version 120。遇到这个报错别怀疑代码先检查驱动版本。反过来驱动版本比浏览器新一两个小版本一般没问题但新太多也可能出现兼容问题。所以我的习惯是跑自动化之前先看一眼浏览器版本如果变了就去更新驱动宁可多花两分钟下载也不浪费一小时排查未知报错。2.3 从哪里下载chromedriver才靠谱下载chromedriver渠道选对很重要。官方入口在Chrome for TestingCfT页面Google会在这里维护各个版本Chrome对应的测试浏览器和chromedriver下载列表。进入页面后你会看到stablebetadevcanary几个通道一般选stable稳定通道然后在下面列表里找到与当前浏览器大版本一致的驱动下载。下载的压缩包通常是个zip里面就是chromedriver.exeWindows或者chromedrivermacOS/Linux的可执行文件。除了官方入口国内一些云服务商也会维护chromedriver的镜像下载源优点是下载速度快、不用跨网络访问。用的时候注意确认镜像源里的版本号是不是最新的我见过个别镜像更新不及时Chrome都出到126了镜像还停在120这时候下载就白费功夫。我的建议是优先官方其次选信任的云镜像下载完成后立刻用命令行验证版本号把下错版本的风险在第一关就堵死。3. chromedriver安装三步走下载、解压、配路径3.1 Windows系统下的安装步骤Windows是大多数自动化测试人员的首选环境我把步骤拆得细一些。假设你下载好的压缩包名字类似chromedriver-win64.zip先解压到任意临时目录解压后可以看到chromedriver.exe。这个exe就是驱动本体它可以放在任何位置但你得让系统知道它在哪里这里有两条路可以走。第一条路是配置环境变量PATH。在Windows里新建一个干净的驱动目录比如C:\webdrivers把chromedriver.exe复制进去然后右键此电脑选属性再点高级系统设置找到环境变量在系统变量里找到Path点编辑新增一行C:\webdrivers保存退出。配置完成后重新打开一个命令行窗口输入chromedriver --version能输出版本号就说明环境变量生效了。注意配置完环境变量后一定要重开终端窗口否则系统不会刷新PATH缓存。第二条路是不配置环境变量直接在代码里指定驱动的完整路径。比如驱动放在C:\webdrivers\chromedriver.exe你在Python里用Service类传入这个路径即可。这个方法更省事也避免了污染系统环境变量我强烈推荐新手用它。尤其在公司电脑、多用户环境里你没有权限改系统PATH代码内指定路径几乎是唯一解。3.2 macOS和Linux系统下的安装步骤macOS和Linux的安装逻辑类似步骤稍微不同。下载解压后你会得到一个名为chromedriver的可执行文件注意它没有.exe后缀。推荐把它移动到/usr/local/bin目录下因为该目录通常在系统默认PATH里驱动放进去后全局可用。移动文件用终端命令处理。假设解压后的文件在当前目录首先执行chmod x chromedriver给驱动添加可执行权限然后把文件复制到目标目录sudo cp chromedriver /usr/local/bin/。macOS如果遇到无法验证开发者的安全提示需要去系统设置里的隐私与安全性中手动允许这是因为chromedriver是Google公证过的程序但macOS Gatekeeper有时候会拦一下放行即可。Linux发行版如果用的是/usr/bin目录逻辑一样只是目标路径不同。macOS还有一个坑如果你是Apple Silicon的Mac下载时注意选择arm64版本不要下载x64版本否则驱动启动时可能会被Rosetta转译虽然有时候能用但性能有损耗而且偶尔会出些莫名其妙的Session报错。下载前看清压缩包名里的平台标识这个细节能省你不少事。3.3 验证chromedriver是否安装成功驱动到底装没装好验一下就知道。打开终端Windows是CMD或PowerShellmacOS/Linux是Terminal输入chromedriver --version回车。如果输出一行类似ChromeDriver 126.0.6478.126的版本信息说明驱动安装成功并且能被系统找到。如果提示chromedriver 不是内部或外部命令或者command not found说明执行文件所在路径不在PATH里检查你的环境变量配置。除了命令行验证还有一种更贴近实战的验证方式直接执行chromedriver不跟任何参数。如果驱动正常它会启动一个本地服务输出一行类似Starting ChromeDriver 126.0.6478.126 on port 9515的日志然后保持进程运行。这说明驱动已经可以作为WebDriver服务使用了。看到这个日志后按CtrlC停掉然后进入下一步用Python把整个链路打通。4. 用Python写第一个Selenium自动化脚本4.1 安装Selenium Python库环境的最后一块拼图就是Selenium库本身。Python环境里安装它非常简单用pip就行。建议在虚拟环境里操作避免污染全局环境。先创建虚拟环境python -m venv venv然后激活它。Windows下激活命令是venv\Scripts\activatemacOS/Linux下是source venv/bin/activate。激活环境后执行pip install selenium。默认会安装最新正式版目前稳定版本是4.x系列。Selenium 4相比3.x有不少变化最明显的一点就是驱动管理更规范了Service类和Options类的使用频率变高。装完之后可以用pip show selenium看一下安装路径和版本号确认安装成功。如果你的机器上Python有多个版本注意pip和python要对应上别用Python 3.9的pip装到Python 3.11的解释器目录里这种环境错位问题虽然低级但我确实见过不下三次。如果你嫌手动管理chromedriver麻烦Selenium 4.6以后官方还内置了Selenium Manager它会在缺少驱动时自动下载匹配版本的chromedriver。不过自动化测试环境讲究的是可控、可复现我还是建议你手动把驱动装好知道每一步发生了什么出了问题可以随时排查而不是靠工具偷偷替你选一个驱动反而不清楚到底用了哪个版本。4.2 两个能用的脚本写法环境变量版和指定路径版驱动装好、Selenium库也装好之后写个最短的脚本验证全链路。下面这个脚本只做一件事打开浏览器访问一个页面打印页面标题然后关闭。这是Selenium世界里最常见的Hello World。先看第一种写法前提是chromedriver在PATH里可以直接用。from selenium import webdriver driver webdriver.Chrome() driver.get(https://www.example.com) print(driver.title) driver.quit()这段代码里webdriver.Chrome()不带任何参数Selenium会在PATH里找chromedriver。找到后自动启动它然后打开空白的Chrome窗口执行get方法访问example.com。title属性会返回页面标题print在终端打印出来最后quit关闭浏览器并回收驱动进程。如果你运行后看到终端输出了类似于Example Domain的标题整条链路就通了。再看第二种写法适用于没有配置环境变量、驱动在某个具体路径下的场景。这也是我更推荐的写法因为它在代码里清清楚楚地声明了驱动的位置别人接手你的代码时一眼就能看懂不需要去猜环境变量里配了什么东西。from selenium import webdriver from selenium.webdriver.chrome.service import Service service Service(rC:\webdrivers\chromedriver.exe) driver webdriver.Chrome(serviceservice) driver.get(https://www.example.com) print(driver.title) driver.quit()注意这里的Service参数传的是驱动文件的绝对路径字符串前面加r表示原始字符串防止Windows路径里的反斜杠被当成转义字符。如果你用的是macOS或Linux路径写法类似/usr/local/bin/chromedriver。这两种写法都能跑通选哪一种取决于你当时怎么装的驱动。我的建议是哪怕你配好了环境变量也推荐在代码里显式声明Service方便项目内多人协作时环境保持一致。4.3 验证脚本能不能真的控制浏览器脚本跑完看到终端输出了页面标题这还不够最好再手动确认几个细节。第一浏览器窗口是不是真的被驱动起来了而且是自动打开的不是你手动点的。第二进程是否正常退出。如果你发现脚本执行完之后终端卡住不动或者有多个chromedriver进程残留多半是脚本异常中断驱动没有自动结束。这种情况可以在任务管理器Windows或活动监视器macOS里手动结束chromedriver进程然后在代码里用try/finally确保driver.quit()一定执行避免进程泄漏。from selenium import webdriver from selenium.webdriver.chrome.service import Service service Service(rC:\webdrivers\chromedriver.exe) driver webdriver.Chrome(serviceservice) try: driver.get(https://www.example.com) print(driver.title) finally: driver.quit()加上try/finally之后即使get方法抛异常quit也会执行驱动进程会被关掉。这一行代码的差距在本地跑一次可能看不出来但如果你在一个循环里反复启动浏览器不写finally会让进程越积越多最终把系统资源耗尽。这也是我一开始就强调要手动验证链路的原因把基础打扎实后面写复杂脚本时才会少踩坑。5. 安装和使用中常见的问题与排查5.1 SessionNotCreatedException版本不匹配的典型报错跑自动化脚本遇到最多的报错就是SessionNotCreatedException报错信息一般长这样session not created: This version of ChromeDriver only supports Chrome version 120。这个报错的意思非常直白你的chromedriver只支持Chrome 120但当前浏览器版本不是120。版本不匹配驱动拒绝创建会话。解决方法就是重新下载匹配的chromedriver替换旧的exe或可执行文件。替换时注意如果旧驱动还在缓存里终端或代码里可能仍然启动的是老文件。Windows下如果用环境变量确认C:\webdrivers目录下的exe已经换成新的如果用代码里Service指定路径确认路径指向的文件是新的。我有一个习惯替换驱动后先执行chromedriver --version确认输出的是新版本号再跑脚本。这个确认动作虽然简单但能帮你把问题隔离在环境问题和代码问题两个盒子之外。5.2 chromedriver闪退、无法启动的处理思路有时候版本没问题但驱动一启动就闪退或者浏览器刚弹出来就关闭。这种情况先从三个方向排查。第一个方向是文件损坏下载不完整的chromedriver一启动就会崩解决方法是删掉重下同时确认压缩包能否正常解压。第二个方向是权限问题Windows下可能被安全软件拦截macOS下可能是Gatekeeper拦截Linux下可能是执行权限没加分别用放行白名单、系统设置里允许、chmod x来解决。第三个方向是浏览器本体异常比如Chrome被卸载或者安装路径被改驱动启动后找不到浏览器就退出。我遇到过一个比较隐蔽的情况电脑上装了多个Chrome变体比如Chromium、Chrome测试版、Chrome正式版版本号各不相同驱动本来能正常工作但某次浏览器自动更新后实际启动的浏览器版本悄悄变了导致驱动启动后立刻崩溃。排查方式是设置Options里的binary_location强制指定使用哪个Chrome可执行程序让版本匹配关系固定下来而不是交给系统随机选择。5.3 定位下拉框会卡住divulli组合这样解决驱动装好了脚本能跑通了接着大概率就会碰到一类问题页面上下拉框是自定义的不是原生select元素。原生下拉框用Selenium的Select类处理很方便但前端框架经常自己封装下拉组件渲染出来是divulli的组合这时候Select类完全没用因为底层根本不是select标签。遇到这种控件正确的思路是模拟真人操作先点击下拉框容器等选项列表出现再点击目标选项。from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 点击自定义下拉框 driver.find_element(By.XPATH, //div[classcustom-select]).click() # 等待选项出现后点击目标选项 option WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, //ul[contains(class,options)]/li[text()北京])) ) option.click()这里的关键是显式等待。用WebDriverWait代替time.sleep它可以智能地等待元素出现后再操作不会白白浪费固定时间也不会因为页面加载慢而直接报错。很多人在定位这种非原生下拉框时失败不是因为元素定位表达式写错而是时序问题点击之后选项列表还没渲染出来脚本就去找元素结果找不到。用显式等待可以很优雅地解决。这段代码虽然只是定位问题的一个片段但它是Selenium实战里最有代表性的场景之一顺便一起说清楚。6. 一点个人体会与建议6.1 我的chromedriver管理习惯写了这么多年Selenium脚本我形成了一套固定的驱动管理习惯。第一专门建一个目录放所有版本的chromedriver按版本号建子文件夹例如C:\webdrivers\126\chromedriver.exe这样切换项目时不会互相覆盖。第二代码里永远用Service显式指定驱动路径配合一个记录浏览器和驱动版本号的配置文件团队里任何一个人克隆项目后都能三分钟跑起来。第三每次跑长期回归任务前先检查一下浏览器版本有没有自动更新更新了就顺手换驱动避免半夜跑用例时全部挂掉。6.2 新手上手Selenium的学习路径如果你刚接触Selenium自动化测试我建议不要一上来就追求复杂的框架封装先把环境弄稳再用一个最小脚本把链路跑通然后逐个去学元素定位、显式等待、页面对象模式。安装chromedriver是这条路上最小但最关键的关卡这一关过了后面的内容就好走很多。把这篇文章里的步骤完整走一遍你就拥有了一个可以继续往下深入打的基础环境。以后遇到冷门报错回来检查驱动版本和路径大概率能解决一半问题。
返回列表