Транспортир - Где использовать browser.waitForAngular()
У меня есть некоторые тесты, написанные с использованием транспортира для приложения angular.js. Я использую шаблон дизайна Page Objects
, и у меня есть некоторые методы, которые переходят на другие страницы, нажимая на ссылки и кнопки. и вскоре после этого я звоню browser.waitForAngular()
.
Объект страницы
module.exports = function () {
this.companyNameLink = element(by.id('viewCompany'));
this.newMeetingButton = element(by.id('newMeetingButton'));
this.createNewGeneralMeeting = function () {
this.newMeetingButton.click();
browser.waitForAngular();
};
this.goToCompanyPage = function () {
this.companyNameLink.click();
browser.waitForAngular();
};
};
И в каком-то конкретном файле я использую этот объект страницы следующим образом.
var DashboardPage = require('../dashboardPageObject.js');
dashboardPage = new DashboardPage();
...
dashboardPage.goToCompanyPage();
Но проблема в том, что иногда я получаю ошибку angular could not be found on the window
, и мои тесты терпят неудачу. Большую часть времени тесты проходят. Эта проблема случайна. Мой вопрос заключается в том, что я должен удалить browser.waitForAngular()
из метода объекта страницы и вызвать его после того, как сделаю вызов метода таким, как это...
Измененный объект страницы
...
this.goToCompanyPage = function () {
this.companyNameLink.click();
};
...
Файл спецификации
dashboardPage.goToCompanyPage();
browser.waitForAngular();
Вызывает ли вызов browser.waitForAngular()
проблему? Где мне позвонить waitForAngular
, есть ли какая-нибудь лучшая практика в отношении того, как это использовать?
Ответы
Ответ 1
От транспортира документация:
Попросите webdriver подождать, пока Angular не закончит рендеринг и не будет выдавать незавершенные вызовы $http или $timeout перед продолжением. Обратите внимание, что Protractor автоматически применяет эту команду перед каждым действием WebDriver.
Вы не должны называть это вообще, и я не могу думать о действительном случае, где вы должны.
Ответ 2
Вместо использования waitForAngular
вы должны выполнить обещание, возвращенное click
.
Таким образом, прежде всего, ваши методы объекта страницы должны возвращать те promises:
this.goToCompanyPage = function () {
return this.companyNameLink.click();
};
Тогда ваше фактическое использование этого метода может выглядеть так:
dashboardPage.goToCompanyPage().then(function() {
// this will be executed when the click is done.
// No need for any waitForAngular.
});
Для некоторых других примеров см. мою версию state/page-object тестового набора Angular PhoneCat Protractor.