angular - Angular2+ e2e 的量角器配置,适用于本地运行和 docker
问题描述
最近我花了很多时间开始对我的项目进行 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.
此外,我总是必须--dev-server-target=
在本地和 docker 中通过,因为我总是在 docker 或本地 ng 服务中运行它,所以另一个开发者-服务器对我没有意义。我已将此添加到package.json
:"e2e": "ng e2e --dev-server-target="
它适用于npm run e2e
,但我也希望ng e2e
没有用于本地运行的参数(我相信可以配置,但是如何配置?)
以及如何设置在 docker 和本地运行中都可以使用的 chromedriver?
本地运行更容易调试,启动速度更快……
注意:4444
是我的开发 Web 服务器的一个端口,我最近才意识到 selenium 使用相同的端口。
解决方案
在这种情况下,我所做的是声明一个 docker image 特定的环境变量
# 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,
}
推荐阅读
- r - r 和 ggplot 不为美国或英国着色
- asp.net - .Net C# 4.5.1 中的 WebApp 不适用于 TLS 1.2
- c# - DocumentFormat.OpenXml 2.8 版在使用 MergeField 时不起作用
- serilog - 尝试使用命名空间的第一部分过滤第二个 RollingFile
- php - Zabbix REST-API 输出限制为 10 万条记录
- c++11 - 如何在 ASCII 游戏期间阻止蓝线出现在 Windows 控制台上?
- lua - local a = true print(a and false or true) 为什么无论 a==false 还是 a == true 结果总是正确的?
- kubernetes - 如何通过 Kubernetes 中的入口公开 Web 应用程序?
- unity3d - Zenject Unity3D测试场景命中“无法解析类”如何摆脱?
- reactjs - 如何在资源列表中显示列表当前过滤器