Смешивание ChromeOptions.args cli и protractor.conf.js

#google-chrome #protractor

#google-chrome #транспортир

Вопрос:

В настоящее время у нас есть «стандартный» 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'
  

Сначала все выглядело нормально. Тесты выполнялись с безголовым chrome. Но мы признали, что --window-size=1280,1480 указанное в файле конфигурации не использовалось. Мы удалили --capabilities из вызова cli и добавили headless опцию непосредственно в protractor.conf.js .

Теперь все также отлично работало в инфраструктуре CI. Это означает, что --window-size указанное в конфигурации было распознано и использовано.

Дальнейшие тесты показали, что если мы хотим использовать аргументы CLI, нам нужно также добавить window-size к вызову CLI, чтобы заставить его работать должным образом.

Теперь сам вопрос:

Почему это так? Разве не должно быть возможности добавить дополнительные опции ChromeOptions.аргументы через вызов CLI? Являются параметрами ChromeOptions.аргументы из конфигурации больше не учитываются при передаче некоторых ChromeOptions.аргументы через CLI?

Ответ №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);
  }
  

Ниже приведен 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] amp;amp; 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 amp;amp; !(into[key] instanceof Array) amp;amp;
        !(into[key] instanceof Function)) {
      merge_(into[key], from[key]);
    } else {
      into[key] = from[key];
    }
  }
  return into;
};
  

Поскольку capabilities.chromeOptions.args является массивом, следовательно, значение args в conf.js будет перезаписано значением из cli в merge_ функции: into[key] = from[key];

Для этого вы должны указать все ChromeOptions.извлекает аргументы из cli с помощью нескольких --capabilities.chromeOptions.args=xxx в cli, а не частичных.

 protractor conf.js 
--capabilities.chromeOptions.args='headless' 
--capabilities.chromeOptions.args='--no-sandbox' 
--capabilities.chromeOptions.args='--window-size=1280,1480'
  

Комментарии:

1. Как мы поняли, перезапись означает, что если мы предоставим аргумент в cli, он «перезапишет» значение этого свойства из конфигурации, если оно установлено. В противном случае он будет добавлен. Но, как вы доказываете, это не так. Перезаписывается весь массив.