【问题标题】:Can't run Angular > 2 e2e using protractor behind a proxy无法在代理后面使用量角器运行 Angular > 2 e2e
【发布时间】:2018-08-20 08:47:40
【问题描述】:

将不胜感激任何帮助!

  • 我在windows上运行
  • 我全局安装了 protractor 5.3.0 版
  • 在更新 webdriver 之前我跑了:webdriver-manager clean
  • 并更新版本如下:

webdriver-manager 更新 --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)

【问题讨论】:

  • 如果web应用底层测试运行在本地,为什么需要设置代理。
  • 我只是假设我需要由于错误(包含 443 ssl 端口)+ 我必须使用代理来更新驱动程序,正如我提到的那样,这确实有效,但运行 e2e 时使用:chromedriver.storage .googleapis.com:443,无论有没有代理,它最终都对我不起作用,我什至尝试明确指向硒驱动程序并添加了一个硒服务器,但效果不佳..不知道如何攻击,你能建议任何其他配置吗?

标签: angular proxy protractor angular-e2e


【解决方案1】:

ng e2e 将在后台执行webdriver-manager start/updatewebdriver-manager start 将访问“chromedriver.storage.googleapis.com”以查询最新的 webdriver 二进制文件,您的错误来自这里。

因为ng e2e 不能接受来自 cli 或预配置文件的代理,所以您可以为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 窗口中尝试ng e2e(不要在旧的 cmd 窗口中尝试)

仅供参考,一旦添加了 3 个环境变量,执行 webdriver-manager start/update 时无需在 cli 中传递 --proxy

【讨论】:

  • 感谢您的精彩解释 - 为我工作:)
  • 我必须在 Angular 中添加 3 个环境变量的文件是什么?
  • 将 3 个环境变量添加到机器,而不是机器上的任何文件中。
  • @Dilip Solanki 它位于控制面板 > 系统和安全 > 系统 > 高级系统设置 > 环境变量中。添加新的“系统变量”。我试过了,效果很好。
  • @Minato 不再为我工作了,有什么新的解决方案吗?
【解决方案2】:

在我们添加 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);

  1. 可能是我们尝试另一个环境变量,或者如何通过 angular.json 文件传递​​这个值,但我还想不通

  2. 当量角器运行以下命令时,如何通过代理使用的证书来信任外部站点:


    curl -o.\node_modules\protractor\node_modules\webdriver-manager\selenium\chrome-response.xml https://chromedriver.storage.googleapis.com/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多