当前,我们有一个“标准” 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
。我们从cli调用中删除了--capabilities
,并将headless
选项直接添加到了protractor.conf.js中。
现在,CI基础架构上的所有内容也都正常运行。这表示已识别并使用了配置中指定的--window-size
。
进一步的测试表明,如果我们要使用CLI参数,则还需要将window-size
添加到CLI调用中,以使其正常工作。
现在问问题本身:
为什么这样?通过CLI调用是否可以添加 additional chromeOptions.args?通过CLI传递某些chromeOptions.args时,不再尊重配置中的chromeOptions.args吗?
答案 0 :(得分:1)
是的,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);
}
下面是configParser.ts中的addConfig
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值将被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'