Как вернуть строку (значение переменной) из объекта страницы в тестовый файл в nightwatch?

#javascript #node.js #selenium #automated-tests #nightwatch.js

#javascript #node.js #селен #автоматизированные тесты #nightwatch.js

Вопрос:

Я практикую объектную модель страницы в nightwatch, но я не могу вернуть значение переменной optionSelected из объекта страницы для тестирования. У меня есть две страницы: страница googleAdvanceSearch, на которой я написал локаторы для выбора параметров, например, что искать, результат за прошлый месяц, страна, язык и т. Д., И страница результатов, где я проверяю, соответствует ли результат выбранному варианту.

googleAdvanceSearch Код страницы:

 module.exports= {
  url:"https://www.google.co.in/advanced_search",
  elements: {
    input :"input[name='as_q']",
    languageBox :"#lr_button",
    regionButton :"#cr_button",
    lastUpdateBtn :"#as_qdr_button",
    searchButton :"input[value='Advanced Search']",
  },
  commands: [
    {
      setQuery: function(value) {
        return this.setValue('@input',value);
      },
      selectFilter: function(selector,value) {
        return this
                  .click(selector)
                  .click(`li[value="${value}"]`);
      },
       selectAndStoreOption: function(selector,value) {
              var optionSelected;
              this.click(selector)
                  .getText(`li[value='${value}']`,function(result){
                      optionSelected=result.value;
                    })
                  .click(`li[value="${value}"]`)  
                  return optionSelected;            //Can we return like this?
      },
      clickSubmit: function() {
        return this.click('@searchButton');
      }    
    }
  ]
}
 

В функции selectAndStoreOption я пытаюсь сохранить текст ‘до месяца назад’ опции ‘m’ (.getText( li[value='${value}'] ), выбранной в переменной optionSelected.

Код страницы результата :

 module.exports= {
  elements: {
      monthBox : "div[class='hdtb-mn-hd EISXeb']"
  },
  commands: [
  {
      verifyCorrectResultDisplayed: function(optionSelected,textToSearch) {
       this
       .assert.urlContains("as_q=Elon Musk","Elon Musk searched")
       .assert.urlContains("lr=lang_pl","Language polish set")
       .assert.visible(`input[title='Search'][value='${textToSearch}']`,"Search result visible on UI");
      
       this.getText('@monthBox',function(result) {
       if(optionSelected=="upto a month ago") {              **//optionSelected is undefined**
         this.assert.containsText('@monthBox',"Past month","Past month result displayed");   **//This assertion not printing**
        }
      })
     return this;
      }
    }
     ]
}
 

Здесь я проверяю, является ли значение переменной optionSelected значением «до месяца назад», тогда мой результат должен содержать текст за прошлый месяц. Но это утверждение не работает, так как значение optionSelected не определено.

Тест:

 module.exports= {
  "@tags":["google"],
  before : function(browser) {
    let googleSearchPage=browser.page.googleSearchPage();
    googleSearchPage.navigate();
    browser.windowMaximize();
  },
  "Google Advanced Search Test": function(browser) {
     var googleSearchPage=browser.page.googleSearchPage();
     var resultPage=browser.page.resultPage();
     var data=browser.globals;
     googleSearchPage
                    .setQuery(data.googleAdvancedSearch.textToSearch)
                    .selectFilter('@languageBox','lang_pl')
                    .selectFilter('@regionButton','countryPH');
      var optionSelec= googleSearchPage.selectAndStoreOption('@lastUpdateBtn','m');
       console.log(optionSelec);
      googleSearchPage.clickSubmit();
      resultPage
                .verifyCorrectResultDisplayed(optionSelec,data.googleAdvancedSearch.textToSearch);
  },
  after : function(browser) {
    browser
           .saveScreenshot('tests_output/google.png')
           .end();
  }
}
 

Пожалуйста, помогите

Ответ №1:

Вы должны знать, что javascript выполняется синхронно, что может привести к тому, что ваш код будет выполняться не обязательно в том же порядке, в каком он написан. По этой причине я предлагаю вам сделать вашу функцию «Тест расширенного поиска Google» асинхронной, например:

 asynch function (browser) {
....
}
 

Тогда это позволит вам ожидать ваших действий на странице поиска Googlesearch примерно так:

 var optionSelect = await googleSearchPage
                    .setQuery(data.googleAdvancedSearch.textToSearch)
                    .selectFilter('@languageBox','lang_pl')
                    .selectFilter('@regionButton','countryPH');
                    .selectAndStoreOption('@lastUpdateBtn','m');
console.log(optionSelec);