OSX исправляет ошибку запуска Selenium Chromedriver, вызывающую неизвестную системную ошибку -86, плохой тип процессора в исполняемом файле?

#macos #selenium #webdriver #selenium-chromedriver #apple-silicon

#macos #селен #webdriver #selenium-chromedriver #apple-silicon

Вопрос:

Внезапно во второй половине дня 6 января 2021 года мои тесты Selenium Protractor в OSX перестали работать с загадочной ошибкой

 spawn Unknown system error -86
 

Я провел некоторое исследование и обнаружил, что номер ошибки 86 совпадает с

 Bad CPU type in executable
 

и выполнил следующее, чтобы сравнить архитектуру процессора моего двоичного файла chromedriver с моей системой:

 % 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
 

Как я могу исправить двоичный файл chromedriver, используемый моим Selenium, чтобы он запускался на моем Intel x64 mac и очищал сообщение «системная ошибка -86» или «Неправильный тип процессора»?

Комментарии:

1. Похоже, что chromedriver теперь поддерживает архитектуру Apple Silicon ARM, а «обновление webdriver-manager —versions.chrome=<version>» теперь всегда использует сборку chromedriver arm64 из chromedriver.storage.googleapis.com вместо сборки x86_64. Я пытаюсь выяснить, как заставить webdriver-manager вместо этого загрузить сборку intel x86.

2. Проблема в том, что до версии chrome 86 была только одна версия для mac64 chromedriver. Но начиная с версии Chrome 87. Для chrome mac64 и mac64_ml есть два двоичных файла. Загружается только mac64_ml, который предназначен для arm64 arch, поэтому исправление необходимо выполнить в webdriver_manager chrome_xml.js .

3. Существует открытая проблема. github.com/angular/webdriver-manager/issues/476

4. Кстати, совершенно случайно, что код ошибки 86 можно исправить, откатившись к Chrome 86

Ответ №1:

Проблема описана в https://github.com/angular/webdriver-manager/issues/476 . Теперь это исправлено в 12.1.8, поэтому просто обновите этот webdriver manager.

Для большинства пользователей это может быть достигнуто с помощью

 npm uninstall protractor amp;amp; npm install protractor
 

Комментарии:

1. Я запустил новую npm install версию с последней версией Protractor, и это исправило ее. Спасибо.

2. Я отмечаю это как предпочтительный ответ, поскольку, хотя информация в моем другом ответе может быть полезна всем, кто в будущем получит unkonwn system error -86, для большинства людей, которые видят ошибку из-за выпуска Chromedriver _m1 Silicon Arm, самым простым решением будет продолжить и обновитьк более новой версии protractor и webdriver-manager, которая исправляет это.

3. Для некоторых это может быть здравым смыслом, но мне пришлось зайти в usr/local/lib/node_modules моего mac и удалить webdriver-manager каталог перед запуском npm install . После того, как я это сделал, все заработало. Кстати, повторная установка оказалась в корзине моего недавно установленного каталога .nvm, найденного при запуске which webdriver-manager .

Ответ №2:

Редактировать: этот ответ следует считать устаревшим теперь, когда основная ошибка в webdriver-manager была исправлена. Лучшим решением было бы перейти на новейшую версию webdriver-manager. Приведенный ниже ответ может быть полезен, если людям нужно использовать более старую версию webdriver-manager, в которой все еще есть ошибка.

Согласно комментарию Дипака Шринивасана выше, эта ошибка вызвана https://github.com/angular/webdriver-manager/issues/476

Основная причина: команда ChromeDriver добавила «_m1» в конец имени файла для своих Apple Silicon ARM-версий Chromedriver, но и в версиях chromedriver для Silicon, и для Intel в имени файла указано «mac64», а номер версии точно такой же. Это приводит к тому, что webdriver-manager всегда загружает кремниевую сборку Chromedriver, даже на компьютерах Intel Mac. В качестве общего решения просто избегайте использования chromedriver с именем файла _m1, если вы используете Intel Mac.

Решение 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

Хромированный привод 86: https://chromedriver.storage.googleapis.com/index.html?path=86.0.4240.22 /

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

Решение 2. Измените пакет npm webdriver-manager, чтобы указать на правильный 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
 

В верхней части метода DownloadFile около строки 166 добавьте следующую строку, чтобы удалить «_m1» из имени файла:

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

Это должно быть после начала .затем блок, который начинается с

 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. Chromedriver и / или команда webdriver-manager, вероятно, устранят эту проблему, после чего вам следует очистить модифицированную версию вашего webdriver-manager и загрузить исправление из npm.

Комментарии:

1. Пытался сделать это с помощью решения 1, но позже получил ошибку при попытке запустить тест транспортира. Ошибка: E / launcher — SessionNotCreatedError: не удалось создать новую службу: ChromeDriverService. Информация о драйвере: driver.version: неизвестно

2. Оказалось, мне пришлось указать версию, например: webdriver-manager start —versions.chrome 86.0.4240.22

3. Я попробовал решение 1, но я получаю ту же ошибку, что и @user1328889. Я использовал ./node_modules/.bin/webdriver-manager start —versions.chrome= 86.0.4240.198, но это дало мне эту ошибку: E /start — Selenium Standalone отсутствует. Установка с обновлением webdriver-manager — автономная. Я вижу selenium-server-standalone-3.141.59.jar однако в моей папке selenium.

4. Еще одна проблема с решением № 1 заключается в том, что Chrome продолжает автоматическое обновление до версии 88 даже после отключения обновлений. В настройках Chrome отображается 86, но при щелчке правой кнопкой мыши на информации о приложении вы можете увидеть, что версия 88. Из-за этого тесты завершаются с ошибкой: essionNotCreatedError: сессия не создана: эта версия ChromeDriver поддерживает только версию Chrome 86 Текущая версия браузера 88.0.4324.96 с двоичным путем / Applications/ Google Chrome.app/Contents/ macOS / Google Chrome

5. Спасибо @emery. Я попробовал npm uninstall protractor amp;amp; npm install protractor, и теперь он работает.

Ответ №3:

Для macOS Catalina версии 10.15.6 (19G73)

В моем случае я работал с Rails и Capybara для тестирования функций. То, что сработало для меня, было

  1. Сначала найдите фактическое местоположение запущенного chromedriver:
     which chromedriver
    
    # Which returned:
    
    /Users/alex/.webdrivers/chromedriver
     
  2. Затем установите chromedriver через Homebrew:
     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 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.

Комментарии:

1. Это конкретный набор инструкций для обновления Chromedriver в Rails / Capybara framework, который может быть более общим ответом на вопрос «Как мне обновить Chromedriver в Rails / Capybara framework». Спасибо за вклад.

Ответ №4:

 npm uninstall protractor amp;amp; npm install protractor
 

Ответ №5:

Если вы используете webdrivers gem, обновите его:

 bundle update webdrivers