Динамическое разрешение браузера для тестирования транспортира

#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]"))