由于与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”,这使我相信我的量角器配置方法至少要走正确的路,因为它经过了此步骤然后失败了。
试图使基于云的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,
};
答案 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