2015-06-17 3 views
13

У меня есть некоторые тесты, написанные с использованием транспортира для приложения angular.js. Я использую шаблон оформления Page Objects, и там у меня есть некоторые методы, которые переходят на другие страницы, нажимая на ссылки и кнопки. и вскоре после этого я звоню browser.waitForAngular().Транспортир - Где использовать browser.waitForAngular()

Page Object

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() из метода страницы объекта и вызвать его после того, как я сделать вызов метода, как это ...

Modified Page Object

... 
this.goToCompanyPage = function() { 
    this.companyNameLink.click(); 
}; 
... 

Spec Файл

dashboardPage.goToCompanyPage(); 
browser.waitForAngular(); 

Вызывает ли проблема browser.waitForAngular()? Где я должен позвонить waitForAngular, есть ли какая-либо передовая практика по использованию этого?

ответ

22

От транспортир-х documentation:

Instruct WebDriver подождать, пока Угловая не закончил рендеринг и не имеет выдающийся $ HTTP или $ таймаут вызовы перед продолжением. Обратите внимание, что Protractor автоматически применяет эту команду перед каждым действием WebDriver.

Вы не должны называть это вообще, и я не могу думать о действительном случае, где вы должны.

+0

У меня есть этот прецедент, как в, проверьте изменения, сделанные на странице после обновления. Внесите изменения -> нажмите save (не запустите обновление страницы) -> обновить -> проверьте перезагруженную страницу. В этом случае обновление запускается до завершения функции сохранения, вызывая ненужные предупреждения браузера на странице. Мне пришлось использовать waitForAngular() перед запуском обновления на странице. –

+0

Ну, если вы делаете обновление, вызывая 'browser.refresh', он должен дождаться завершения предыдущей операции. Я просто посмотрел на код и проверил, что [он делает] (https://github.com/angular/protractor/blob/3.0.0/lib/protractor.js#L726) (если вы не отключили функцию синхронизации то есть). Может быть, вы поймали ошибку - вы можете указать проблему на странице gytub gractub (https: // github.com/угловой/транспортир/проблемы), если это так. –

8

Вместо того, чтобы использовать waitForAngular, вам необходимо выполнить обещание, возвращенное click.

Таким образом, в первую очередь, ваши методы объекта страницы должны вернуть эти обещания:

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 version набора для испытаний утяжеленных телефонных кабелей.