资讯动态

ARM架构MacBook安装Selenium与ChromeDriver完整指南

发布时间:2026/10/20 7:05:19 来源:尧图企业网站定制
刚开始我也以为很简单结果在M1芯片的MacBook上装Selenium和ChromeDriver折腾了整整一个下午。网上搜到的大多数教程还是针对Intel芯片的老路子照着敲命令各种报错。后来我把整个流程理清了才发现关键就在于ARM架构和x86架构的差异以及随之而来的版本匹配、路径配置问题。这篇文章把我踩过的坑和最终跑通的方案完整记录下来如果你手上也是M1或M2/M3系列的MacBook按这个顺序操作基本可以半小时搞定。1. 为什么M1芯片会成为Selenium的拦路虎ARM与x86的架构歧路1.1 先说清楚M1芯片和Intel Mac到底差在哪M1芯片是Apple自研的基于ARM架构的处理器跟Intel阵营的x86_64指令集是两个完全不同体系。大多数软件包在发布的时候会针对不同架构提供对应的编译版本。Selenium本身是纯Python库受架构影响不大问题出在ChromeDriver上。ChromeDriver是操控Chrome浏览器的桥梁它的本质是一个可执行二进制文件。在Intel Mac上你要下载的是mac-x64版本的ChromeDriver在M1芯片的Mac上理论上必须下载mac-arm64版本。如果拿错了系统直接提示“Bad CPU type in executable”完全无法运行。更麻烦的是macOS从Big Sur开始支持Rosetta 2转译很多开发者会在终端里通过Rosetta方式运行x86命令。这就导致你的终端可能输出的是arm64架构信息但实际用的却是Intel版的环境反过来你以为自己在ARM环境下操作系统却把x86的driver拉下来执行。这种混乱是M1初期各种Selenium安装教程失灵的核心原因。1.2 架构不匹配引发的连锁问题如果你忽略架构差异强行安装会碰到一连串问题。常见的表现是运行chromedriver --version时报“cannot execute binary file”或“Bad CPU type”Selenium启动浏览器时报WebDriverException: Message: chromedriver executable needs to be in PATH或者浏览器能起来但立刻崩溃报SessionNotCreatedException。这些表面错误背后的真实原因往往就是一个driver的架构或版本跟你的系统和浏览器不匹配。明白了这层逻辑排查起来就有方向了。另外要注意的是Chrome浏览器本身也存在两个架构版本。Mac App Store或者Chrome官方安装包会依据你的系统自动选择Apple Silicon版本但如果你之前是从某些第三方渠道下载的x86版Chrome那driver架构也得跟着是x64否则依然不兼容。所以安装顺序和版本检查非常关键这也就是为什么有些人照搬教程仍然失败的深层原因。2. 开工之前先体检三条命令搞清楚你的Mac状态2.1 芯片架构与系统版本检查任何安装动作之前先确认你的机器真实环境。打开终端依次执行下面三条命令uname -mM1/M2/M3系列芯片的MacBook输出结果是arm64如果是Intel芯片输出是x86_64。这里要特别留意如果你的终端是通过Rosetta方式打开的在M1芯片上也可能输出x86_64这种时候建议关掉终端从应用程序文件夹里找到终端右键选择“显示简介”取消勾选“使用Rosetta打开”再重新运行命令确认。sw_vers这条命令用于查看macOS版本号比如ProductName: macOSProductVersion: 14.5。macOS版本决定了Homebrew的安装方式以及ChromeDriver是否能被Gatekeeper拦截。目前绝大多数机器都在12及以上版本建议低于11的系统先升级再折腾。python3 --versionSelenium依赖Python环境确认Python版本大于3.7即可。M1芯片的MacBook自带Python3只是版本可能偏老建议后面用Homebrew或者官方安装包更新一下避免pip依赖解析出现问题。三条命令跑完记录下来arm64还是x86_64、macOS版本、Python版本后面所有安装决策都基于这三项参数。2.2 安装方案选型对比市面上常见的SeleniumChromeDriver安装方案有这么几种我列个对比表方案优点缺点适用场景Homebrew安装ChromeDriver命令简单、自动管理路径国内网络下载可能慢大多数用户推荐官网手动下载driver版本可控、路径清楚需要自己去官网找对应版本需要指定版本的项目通过Selenium Manager自动管理无需手动下载、Selenium 4.6内置国内网络环境可能拉取失败网络稳定时最省心使用x86版ChromeRosetta转译兼容旧的x86测试环境性能差、配置复杂仅限必须运行x86浏览器的场景我个人建议优先走Homebrew路线因为自动帮你装到正确的/opt/homebrew/bin目录不用手动配环境变量。这也是目前M1芯片Mac上最稳的组合下面实操部分就按这个方案展开。如果你不想装Homebrew也可以直接手动下载ChromeDriver二进制文件放到合适位置。这个备选方案我会在后面的章节一并给出方便对照选择。3. 全流程实操三步装好ChromeDriver并跑通Selenium3.1 第一步安装最新版Chrome浏览器虽然大部分人电脑上已经有Chrome但还是要确认一下版本号和架构。打开Chrome地址栏输入chrome://version查看“版本”那一行比如120.0.6099.234。同时注意“可执行文件路径”里是否包含Mac OS X还是Mac OS X (ARM64)字样后者代表Apple Silicon原生版本。如果你没有安装Chrome直接去官网下载安装包下载到的就是适配当前Mac架构的版本。安装过程很简单拖进Applications即可。这里特别提醒ChromeDriver的版本必须与Chrome主版本号保持一致主版本指第一个数字比如都是120小版本可以不完全一致但最好也尽量相近。确定好Chrome版本后面下载driver时才知道该选哪个。3.2 第二步使用Homebrew安装ChromeDriver先确认Homebrew是否已经安装终端运行brew --version如果提示找不到brew命令需要先安装Homebrew。M1芯片的Mac上Homebrew默认安装到/opt/homebrew目录并自动把可执行文件链接到/opt/homebrew/bin。安装命令是/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)注意M1芯片的MacBook即使通过此方式安装正常情况也是ARM版本安装完成后终端会提示你执行两条环境变量配置命令照做即可。如果Homebrew安装的是x86版本即被安装在/usr/local目录下那说明你的终端用Rosetta打开了请返回上文检查修正。接着安装ChromeDriverbrew install chromedriverHomebrew会检查ChromeDriver版本并自动拉取最适合当前系统的版本。由于Homebrew的安装包同样区分架构ARM Mac上自动下载的就是arm64版本这一步是最省心的地方。装完验证一下which chromedriver chromedriver --versionwhich输出的路径在/opt/homebrew/bin/chromedriver--version输出的版本号跟前面Chrome主版本一致就算成功。如果Homebrew安装的driver版本比Chrome新很多旧版Chrome会报版本不支持这种情况下面会专门讲怎么降级driver。3.3 备选方案手动下载ChromeDriver二进制文件有些场景你不方便用Homebrew或者公司网络对GitHub等源拉取受限那就手动下载。ChromeDriver的官方下载地址是Chrome for Testing的独立站点你需要在里面找到与你Chrome主版本号匹配的构建版本。以Chrome 120为例找到stable渠道下mac-arm64对应的压缩包文件名通常是chromedriver-mac-arm64.zip。下载完成后解压得到chromedriver可执行文件。把它移动到一个统一管理的目录比如mkdir -p ~/bin mv chromedriver ~/bin/然后把目录加到PATH编辑~/.zshrcecho export PATH$HOME/bin:$PATH ~/.zshrc source ~/.zshrc这一步的目的就是让系统能找到driver。Apple Silicon的Mac默认shell是zsh所以改的是.zshrc。手动方案的优点是对版本完全可控缺点是每次Chrome大版本升级时driver也得跟着手动更新相对麻烦。3.4 第三步安装Selenium并跑通第一个测试脚本ChromeDriver就绪后接着安装Selenium库。建议在Python虚拟环境里操作避免污染全局环境带来的依赖版本冲突python3 -m venv ~/selenium_env source ~/selenium_env/bin/activate pip install selenium这里用的是Selenium 4.x版本安装完成之后先写一个最简单的冒烟测试脚本验证整套链路通不通from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headlessnew) driver webdriver.Chrome(optionsoptions) driver.get(https://www.example.com) print(driver.title) driver.quit()把这段保存为test_selenium.py在虚拟环境里执行python test_selenium.py如果输出Example Domain说明Selenium已经成功操控Chrome打开网页并读取到了页面标题整条链路没有任何问题。如果你没加headless参数还会看到一个真实浏览器窗口打开并自动关闭视觉效果更直观。在M1芯片的Mac上跑Selenium脚本CPU占用非常低风扇几乎不转。对比我之前的Intel MacBookPro跑同样的脚本整个风扇会呼啸起来。这也是ARM架构在自动化测试场景下的一个很实际的优势。4. 版本匹配与常见报错排查实录4.1 高频错误速查表这里把M1 Mac上最常见的几个报错整理成表格方便对号入座错误信息出现条件核心原因解决方案Bad CPU type in executable终端执行chromedriverdriver架构错误换用arm64版driverchromedriver executable needs to be in PATH脚本启动浏览器系统没找到driver路径配置PATH或手动指定driver地址SessionNotCreatedException浏览器启动即退出Chrome与driver主版本不一致对齐两者版本号cannot find Chrome binary脚本启动浏览器Chrome路径异常或未安装Chrome通过options指定Chrome可执行文件路径ERROR: Failed to move and download手动下载解压失败下载不完整或权限不足重新下载并检查目录权限xattr: [Errno 1] Operation not permitted第一次运行drivermacOS Gatekeeper拦截执行xattr -d com.apple.quarantine命令4.2 三个高频问题的详细复盘问题一PATH里明明有chromedriver但Selenium还是报“needs to be in PATH”这个坑我在M1上遇到过好多次。排查思路分几步走先执行which chromedriver确认路径存在再echo $PATH看看当前终端环境是否包含driver所在目录。很多时候你改了.zshrc但忘了source或者开了新终端没读取配置。另外Selenium使用过程中如果你的Python执行环境是IDE而不是原生终端IDE可能不加载shell配置文件此时最稳妥的做法是在代码里直接指定driver绝对路径from selenium import webdriver from selenium.webdriver.chrome.service import Service service Service(executable_path/opt/homebrew/bin/chromedriver) driver webdriver.Chrome(serviceservice)这样就不依赖系统PATH更稳。问题二Chrome和ChromeDriver版本号对不上某开发者下载了一个最新版ChromeDriver结果运行时报错提示支持范围是Chrome 121-123而他电脑上是Chrome 120于是启动失败。其实ChromeDriver每个版本有明确的Chrome兼容范围版本不匹配在macOS上比Windows报错更隐晦经常是浏览器刚闪一下就没了。解决办法是去Chrome for Testing站点下载与Chrome版本匹配的历史版本。假设当前Chrome是120就找120.x系列的driver下载mac-arm64包替换Homebrew目录下的文件即可。问题三macOS提示无法验证开发者M1 Mac从网上下载的ChromeDriver被Gatekeeper标记为不受信任的开发者来源是很常见的。第一次执行时系统会弹窗提示无法打开。处理办法很直接xattr -d com.apple.quarantine ~/bin/chromedriver如果文件在/opt/homebrew/bin下通常不会遇到这个问题因为Homebrew安装时会自动处理。但手动放置的文件一定要执行这步否则后面运行driver时会一直卡在权限验证。4.3 两个容易被忽略的ARM架构隐藏坑除了上面三个常见问题M1芯片还有两个独有的坑值得单独拿出来说。第一个是ChromeDriver在ARM架构下对shell环境的敏感度更高。在Intel Mac上不管终端处于什么模式只要driver版本对了都能跑。M1的Mac上如果你在x86的shell里执行arm64的driver大概率直接报错反过来在arm64的shell里执行x86的driver同样报错。这就要求你固定一个架构环境。我自己的习惯是全程保持原生arm64环境避免任何Rosetta转译介入所有软件安装、脚本执行都基于这个前提。第二个坑是macOS系统升级后ChromeDriver的签名状态经常丢失。比如你升级了macOS原先一直正常的chromedriver忽然间运行不了提示签名无效或被篡改。这种情况需要重新执行一次xattr -d com.apple.quarantine或者干脆卸了driver重新用Homebrew装一遍。升级系统前最好先记好自己的ChromeDriver版本号如果升级后Chrome也跟着更新了driver版本必须同步对齐。5. Selenium Manager与进阶使用技巧5.1 Selenium Manager自动管理机制Selenium 4.6版本开始引入了一个叫Selenium Manager的组件它能在首次运行脚本时自动检测Chrome版本然后从对应源下载匹配的ChromeDriver并且自动缓存到本地目录。这意味着如果你网络环境良好根本不需要手动安装driver用原生方式写代码就行from selenium import webdriver driver webdriver.Chrome() driver.get(https://www.example.com) print(driver.title) driver.quit()Selenium Manager会自动完成driver的获取。在M1芯片的Mac上它默认会下载arm64版driver架构匹配在内部帮你处理好了。不过这个机制在国内网络环境下经常遇到下载超时或连接失败的情况。Selenium Manager的driver下载源在国外服务器这时候你就需要手动管理了。有两个思路一是直接禁用Selenium Manager手动指定driver路径回到前面提到的Service方式二是在虚拟环境里预先把driver下载好再配合Selenium Manager的缓存机制让它直接复用本地文件。按我的经验团队协作开发时手动指定driver路径的稳定性远大于Selenium Manager的自动拉取。毕竟不是每个人都网络通畅也不是每次都希望它静默下载文件。手动模式虽然配置繁琐但可控性更强排错逻辑也更透明。5.2 多版本ChromeDriver共存管理技巧很多做爬虫或者自动化测试的开发者电脑里往往不止一个浏览器版本。可能同时跑着Chrome稳定版、Chrome Beta版甚至Chromium内核的其他浏览器。每一种看到的ChromeDriver版本要求都不一样手动来回替换driver文件是极其麻烦的。我一般采用目录隔离的方式管理mkdir -p ~/.chromedriver/{120,121,122}每个版本目录放对应的driver二进制然后在脚本里根据目标浏览器版本通过executable_path参数动态选择import os version os.environ.get(CHROME_DRIVER_VERSION, latest) path_map { latest: /opt/homebrew/bin/chromedriver, 120: /Users/yourname/.chromedriver/120/chromedriver, 121: /Users/yourname/.chromedriver/121/chromedriver, } service Service(executable_pathpath_map.get(version))这样既不用频繁动系统级PATH又能保证不同项目的隔离性。如果同一时间要跑不同Chrome版本的测试用虚拟环境加这个目录映射方案的组合实测下来非常顺手。5.3 ARM架构下的性能调优经验既然已经买了M芯片的MacBook自动化测试的效率肯定是要利用一下的。几个实测下来的经验第一优先启用headless模式。M1芯片的GPU解码能力很强配合headless模式跑批量页面抓取速度和资源占用都比有头模式好很多。特别是跑大量页面截图任务GPU加速的效果比较明显。第二善用显式等待代替sleep。M芯片执行Python代码速度提升较大但页面渲染速度还是要看网络。用隐式等待或显式等待比固定sleep的脚本耗时要少很多尤其是页面元素比较多的时候。这里给一个我常用的写法from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By element WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, some-id)) )第三在写脚本时给Chrome设置用户数据目录避免每次都启动全新的profile。M1上加载扩展和缓存的速度很快通过指定--user-data-dir参数可以复用登录态这在调试需要登录的页面时能省下大量时间。5.4 从M1到M2/M3系列这套方案是否通用很多人会问M1的教程能用在M2或M3芯片的MacBook上吗答案是可以的。M2、M3系列同样是ARM架构Homebrew的安装路径、ChromeDriver的arm64版本、Selenium代码的写法完全一致。区别只在于个别系统版本导致的小差异比如M3标配的macOS版本更新Gatekeeper的策略更严格但处理方式跟前面描述的一致。如果你明年换上M系列的新机器这套安装流程和排错思路依然够用。本质问题还是那三件事架构、版本、路径。只要这三者对齐Selenium在Apple Silicon的环境下运行就是一个顺理成章的过程。6. 写在最后这套流程的小结与避坑提醒整个安装流程跑下来回到最初的问题。M1芯片MacBook上安装SeleniumChromeDriver最核心的就是理解ARM架构差异然后按照“确认架构—对齐版本—配置路径—写脚本验证”这个顺序推进。Homebrew是我目前用过最省心的方案没有之一。最后分享一个实在的小技巧装好之后把这三条验证命令用一个脚本存起来每次更换电脑或者升级系统后跑一遍基本十分钟内就能判断环境健康度uname -m chromedriver --version python -c from selenium import webdriver; dwebdriver.Chrome(); print(OK); d.quit()如果第三行能输出OK就意味着你的SeleniumChromeDriver在M1芯片上完全可用。这套检查逻辑从我第一次折腾到现在已经帮我在三台不同型号的M系列MacBook上快速完成了环境搭建。别被网上那些老教程误导认准ARM架构选对安装路径这个事真的不复杂。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑