不能 运行 Angular > 2 e2e 在代理后面使用量角器
Can't run Angular > 2 e2e using protractor behind a proxy
将不胜感激任何帮助!
- 我 运行 windows
- 我全局安装了量角器版本 5.3.0
- 在更新 webdriver I 之前 运行:
webdriver-manager clean
- 并更新版本如下:
webdriver-manager update --ie32 --proxy
http://my-proxy:8080 --ignore_ssl
- 节点版本 9.2.1
- npm 版本 5.7.1
- 在启动 e2e 之前启动开发服务器..
我的protractor.conf文件如下:
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome',
'proxyType': 'manual',
'httpProxy': 'http://my-proxy:8080'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
beforeLaunch: function() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
},
onPrepare() {
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};
首先尝试 运行 测试:ng e2e
第二位:
ng e2e --config ./protractor.conf.js --specs ./e2e\app.e2e-spec.ts
并且仍然收到此代理错误:
events.js:136
throw er; // Unhandled 'error' event
^
Error: getaddrinfo ENOTFOUND chromedriver.storage.googleapis.com chromedriver.storage.googleapis.com:443
at errnoException (dns.js:55:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:97:26)
ng e2e
将在后台执行 webdriver-manager start/update
,webdriver-manager start
将访问 "chromedriver.storage.googleapis.com" 以查询最新的 webdriver 二进制文件,您的错误来自此处。
因为 ng e2e
无法接受来自 cli 或 pre-configured 文件的代理,您可以为 ng e2e
触发的 webdriver-manager start/update
设置代理的唯一方法是 Environment Variable
.
添加以下 3 个环境变量:
HTTP_PROXY = http://my-proxy:port
HTTPS_PROXY = http://my-proxy:port
NO_PROXY = localhost,127.0.0.1, .yourcompany.com
在新 cmd window 中尝试 ng e2e
(不要在旧 cmd window 中尝试)
仅供参考,添加 3 个环境变量后,执行 webdriver-manager start/update
.
时无需在 cli 中传递 --proxy
在我们添加 3 个环境变量后,它几乎可以工作(非常感谢提供该解决方案)但是如果代理不信任该站点:https://chromedriver.storage.googleapis.com/
然后我们得到:
Error: unable to get local issuer certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1058:34)
at TLSSocket.emit (events.js:198:13)
at TLSSocket._finishInit (_tls_wrap.js:636:8)
所以,我们仍然需要想办法将“ignoreSSL = true”传递给“ng e2e”,因为 ng 命令应该将其作为“webdriver-manager update --ignore_ssl”传递下去
1.(目前只有有效的解决方案)一种方法是修改文件
protractor\node_modules\webdriver-manager\built\lib\cmds\opts.js
通过更新 opts[exports.IGNORE_SSL]
的值
opts[exports.IGNORE_SSL] = new cli_1.Option(exports.IGNORE_SSL, 'Ignore SSL certificates', 'boolean', true);
我们可能会尝试另一个环境变量或一些如何通过 angular.json 文件传递这个值,但我还没有弄明白
量角器运行时如何通过代理使用的证书来信任外部站点:
curl -o.\node_modules\protractor\node_modules\webdriver-manager\selenium\chrome-response.xml https://chromedriver.storage.googleapis.com/
将不胜感激任何帮助!
- 我 运行 windows
- 我全局安装了量角器版本 5.3.0
- 在更新 webdriver I 之前 运行:
webdriver-manager clean
- 并更新版本如下:
webdriver-manager update --ie32 --proxy http://my-proxy:8080 --ignore_ssl
- 节点版本 9.2.1
- npm 版本 5.7.1
- 在启动 e2e 之前启动开发服务器..
我的protractor.conf文件如下:
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome',
'proxyType': 'manual',
'httpProxy': 'http://my-proxy:8080'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
beforeLaunch: function() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
},
onPrepare() {
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};
首先尝试 运行 测试:ng e2e
第二位:
ng e2e --config ./protractor.conf.js --specs ./e2e\app.e2e-spec.ts
并且仍然收到此代理错误:
events.js:136
throw er; // Unhandled 'error' event
^
Error: getaddrinfo ENOTFOUND chromedriver.storage.googleapis.com chromedriver.storage.googleapis.com:443
at errnoException (dns.js:55:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:97:26)
ng e2e
将在后台执行 webdriver-manager start/update
,webdriver-manager start
将访问 "chromedriver.storage.googleapis.com" 以查询最新的 webdriver 二进制文件,您的错误来自此处。
因为 ng e2e
无法接受来自 cli 或 pre-configured 文件的代理,您可以为 ng e2e
触发的 webdriver-manager start/update
设置代理的唯一方法是 Environment Variable
.
添加以下 3 个环境变量:
HTTP_PROXY = http://my-proxy:port
HTTPS_PROXY = http://my-proxy:port
NO_PROXY = localhost,127.0.0.1, .yourcompany.com
在新 cmd window 中尝试 ng e2e
(不要在旧 cmd window 中尝试)
仅供参考,添加 3 个环境变量后,执行 webdriver-manager start/update
.
--proxy
在我们添加 3 个环境变量后,它几乎可以工作(非常感谢提供该解决方案)但是如果代理不信任该站点:https://chromedriver.storage.googleapis.com/
然后我们得到:
Error: unable to get local issuer certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1058:34)
at TLSSocket.emit (events.js:198:13)
at TLSSocket._finishInit (_tls_wrap.js:636:8)
所以,我们仍然需要想办法将“ignoreSSL = true”传递给“ng e2e”,因为 ng 命令应该将其作为“webdriver-manager update --ignore_ssl”传递下去
1.(目前只有有效的解决方案)一种方法是修改文件 protractor\node_modules\webdriver-manager\built\lib\cmds\opts.js 通过更新 opts[exports.IGNORE_SSL]
的值
opts[exports.IGNORE_SSL] = new cli_1.Option(exports.IGNORE_SSL, 'Ignore SSL certificates', 'boolean', true);
我们可能会尝试另一个环境变量或一些如何通过 angular.json 文件传递这个值,但我还没有弄明白
量角器运行时如何通过代理使用的证书来信任外部站点:
curl -o.\node_modules\protractor\node_modules\webdriver-manager\selenium\chrome-response.xml https://chromedriver.storage.googleapis.com/