【问题标题】:Protractor config for Angular2+ e2e that works both for local run & in dockerAngular2+ e2e 的量角器配置,适用于本地运行和 docker
【发布时间】:2021-07-12 11:44:51
【问题描述】:

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

  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=,因为我总是在 docker 或我的本地 ng 服务中运行它,所以另一个开发服务器对我来说没有意义。我已将此添加到package.json"e2e": "ng e2e --dev-server-target=" 它适用于npm run e2e,但我也希望ng e2e 不带本地运行参数(我相信可以配置,但如何配置?)

以及如何设置在 docker 和本地运行中都可以使用的 chromedriver?

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

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

【问题讨论】:

  • 为什么两者都需要完全相同的配置?在 Docker compose 网络中添加一个 Selenium standalone image 并将 Protractor 指向它。
  • @jonrsharpe 我不确定我是否完全理解(刚开始学习这个领域),但如果我做对了,我实际上并没有使用 selenium 主机,因为 directConnect=true,不是吗? ?所以我的量角器直接指向网络主机。您是否建议设置 directConnect=false 并使用 selenium?
  • 当您使用 directConnect 时,您必须让浏览器和驱动程序在同一主机上运行。这对您的本地运行很有意义,但在容器网络中它使测试容器更加复杂,因此只需将独立容器添加到网络中并将 Protractor 指向它就更容易了。
  • 事实上你可以在github.com/textbook/react-ts-fe/tree/…看到我是如何做到的——它使用WebdriverIO而不是Protractor,但是将配置外部化到环境变量的想法,这样它就可以适应不同的环境和在 Docker compose 网络中使用独立的 Selenium 映像。

标签: angular docker protractor e2e


【解决方案1】:

在这种情况下我所做的是声明一个 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,
}

【讨论】:

  • 谢谢!这正是我要找的!
猜你喜欢
  • 2017-01-02
  • 2016-03-09
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多