OSX 修复 Selenium Chromedriver 启动错误 spawn 未知系统错误 -86 错误 CPU 可执行文件类型?

OSX fix Selenium Chromedriver launch error spawn Unknown system error -86 Bad CPU type in executable?

2021 年 1 月 6 日下午,我在 OSX 下的 Selenium Protractor 测试突然停止工作并出现神秘错误

spawn Unknown system error -86

我做了一些研究,发现错误编号 86 与

相同
Bad CPU type in executable

和 运行 下面将我的 chromedriver 二进制文件的 cpu 架构与我的系统进行比较:

% file chromedriver_87.0.4280.88
chromedriver_87.0.4280.88: Mach-O 64-bit executable arm64
% uname -a
Darwin kobl179273m 19.6.0 Darwin Kernel Version 19.6.0: Thu Oct 29 22:56:45 PDT 2020; root:xnu-6153.141.2.2~1/RELEASE_X86_64 x86_64
% uname -p
i386

如何修复我的 Selenium 使用的 chromedriver 二进制文件,以便它可以 运行 在我的 Intel x64 mac 上并清除“系统错误 -86”或“错误 CPU 类型”消息?

编辑:这个答案应该被视为弃用 既然 webdriver-manager 中的潜在错误已经修复。更好的解决方案是升级到最新版本的 webdriver-manager。如果人们需要使用仍然存在错误的 webdriver-manager 的旧版本,下面的答案可能会有用。

根据上面 Deepak Srinivasan 的评论,此错误是由 https://github.com/angular/webdriver-manager/issues/476

引起的

根本原因: ChromeDriver 团队在其 Apple Silicon ARM 构建的 Chromedriver 的文件名末尾添加了“_m1”——但是硅和英特尔版本的 chrome driver文件名中有“mac64”,版本号完全一样。这导致 webdriver-manager 始终下载 Chromedriver 的硅版本,即使在英特尔 mac 上也是如此。 作为一般解决方案,如果您使用的是 Intel mac.

,只需避免使用文件名中包含 _m1 的 chromedriver

解决方案 1: 降级到 Chrome 86.0.4240.198 和 Chromedriver 86.0.4240.22。这些版本协同工作,并且是在对 Silicon ARM 提供新的有问题的支持之前的最新版本

Chrome86下载页面: https://google-chrome.en.uptodown.com/mac/download/2920124

在 Chrome 中禁用 auto-updates:https://superuser.com/questions/1359017/how-do-i-disable-automatic-updates-of-google-chrome-on-mac-os-x

Chromedriver 86: https://chromedriver.storage.googleapis.com/index.html?path=86.0.4240.22/

% webdriver-manager update --versions.chrome=86.0.4240.22

解决方案 2:修改 webdriver-manager npm 包以指向正确的 chromedriver(感谢来自 angular github issue page 的 ciekaway此修复)

修改以下文件

node_modules/webdriver-manager/built/lib/files/file_manager.js

或者,如果使用量角器

node_modules/protractor/node_modules/webdriver-manager/built/lib/files/file_manager.js

靠近 downloadFile 方法顶部的第 166 行,添加以下行以从文件名中删除“_m1”:

fileUrl.url = fileUrl.url.replace(/_m1/, '');

需要在以

开头的.then块开始之后
binary.getUrl(binary.version()).then(fileUrl => {

它还需要在下一次引用 fileUrl 之前。
例如:

binary.getUrl(binary.version()).then(fileUrl => {
    binary.versionCustom = fileUrl.version;
    fileUrl.url = fileUrl.url.replace(/_m1/, '');
    let filePath = path.resolve(outputDir, binary.filename());

请注意,此解决方案是临时的。它将被 npm install 覆盖。 Chromedriver and/or webdriver-manager 团队可能会解决这个问题,此时您应该清除 webdriver-manager 的修改版本并从npm.

https://github.com/angular/webdriver-manager/issues/476 中描述了该问题。 现在已在 12.1.8 中修复此问题,因此只需更新到该 webdriver 管理器即可。

对于大多数用户来说,这可以通过

来完成
npm uninstall protractor && npm install protractor
npm uninstall protractor && npm install protractor

适用于 macOS Catalina 版本 10.15.6 (19G73)

就我而言,我使用 Rails 和 Capybara 进行功能测试。对我有用的是

  1. 首先,找到实际的 chromedriver 位置 运行ning:

    which chromedriver
    
    # Which returned:
    
    /Users/alex/.webdrivers/chromedriver
    
  2. 然后,通过 Homebrew 安装 chromedriver

    brew install chromedriver
    
  3. 然后,删除旧的 chromedriver 参考:

    rm /Users/alex/.webdrivers/chromedriver
    
  4. 现在,link 旧的 chromedriver 参考用 brew 安装的那个:

    ln -s /usr/local/bin/chromedriver /Users/alex/.webdrivers/chromedriver
    
  5. 然后,打开Finder应用程序,然后点击Go菜单,然后点击Go to folder ...选项,然后输入这条路线:

    /usr/local/Caskroom/chromedriver/
    
  6. 您应该会看到一个文件夹,其中包含您安装的 chromedriver 版本,如下所示:

    88.0.4324.96
    
  7. 进入该文件夹,您应该会看到 chromedriver 二进制文件。

  8. 右击它,然后点击Open

    现在,您应该得到一个终端 window 弹出输出:

    Last login: Sun Jan 31 12:29:15 on ttys001
    /usr/local/Caskroom/chromedriver/88.0.4324.96/chromedriver ; exit;
       ~  /usr/local/Caskroom/chromedriver/88.0.4324.96/chromedriver ; exit;
    Starting ChromeDriver 88.0.4324.96 (68dba2d8a0b149a1d3afac56fa74648032bcf46b-    refs/branch-heads/4324@{#1784}) on port 9515
    Only local connections are allowed.
    Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
    ChromeDriver was started successfully.
    
  9. 最后按Ctrl+C停止执行退出终端window.

现在,您应该可以 运行 水豚测试了。

如果您使用 webdrivers gem,请升级它:

bundle update webdrivers