#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, он «перезапишет» значение этого свойства из конфигурации, если оно установлено. В противном случае он будет добавлен. Но, как вы доказываете, это не так. Перезаписывается весь массив.