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

时间:2020-06-04 21:39:58

标签: angular azure google-chrome protractor selenium-chromedriver

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

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

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

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

从试图启动Webdriver的意义上说,这似乎“起作用”,但是失败:

E/launcher - Process exited with error code 199

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

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

$(CHROMEWEBDRIVER --version)

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

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

3 个答案:

答案 0 :(得分:2)

问题是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,

只需为我的项目配置它,就可以正常工作。

答案 1 :(得分:0)

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

npx webdriver-manager update

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

答案 2 :(得分:0)

我终于通过使用 Powershell 脚本,使用当前安装在托管代理上的 Chrome 版本成功地运行了量角器测试。也许这可能会帮助您或其他读者实现同样的目标。

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

看起来您正在使用 Angular。在这种情况下,重要的是要注意,在最后一步中,要运行 e2e 脚本,您必须传入一个参数 --webdriver-update=false 否则它将再次将 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

附言这仅适用于基于 Windows 的代理

P.S.S.我不需要在量角器配置中指定 chromeDriver,它会自动获取与 webdriver-manager 一起安装的 webdriver