Google chrome 混合chromeOptions.args cli和dragrator.conf.js

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' ],

目前,我们有一个“标准”的dragrator.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'
首先,一切看起来都很好。测试是用无头铬合金进行的。但是我们发现没有使用配置文件中指定的
--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'