适用于本地 运行 和 docker 的 Angular2+ e2e 量角器配置

Protractor config for Angular2+ e2e that works both for local run & in docker

最近我花了很多时间对我的项目进行端到端测试并将其纳入构建管道。设置至少需要 2 个节点(mongodb + .Net5 后端与 Angular 客户端)因此决定 运行 所有这些都在 docker 中。我添加了额外的 docker-compose-test.yml ,我将在其中启动临时节点到 运行 服务器集成测试(需要 mongo),然后客户端测试包括 e2e(这需要完全有效的设置)。因此,在对所有这些进行了几天的调整之后,我最终得到了一个 protractor.conf.js,它的 chromeDriver 硬编码为 docker:

  capabilities: {
    'browserName': 'chrome',
    chromeOptions: {
      args: ['--headless', '--disable-gpu', '--no-sandbox'],
    },
  },
  directConnect: true,
  chromeDriver: '/usr/bin/chromedriver', // !!!
  baseUrl: 'http://localhost:4444/',
  framework: 'jasmine',

它最终在 docker 中完美运行(禁用了 chromedriver 更新,因为它是在另一个阶段预安装到 Alpine 映像中的,否则自动更新根本不起作用,而且速度明显更快)。但问题是,毫不奇怪,它不再在本地工作: Error message: Could not find chromedriver at Q:\usr\bin\chromedriver. Run 'webdriver-manager update' to download binaries. 此外,我总是必须在本地和 docker 中传递 --dev-server-target=,因为我总是已经 运行ning 在 docker 中或在我的本地 ng 服务中,所以另一个开发服务器对我来说没有意义。我已将此添加到 package.json"e2e": "ng e2e --dev-server-target=" 它适用于 npm run e2e,但我也希望 ng e2e 不带参数用于本地 运行(我相信可以配置,但是如何配置?)

以及如何设置在 docker 和本地 运行 上都有效的 chromedriver?

本地 运行 更容易调试,启动也更快...

注意:4444 是我的开发 Web 服务器的端口,我最近才意识到 selenium 使用相同的端口。

我在这种情况下所做的是声明一个 docker 特定于图像的环境变量

# Dockerfile
ENV DOCKERIMAGEENV="true"

然后在配置中,我放置了一个简单的 if/else 逻辑

if (process.env.DOCKERIMAGEENV) {
  // do whatever you need for your docker
} else {
  // local specific options
}

所以在你的情况下,这看起来像这样

let chromedriverPath;

if (process.env.DOCKERIMAGEENV) {
  chromedriverPath = '/usr/bin/chromedriver'
} else {
  chromedriverPath = 'C:\another\path'
}

exports.config =  {
  directConnect: true,
  chromeDriver: chromedriverPath,
}