Подтвердить что ты не робот

Транспортир - Где использовать 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, есть ли какая-нибудь лучшая практика в отношении того, как это использовать?

4b9b3361

Ответ 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.