angular - 通过 Azure 托管代理 Chromedriver 运行 Angular Protractor 测试

标签 angular azure google-chrome protractor selenium-chromedriver

我的团队正在努力提高 Azure DevOps 管道中与 chrome 更新相关的 E2E 测试的可靠性。目前,我们将所需的 chrome 驱动程序版本设置为 yaml 管道中的参数,然后在 webdriver-manager 更新步骤中使用该变量

parameters:
    chromeDriverVersion: 83.0.4103.39
...
script: './node_modules/protractor/bin/webdriver-manager update --versions.chrome=${{parameters.chromeDriverVersion}} 

这工作正常,只是每次在 Azure 托管代理上更新 Chrome 时我们都必须更新版本。在查看Agent Capabilities时我注意到“CHROMEWEBDRIVER”可以通过 ENV 变量获得。所以这让我思考,我们是否应该能够使用已安装的 Chrome 驱动程序,该驱动程序可能与已安装的 Chrome 版本保持同步?我知道 Protractor 配置中有一个“chromeDriver”参数,根据 Protractor docs获取已安装 Chrome 驱动程序的路径。我已将其添加到我的 Protractor 配置中,如下所示:

chromeDriver: process.env.CHROMEWEBDRIVER ? process.env.CHROMEWEBDRIVER : null,

这似乎“有效”,因为它尝试启动网络驱动程序,但失败了:

E/launcher - Process exited with error code 199

不是特别有帮助,它似乎是一个常见的错误代码,我可以看到很多其他人遇到问题,但不是在这种情况下。

我还尝试使用以下方法获取已安装的 Chrome 驱动程序的版本:

$(CHROMEWEBDRIVER --version)

然后使用该版本号通过上面列出的脚本步骤安装正确的版本,但这不起作用,因为版本不仅仅是版本号,还包括其他信息(例如:HeadlessChrome/83.0.4103.61) 。此外,我在 CHROMEWEBDRIVER 变量上尝试了几种排列,添加前导“.”,添加尾随“.exe”等,所有这些都会导致错误“无法在...找到 chromedriver”,这让我相信我的 Protractor 配置方法至少得到了正确的路径,因为它通过了这一步然后失败了。

TL;DR

尝试使基于云的 e2e 测试更加强大,但是当通过 Protractor 配置使用安装在 azure 代理上的 chrome 驱动程序时,会出现错误并显示代码 199。

完整的 Protractor 配置

exports.config = {
  SELENIUM_PROMISE_MANAGER: false,
  useAllAngular2AppRoots: true,
  allScriptsTimeout: 31000,
  specs: [
    '../src/features/**/*.feature'
  ],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: {
        '--headless',
        '--disable-gpu',
        '--window-size=1400,740',
        '--no-sandbox'
      }
    }
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'custom',
  frameworkPath: require.resolve("protractor-cucumber-framework"),
  cucumberOpts: {
    strict: true,
    format: ["json:./e2e/reports/json/cucumber_report.json"],
    require: ["../src/features/**/*.ts", "../src/support/*.ts"],
  },
  chromeDriver: process.env.CHROMEWEBDRIVER ? process.env.CHROMEWEBDRIVER : null,
};

最佳答案

问题在于 CHROMEWEBDRIVER 环境变量包含目录路径(查看 sources ),但 chromeDriver 需要文件路径。

所以你应该这样做(对于Linux)

chromeDriver: process.env.CHROMEWEBDRIVER ? require('path').join(process.env.CHROMEWEBDRIVER, 'chromedriver') : null,

或者,如果你想要跨平台兼容性(windows/linux),你可以引入一个变量

const chromeDriverFileName = process.env.OS === 'Windows_NT' ? 'chromedriver.exe' : 'chromedriver';
...
chromeDriver: process.env.CHROMEWEBDRIVER ? require('path').join(process.env.CHROMEWEBDRIVER, chromeDriverFileName) : null,

刚刚为我的项目配置了它,似乎工作正常。

关于angular - 通过 Azure 托管代理 Chromedriver 运行 Angular Protractor 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62204610/

相关文章:

angular - 如何在angular2中模拟 Protractor 中的拖放 Action ?

azure - 在 Azure 上执行耗时的作业

c# - Serilog 不适用于 Reliable Actor Services

asp.net-mvc - asp.net mvc 应用程序中的 SameSite 属性

Angular 2 单选按钮未使用响应式(Reactive)表单正确初始化

angular - 我们如何在 Angular 7 中为绝对路径配置 Stylus?

angular - Jasmine stub 函数导致类型错误 "... is not a function"

使用服务主体的 Azure 分析服务连接不起作用

html - 为什么 iframe 的 CSS 边框会闪烁,如何解决?

android - 在 Android/Chrome 中查看 PDF