混合chromeOptions.args cli和protractor.conf.js

时间:2019-03-06 11:15:44

标签: google-chrome protractor

当前,我们有一个“标准” 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吗?

1 个答案:

答案 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'