#testing #configuration #protractor
#тестирование #конфигурация #транспортир
Вопрос:
мой вопрос касается сквозного сценария тестирования с участием адаптивного веб-приложения. Я написал свой тестовый сценарий для страниц, которые будут тестироваться с различными тестовыми примерами в зависимости от разрешения экрана. Я использую переменные массива для хранения различных селекторов, связанных с одним и тем же элементом, например:
it('should display the log in page', function () {
gVar.signInButton = element(by.css(gVar.signInButtonSelector[gVar.SelectedMode]));
gVar.signInButton.click().then(function(){
expect(element(by.css(gVar.titleLoginPageSelector[gVar.SelectedMode])).getText()).toEqual(gVar.titleLoginPage[i]);
});
Здесь я пытаюсь выбрать заголовок страницы входа, чтобы протестировать его. В зависимости от разрешения отличается только селектор, и я сохранил их в массивах…
В моем conf.js У меня есть переменная параметра, которую я использую в командной строке для настройки конфигурации, которую я хочу использовать:
exports.config = {
//...
params:{
resolutionConfig:'default'
},
//...
}
команда run может перейти:
protractor conf.js --params.resolutionConfig=Classic
или
protractor conf.js --params.resolutionConfig=Mobile
или
protractor conf.js --params.resolutionConfig=Tablet
…
(Тогда у меня есть соответствующая таблица, чтобы связать этот параметр с приведенным выше целочисленным значением: gVar.Выбранный режим)
Что я хотел бы сделать сейчас, так это установить разные значения разрешений для моего браузера, разные для каждого значения параметра resolutionConfig, который я тестирую. Пока что я знаю, как установить это разрешение с помощью жестко заданных значений:
exports.config = {
//...
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--window-size=100,100'] // THIS!
}
//...
}
Я слышал о «множественных возможностях» для запуска параллельных тестов, но это не совсем то, что я хочу … возможно ли иметь параметры разрешения в переменной и добавить к нему логику? Что-то вроде:
if(resolutionConfig) is "mobile" then: ['--window-size=xx,xx'];
if(resolutionConfig) is "tablet" then: ['--window-size=yy,yy'];
Ответ №1:
Чтобы ответить на ваш первоначальный вопрос, вы можете использовать browser.driver.manage().window().setSize()
для ручной настройки разрешения браузера, которое вы хотите.
Я не уверен точно, что находится в том массиве, который вы упомянули, но я бы, вероятно, подошел к вашей проблеме по-другому для вас:
Настройка параметров:
params: {
resolutionConfig: 'default', //could be default, mobile or tablet
default: { //set whatever res you need
resWidth: 1700,
resHeight: 1500,
titleLocator: '//div[@title="defaultTitle]"'
},
mobile: {
resWidth: 800,
resHeight: 1000,
titleLocator: '//div[@title="mobileTitle]"'
},
tablet: {
resWidth: 1200,
resHeight: 1200,
titleLocator: '//div[@title="tabletTitle]"'
}
},
onPrepare: {
//See below for explanation
let requiredHeight = browser.params[browser.params.resolutionConfig].resHeight;
let requiredWidth = browser.params[browser.params.resolutionConfig].resWidth;
browser.driver.manage().window().setSize(requiredHeight, requiredWidth)
}
Вы могли бы запустить protractor тем же способом, которым вы намереваетесь
protractor conf.js --params.resolutionConfig=Classic
protractor conf.js --params.resolutionConfig=Mobile
protractor conf.js --params.resolutionConfig=Tablet
Вы бы локализовали свой динамический элемент заголовка следующим образом
element(by.xpath(browser.params[browser.params.resolutionConfig].titleLocator))
//which is equivalent to
element(by.xpath(browser.params['default'].titleLocator))
//and as we declared above
browser.params['default'].titleLocator = "//div[@title="defaultTitle]"
//so therefore we are actually doing
element(by.xpath("//div[@title="defaultTitle]"))