Транспарант: WebDriverError: не удалось инициализировать sun.security.ssl.SSLContextImpl $TLSContext

Я просто не знаком с транспортиром, и я блокирован при запуске учебника. Я не могу найти истинный источник ошибки...

Что я сделал:

  • установить транспортир (npm install -g protractor)
  • обновить и запустить webdriver-manager
  • копировать/вставлять примеры файлов из учебника укладчика
  • запустить 'protractor conf.js'

Что я получаю:

[11:35:46] I/hosted - Using the selenium server at     http://localhost:4444/wd/hub
[11:35:46] I/launcher - Running 1 instances of WebDriver
[11:35:46] E/launcher - Could not initialize class sun.security.ssl.SSLContextImpl$TLSContext
[11:35:46] E/launcher - WebDriverError: Could not initialize class sun.security.ssl.SSLContextImpl$TLSContext
    at WebDriverError (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/error.js:27:5)
    at Object.checkLegacyResponse (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/error.js:639:15)
    at parseHttpResponse (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/http/index.js:538:13)
    at client_.send.then.response (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/http/index.js:472:11)
    at ManagedPromise.invokeCallback_ (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1379:14)
    at TaskQueue.execute_ (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2913:14)
    at TaskQueue.executeNext_ (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2896:21)
    at asyncRun (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2820:25)
    at /home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:639:7
    at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.createSession()
    at Function.createSession (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver.js:329:24)
    at Builder.build (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/selenium-webdriver/builder.js:458:24)
    at Hosted.DriverProvider.getNewDriver (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/built/driverProviders/driverProvider.js:37:33)
    at Runner.createBrowser (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/built/runner.js:198:43)
    at /home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/built/runner.js:277:30
    at _fulfilled (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/q/q.js:834:54)
    at self.promiseDispatch.done (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/q/q.js:863:30)
    at Promise.promise.promiseDispatch (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/q/q.js:796:13)
    at /home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/q/q.js:556:49
    at runSingle (/home/bmargogne/.nvm/versions/node/v6.8.1/lib/node_modules/protractor/node_modules/q/q.js:137:13)
[11:35:46] E/launcher - Process exited with error code 199

Примечания

  • Транспортир: v4.0.14
  • Java: openjdk 9-Ubuntu 9b134 (?)
  • Система: Ubuntu 16.04
  • NodeJS: v6.8.1
  • Я получаю тот же результат, используя "capability.browserName:" firefox "в conf.js

Любая помощь будет приветствоваться!

Ответ 1

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

Не удалось инициализировать класс sun.security.ssl.SSLContextImpl $TLSContext

по крайней мере в соответствии с журналом, который вы показываете, и предполагая, что все настройки для Protractor выполнены правильно.

Это "материал", поступающий из кода JDK.
Давайте посмотрим, почему сначала Java требуется в некоторых частях, так как это поможет нам понять немного вещей. Прямо на первой строке вашего журнала ясно, что вы используете сервер selenium (https://github.com/angular/protractor/blob/master/docs/server-setup.md).
Как видно из приведенной выше ссылки, серверу selenium нужен JDK, поэтому мы нашли одну "точку входа" Java.

Сервер selenium запускается с помощью webdriver-manager, поэтому в коде для webdriver-manager должен быть некоторый вызов для запуска java. Посмотрим, где это. Глядя на источник здесь
https://github.com/angular/webdriver-manager/blob/70614a23e289088c852f5c0162a947488ffc77e0/lib/cmds/start.ts

мы видим, что java будет запущен здесь

let seleniumProcess = spawn('java', args, stdio);

и эти аргументы определяются следующим образом:

let args: string[] = [];  

и это заполняется так называемым, например:

  if (osType === 'Linux') {
    // selenium server may take a long time to start because /dev/random is BLOCKING if there is not
    // enough entropy the solution is to use /dev/urandom, which is NON-BLOCKING (use /dev/./urandom
    // because of a java bug)
    // https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/1301
    // https://bugs.openjdk.java.net/browse/JDK-6202721
    args.push('-Djava.security.egd=file:///dev/./urandom');  

Я заметил, что вы упоминаете, что используете OpenJDK 9, который пока еще не заслуживает доверия, поскольку он по-прежнему не выпущен для общей доступности:
http://www.java9countdown.xyz/
http://openjdk.java.net/projects/jdk9/

Мое первое предложение. Используйте стабильную версию Java для производства, например 8 на данный момент, которая по умолчанию используется в моей машине Ubuntu 16.04.

Чтобы получить хорошее представление о том, где может возникнуть ошибка, я предлагаю прочитать следующую публикацию SO:
Инициализация SSLContext и первый ответ там, который я нашел очень поучительным в любом случае. Вы также можете прочитать здесь: https://www.java.com/en/configure_crypto.html.

Глядя на это, я бы предположил, что нужно запустить java со следующим системным свойством jdk.tls.client.protocols on (хотя значения по умолчанию должны быть в порядке...). Один из способов сделать это - добавить следующую строку

args.push('-Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2"');

например, прямо перед вызовом let seleniumProcess = spawn('java', args, stdio); в файле, указанном выше.

Что еще вы можете попробовать
Вы можете проверить, можете ли вы избежать этой ошибки, подключив ваш script напрямую к браузеру без вмешательства сервера селена. Это выполнимо, если вы запускаете локально на данный момент и должны быть быстрее, когда вы избегаете одного прыжка. В случае, если ваш браузер расположен удаленно (а не ваш случай на данный момент...), вы НУЖДЫ, чтобы использовать сервер selenium.

Как указано на странице настройки сервера selenium, с которой я связан вначале, эта возможность избежать использования этой функции действительно указана. Ключевой раздел в документации по настройке сервера selenium, в которой упоминается, приведен ниже.

Прямое подключение к драйверам браузера

Транспортер может протестировать непосредственно против Chrome и Firefox без использования Селен-сервер. Чтобы использовать это, в вашем файле конфигурации directConnect: true.

directConnect: true - ваш тест script напрямую связывается с Chrome Драйвер или Firefox, минуя любой сервер Selenium. Если это true, настройки для seleniumAddress и seleniumServerJar будут игнорируются. Если вы пытаетесь использовать браузер, отличный от Chrome или Firefox ошибка будет выброшена. Преимущество прямого подключения к драйверы браузера - это то, что ваши тестовые скрипты могут запускаться и запускаться быстрее.

Итак, взяв conf.js, который вы используете из учебника, вы добавите строку, определяющую эту дополнительную конфигурацию, т.е.

// conf.js
exports.config = {
  directConnect: true
  framework: 'jasmine',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['spec.js']
}

Некоторые люди сообщили, что использование этой опции в сочетании с браузером Chrome вместо Firefox позволило решить некоторые проблемы, которые в любом случае не кажутся вам строго связанными: https://github.com/angular/angular-seed/issues/254

Что еще? Некоторые люди также сообщили, что обновление хромированного ребра до определенной версии разрешило некоторые проблемы в webdriver при использовании хром, например: https://github.com/angular/protractor/issues/3640
https://github.com/angular/webdriver-manager/issues/102
Таким образом, одно предложение - попробовать использовать Chrome в тех же условиях работы и посмотреть, что вы получаете. Он может работать без проблем.

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

Опять же, я подчеркиваю, что я не разработчик на этих языках или фреймворках, поэтому представление my системы не самое лучшее и самое информированное. Я также предполагаю, что настройка до рабочей точки выполнена правильно.