google-chrome - 混合 chromeOptions.args cli 和 protractor.conf.js
问题描述
目前我们有一个“标准” protractor.conf.js 文件。它有一个特定于 chrome 的部分,看起来像这样:
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: [
'--no-sandbox', '--window-size=1280,1480', '--window-position=800,0'
],
prefs: {
intl: {accept_languages: defaults.LANGUAGE},
},
},
}
当我们在本地运行测试时,一切都很好。在我们的 CI 基础设施上,我们通过 CLI 添加调用无头选项:
protractor protractor.conf.js --capabilities.chromeOptions.args='headless'
首先一切看起来都很好。测试使用无头镀铬运行。但是我们发现--window-size=1280,1480
配置文件中指定的没有被使用。我们--capabilities
从 cli 调用中删除了该选项,并将该headless
选项直接添加到 protractor.conf.js 中。
现在一切都在 CI 基础设施上运行良好。这意味着--window-size
配置中指定的内容已被识别和使用。
进一步的测试表明,如果我们想使用 CLI 参数,我们还需要window-size
在 CLI 调用中添加 ,以使其正常工作。
现在问题本身:
为什么会这样?难道不能通过 CLI 调用添加额外的 chromeOptions.args 吗?通过 CLI 传递一些 chromeOptions.args 时,配置中的 chromeOptions.args 是否不再受到尊重?
解决方案
是的,CLI 值将覆盖 conf.js 中的值。
下面是来自launcher.ts的代码片段
let initFn = function(configFile: string, additionalConfig: Config) {
let configParser = new ConfigParser();
if (configFile) { // this is the protractor conf.js
configParser.addFileConfig(configFile);
}
if (additionalConfig) { // this is all cli arguments
configParser.addConfig(additionalConfig);
}
以下是addConfig
来自configParser.ts
public addConfig(argv: any): ConfigParser {
this.addConfig_(argv, process.cwd());
return this;
}
private addConfig_(additionalConfig: any, relativeTo: string): void {
// All filepaths should be kept relative to the current config location.
// This will not affect absolute paths.
['seleniumServerJar', 'chromeDriver', 'firefoxPath', 'frameworkPath', 'geckoDriver',
'onPrepare']
.forEach((name: string) => {
if (additionalConfig[name] && typeof additionalConfig[name] === 'string') {
additionalConfig[name] = path.resolve(relativeTo, additionalConfig[name]);
}
});
merge_(this.config_, additionalConfig);
}
let merge_ = function(into: any, from: any): any {
for (let key in from) {
if (into[key] instanceof Object && !(into[key] instanceof Array) &&
!(into[key] instanceof Function)) {
merge_(into[key], from[key]);
} else {
into[key] = from[key];
}
}
return into;
};
因为capabilities.chromeOptions.args
是数组,所以 conf.js 中的 args 值将被 climerge_
函数中的值覆盖:into[key] = from[key];
--capabilities.chromeOptions.args=xxx
因此,您必须通过在 cli 中使用多个而不是部分来指定 cli 中的所有 chromeOptions.args 。
protractor conf.js \
--capabilities.chromeOptions.args='headless' \
--capabilities.chromeOptions.args='--no-sandbox' \
--capabilities.chromeOptions.args='--window-size=1280,1480'
推荐阅读
- python - 以简单的方式使用 pdb 调试 python 代码
- c++ - 当用户从命令行给出浮点数时,为什么我的 C++ 程序一直冻结?
- javascript - 如何打开下面的“then”并改用await/async(map函数)?
- python - 在原始实验数据上找到最大值
- angular - formarray第一个元素一直显示
- reactjs - 警告:道具类型失败:提供给“编辑器”的“对象”类型的无效道具“值”,应为“字符串”
- android - Android Volley onResponse 功能未运行
- python - 如何在 pandas python 中同时进行多个连接?
- sql - 高效地从范围日期分解到每日?
- javascript - 如何在猫鼬连接上使用“Node.js 3.0 或更高版本”?