Google chrome 混合chromeOptions.args cli和dragrator.conf.js
目前,我们有一个“标准”的dragrator.conf.js文件。它有一个特定于chrome的部分,看起来像这样:Google chrome 混合chromeOptions.args cli和dragrator.conf.js,google-chrome,protractor,Google Chrome,Protractor,目前,我们有一个“标准”的dragrator.conf.js文件。它有一个特定于chrome的部分,看起来像这样: capabilities: { browserName: 'chrome', chromeOptions: { args: [ '--no-sandbox', '--window-size=1280,1480', '--window-position=800,0' ],
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'
首先,一切看起来都很好。测试是用无头铬合金进行的。但是我们发现没有使用配置文件中指定的--windowsize=12801480
。我们从cli调用中删除了--capabilities
,并将headless
选项直接添加到dragrator.conf.js中
在CI基础架构上,一切都正常工作。这意味着在配置中指定的--窗口大小
已被识别和使用
进一步的测试表明,如果我们想使用CLI参数,我们还需要将窗口大小
添加到CLI调用中,以使其正常工作
现在问题本身是:
为什么会这样?是否可以通过CLI调用添加额外的chromeOptions.args?通过CLI传递一些chromeOptions.args时,是否不再考虑配置中的chromeOptions.args?是,CLI值将覆盖conf.js中的值 下面是来自的代码片段 下面是来自的
addConfig
由于capabilities.chromeOptions.args
是数组,因此conf.js中的args值将被merge
函数中cli的值覆盖:into[key]=from[key]代码>
因此,您必须通过在cli中使用多个--capabilities.chromeOptions.args=xxx
来指定cli中的所有chromeOptions.args,而不是
部分的
protractor conf.js \
--capabilities.chromeOptions.args='headless' \
--capabilities.chromeOptions.args='--no-sandbox' \
--capabilities.chromeOptions.args='--window-size=1280,1480'
正如Overwrited所理解的,这意味着如果我们在cli上提供一个参数,它将“覆盖”config if set中此属性的值。如果没有,它将被添加。但正如你所证明的,事实并非如此。整个数组被覆盖。
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;
};
protractor conf.js \
--capabilities.chromeOptions.args='headless' \
--capabilities.chromeOptions.args='--no-sandbox' \
--capabilities.chromeOptions.args='--window-size=1280,1480'