量角器:WebDriverError:无法初始化sun.security.ssl.SSLContextImpl $ TLSContext

时间:2017-01-04 10:49:06

标签: webdriver protractor ubuntu-16.04

我刚接触量角器,在开始教程时我被阻止了。我找不到错误的真正来源......

我做了什么:

  1. 安装量角器(npm install -g protractor
  2. 更新并运行webdriver-manager
  3. 从量角器教程中复制/粘贴示例文件
  4. 运行'protractor conf.js'
  5. 我得到了什么:

    [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
    

    备注

    1. 量角器:v4.0.14
    2. Java:openjdk 9-Ubuntu 9b134(?)
    3. 系统:Ubuntu 16.04
    4. NodeJS:v6.8.1
    5. 我在conf.js中使用“capabilities.browserName:'firefox'”得到相同的输出
    6. 欢迎任何帮助!

1 个答案:

答案 0 :(得分:4)

好吧,我会尝试猜测,因为我没有这方面的经验 问题似乎如下:

  

无法初始化类sun.security.ssl.SSLContextImpl $ TLSContext

至少根据您显示的日志,并假设Protractor的所有设置都已正确完成。

这是来自JDK代码的“东西” 让我们先看看为什么在某些部分需要Java,因为这有助于我们理解一些事情 在日志的第一行,很明显您正在使用selenium服务器(https://github.com/angular/protractor/blob/master/docs/server-setup.md)。
通过阅读上面的链接可以看出,selenium服务器确实需要JDK,因此我们找到了一个Java“入口点”。

使用 webdriver-manager 启动selenium服务器,因此在webdriver-manager的代码中必须有一些调用来启动java。让我们看看它在哪里 看这里的来源
https://github.com/angular/webdriver-manager/blob/70614a23e289088c852f5c0162a947488ffc77e0/lib/cmds/start.ts

我们可以看到java将在这里启动

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

并且这些args按以下方式定义:

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 initialization 在那里的第一个答案,无论如何我发现非常有启发性。你也可以在这里阅读:https://www.java.com/en/configure_crypto.html

期待这一点,我建议必须使用以下系统属性jdk.tls.client.protocols启动java(虽然默认值应该没问题......)。一种方法是添加以下行

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

例如,在上述文件中调用let seleniumProcess = spawn('java', args, stdio);之前。

你还可以尝试什么
您可以通过将脚本直接连接到浏览器来检查是否可以避免此错误,而无需selenium服务器干预。如果你暂时在本地运行,这是可行的,并且当你避免一跳时应该更快。如果您的浏览器位于远程位置(暂时不是您的情况......),您需要使用selenium服务器。

正如我在开头链接的selenium服务器设置页面中所述,确实列出了避免使用它的可能性。 selenium服务器设置文档中的关键部分提到了以下内容

  

直接连接到浏览器驱动程序

     

量角器可以直接测试Chrome和Firefox,而无需使用   Selenium服务器。要使用此功能,请在配置文件集中设置directConnect: true

     

directConnect: true - 您的测试脚本直接与Chrome通信   驱动程序或Firefox驱动程序,绕过任何Selenium Server。如果是这样的话   是的,seleniumAddressseleniumServerJar的设置将是   忽略。如果您尝试使用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

还有什么? 有些人还报告说,在使用chrome时,将chromedriver更新为特定版本已解决了webdriver中的一些问题,例如: https://github.com/angular/protractor/issues/3640
https://github.com/angular/webdriver-manager/issues/102
因此,有一个建议是尝试在相同的运行条件下使用Chrome,看看你得到了什么。它可能没有问题。

请记住,所有软件组件在某些情况下都依赖于特定版本的子组件(特定浏览器版本等),因此请检查是否满足这些要求。这些列在您使用的软件的相关页面中:量角器,webdriver-manager等

同样,我强调我不是这些语言或框架的开发人员,因此系统我的 视图是不是最好的,最有见识的。我还假设已正确完成了运行点的设置。