#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);