编辑:由于 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(感谢 ciekaway 来自angular github 问题页面的此修复)
修改以下文件
node_modules/webdriver-manager/built/lib/files/file_manager.js
或者,如果使用量角器
node_modules/protractor/node_modules/webdriver-manager/built/lib/files/file_manager.js
在第 166 行附近的 downloadFile 方法顶部附近,添加以下行以从文件名中删除“_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 下载修复程序。