【问题标题】:OSX fix Selenium Chromedriver launch error spawn Unknown system error -86 Bad CPU type in executable?OSX 修复 Selenium Chromedriver 启动错误产生未知系统错误 -86 可执行文件中的错误 CPU 类型?
【发布时间】:2021-04-13 13:04:14
【问题描述】:

突然在 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”或“Bad CPU type”消息?

【问题讨论】:

  • 看来 chromedriver 现在支持 Apple Silicon ARM 架构,并且“webdriver-manager update --versions.chrome=”现在总是从 chromedriver.storage.googleapis.com 获取 chromedriver 的 arm64 版本,而不是x86_64 构建。我试图弄清楚如何强制 webdriver-manager 下载 intel x86 版本。
  • 问题是直到 chrome 版本 86 只有一个版本的 mac64 chromedriver。但是从 chrome 版本 87 开始。chrome mac64 和 mac64_ml 有两个二进制文件。只下载了用于 arm64 架构的 mac64_ml 所以修复需要在 webdriver_manager chrome_xml.js 中完成。
  • 有一个未解决的问题。 github.com/angular/webdriver-manager/issues/476
  • 顺便说一句,错误代码 86 可以通过回滚到 Chrome 86 来修复,这完全是巧合

标签: macos selenium webdriver selenium-chromedriver apple-silicon


【解决方案1】:

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

bundle update webdrivers

【讨论】:

    【解决方案2】:

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

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

    来完成
    npm uninstall protractor && npm install protractor
    

    【讨论】:

    • 我用最新版本的 Protractor 运行了一个新的npm install 并修复了它。谢谢。
    • 我将此标记为首选答案,因为尽管我的其他答案中的信息可能对将来遇到未知系统错误 -86 的任何人有用,但对于大多数看到错误的人来说对于 Chromedriver 的 _m1 Silicon Arm 版本,最简单的解决方案是继续升级到更新版本的量角器和修复它的 webdriver-manager。
    • 这对某些人来说可能是常识,但我必须进入我的 mac 的 usr/local/lib/node_modules` 并删除 webdriver-manager 目录,然后再运行 npm install。在我这样做之后,事情奏效了。顺便说一句,重新安装最终在我最近安装的 .nvm 目录的 bin 中,通过运行 which webdriver-manager 找到。
    【解决方案3】:

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

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

    根本原因: ChromeDriver 团队在其 Apple Silicon ARM 版本的 Chromedriver 的文件名末尾添加了“_m1”——但 Silicon 和 Intel 版本的 chromedriver 在文件名中都有“mac64”,并且版本号完全相同。这会导致 webdriver-manager 始终下载 Chromedriver 的 Silicon 版本,即使在 Intel mac 上也是如此。 作为一般解决方案,如果您使用的是 Intel mac,则只需避免使用文件名中包含 _m1 的 chromedriver。

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

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

    在 Chrome 中禁用自动更新: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 和/或 webdriver-manager 团队可能会解决此问题,此时您应该清除 webdriver-manager 的修改版本并从 npm 下载修复程序。

    【讨论】:

    • 尝试使用解决方案 1 进行此操作,但后来尝试运行量角器测试时出错。错误:E/launcher - SessionNotCreatedError:无法创建新服务:ChromeDriverService。驱动信息:driver.version:未知
    • 原来我必须指定版本,像这样:webdriver-manager start --versions.chrome 86.0.4240.22
    • 我尝试了解决方案 1,但我得到了与 @user1328889 相同的错误。我使用了 ./node_modules/.bin/webdriver-manager start --versions.chrome=86.0.4240.198 但这给了我这个错误:E/start - Selenium Standalone 不存在。使用 webdriver-manager update --standalone 安装。我确实在我的 selenium 文件夹中看到了 selenium-server-standalone-3.141.59.jar。
    • 解决方案 #1 的另一个问题是,即使在禁用更新后,chrome 仍会自动更新到版本 88。它在关于 chrome 设置中显示 86,但是当您右键单击应用程序信息时,您可以看到版本为 88。由于此测试失败并出现以下错误:essionNotCreatedError: session not created: This version of ChromeDriver only support Chrome version 86当前浏览器版本为 88.0.4324.96,二进制路径为 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
    • 谢谢@emery。我尝试了 npm uninstall protractor && npm install protractor,现在它可以工作了。
    【解决方案4】:

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

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

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

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

      brew install chromedriver
      
    3. 然后,删除在先前位置找到的旧 chromedriver 引用:

      rm /Users/alex/.webdrivers/chromedriver
      
    4. 现在,将旧的 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

      现在,您应该会弹出一个带有输出的终端窗口:

      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停止执行并退出终端窗口。

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

    【讨论】:

    • 这是一组用于在 Rails/Capybara 框架中更新 Chromedriver 的特定说明,可以更通用地回答“如何在 Rails/Capybara 框架中更新 Chromedriver”这个问题。感谢您的贡献。
    【解决方案5】:
    npm uninstall protractor && npm install protractor
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2018-12-14
      相关资源
      最近更新 更多