我刚接触量角器,在开始教程时我被阻止了。我找不到错误的真正来源......
我做了什么:
npm install -g protractor
)我得到了什么:
[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
备注
欢迎任何帮助!
答案 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。如果是这样的话 是的,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
还有什么?
有些人还报告说,在使用chrome时,将chromedriver更新为特定版本已解决了webdriver中的一些问题,例如:
https://github.com/angular/protractor/issues/3640
https://github.com/angular/webdriver-manager/issues/102
因此,有一个建议是尝试在相同的运行条件下使用Chrome,看看你得到了什么。它可能没有问题。
请记住,所有软件组件在某些情况下都依赖于特定版本的子组件(特定浏览器版本等),因此请检查是否满足这些要求。这些列在您使用的软件的相关页面中:量角器,webdriver-manager等
同样,我强调我不是这些语言或框架的开发人员,因此系统的我的 视图是不是最好的,最有见识的。我还假设已正确完成了运行点的设置。