首页 > 解决方案 > 混合 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 是否不再受到尊重?

标签: google-chromeprotractor

解决方案


是的,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'

推荐阅读