运行 Angular 通过 Azure 托管代理 Chromedriver 进行量角器测试

Run Angular Protractor tests via Azure Hosted Agent Chromedriver

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

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

这很好用,除了每次 Chrome 在 Azure 托管代理上更新时我们都必须更新版本。在查看 Agent Capabilities I noticed that "CHROMEWEBDRIVER" is available via an ENV variable. So this got me thinking, shouldn't we just be able to use the installed Chrome driver which is presumably kept in sync with the installed version of Chrome? I know that there is a "chromeDriver" param in the protractor config that according to the Protractor docs 时,获取已安装的 Chrome 驱动程序的路径。我已将它添加到我的量角器配置中,如下所示:

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

从某种意义上说,这似乎 "work" 它试图启动网络驱动程序,但它失败了:

E/launcher - Process exited with error code 199

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

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

$(CHROMEWEBDRIVER --version)

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

TL;DR

试图使基于云的 e2e 测试更加健壮,但是当使用通过量角器配置安装在 azure 代理上的 chrome 驱动程序时,它会出错并显示代码 199。

完整的量角器配置

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,
};

尝试从 protractor.conf.js 中删除 chromeDriver 属性,然后在开始测试之前 运行 此命令:

npx webdriver-manager update

这是我用来保持量角器使用的 chrome 驱动程序更新的工具。 npx 是一个 npm 实用程序,基本上允许您更新依赖项(量角器)的依赖项 (webdriver-manager)

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

所以你应该这样做(linux)

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

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

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

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

我终于设法 运行 使用 Powershell 脚本使用当前安装在托管代理上的 Chrome 版本进行 Protractor 测试。也许这可以帮助您或其他读者实现同样的目标。

它首先获取安装在代理上的 Chrome 版本,并使用此版本下载和安装 Webdriver。

您似乎在使用 Angular。在这种情况下,重要的是要注意,在最后一步中,对于 运行 您必须传入参数 --webdriver-update=false 的 e2e 脚本,否则它将再次将 Webdriver 更新到最新版本,这可能与代理上安装的版本不同。

这是代码,您可以在 Powershell 任务中使用它:

$ver = ((Get-Item "C:\Program Files\Google\Chrome\Application\chrome.exe").VersionInfo).ProductVersion
echo "Chrome version: "
echo $ver
npx webdriver-manager update --versions.chrome $ver
npx ng e2e --webdriver-update=false

P.S。这仅适用于基于 Windows 的代理

P.S.S.我不需要在量角器配置中指定 chromeDriver,它会自动采用随 webdriver-manager

安装的 webdriver