Мы тестируем угловой webapp с phantomjs.
код контроллера выглядит следующим образом:
angular.module('module' ['dependency']).
controller('controller',function ($scope, Model) {
// blah-blah-blah
Model.list() // calls $http.get
.then(); // yadda-yadda-yadda
});
Backend в Java, поэтому для того, чтобы проверить все приложения, мы используем Selenium WebDriver и PhantomJS. Я использую этот фрагмент, чтобы проверить, завершил ли угловой обработку своих директив (получил его от protractor исходного кода).
var app = angular.element(document.querySelector('#ng-app'));
var $browser = app.injector().get('$browser');
$browser.notifyWhenNoOutstandingRequests(function() {
// callback
});
Он отлично работает - в большинстве случаев он действительно может обнаруживать запросы угловой обработки.
Проблема в том, что иногда мой обратный вызов срабатывает даже до того, как контроллер будет выполнен. Во всех случаях, когда я заметил это поведение, это изменение маршрута. Я попытался вставить alert('');
в разные части контроллера, чтобы это выяснить.
Итак, вопрос в том, как я могу выполнить свой ожидающий фрагмент только после того, как была выполнена функция контроллера?
То же самое здесь. Может быть связано с https://github.com/angular/protractor/issues/255 И обратите внимание, что 'notifyWhenNoOutstandingRequests' является частной, недокументированной функцией API. – Offirmo
Не могли бы вы рассказать немного больше об отрывке из источника транспортира? Я получаю ответ, который говорит, что инжектор() не определен при использовании точного кода в исполнителе javascript Selenium. – emery
@emery, вы должны использовать селектор, который соответствует корневому элементу вашего приложения или любому его дочернему элементу. angular.element (null) возвращает пустой массив вместо исключения исключения. массив не имеет поля инжектора, следовательно, ошибка. – ilj