Protractor, AngularJS, Parse Protractor не ждет разрешения Angular

Я новичок в Protractor и AngularJS. Я использую Parse на задней панели. Попытка сделать очень простой тест:

describe('Test', function () {

beforeEach(function () {
  browser.get('index.html#/example')
});

it('should have a button', function () {

   expect(element(by.css('#test321')).isElementPresent()).toBe(true); //fails 

}); ...

Тест не проходит. Элемент находится в template.html:

 ...
<body>
    <button id="test321">stuff</button>
...

Загружается по угловому маршруту. Этот маршрут также загружает данные из серверной части:

...
config(['$routeProvider', function ($routeProvider) {
        $routeProvider.
            when('/example', {
                templateUrl: 'template.html',
                controller: 'templateCtrl',
                resolve: {
                    data: 'dataService' //Data is loaded from Parse. This line causes the problem
                }...

Проблема вызвана строкой «data:» выше. Если я возьму эту строку или верну статический результат, она будет работать нормально. Также, если я перемещу этот элемент index.html, он тоже сработает.

Это похоже на проблему со временем. Однако, согласно документации, транспортир (или, в частности, isElementPresent) ждет всех разрешений, прежде чем находить элементы.

Я растоптан. Большое спасибо за любую помощь.

Обновление: Согласно этому, это было решено в Protractor 1.2, но я использую 1.4. Очень странно.


person app_sciences    schedule 30.11.2014    source источник
comment
Пока единственное временное решение, которое я нашел (вдохновленное aricearice), — это вставить явное ожидание. Вот один из способов, который работает: browser.wait(function () { return $('#addReferringButton').then(function (element) { return true; }, function(error) { return false; }); }, 5000);   -  person app_sciences    schedule 02.12.2014


Ответы (3)


Поскольку это проблема времени, обходным путем может быть ожидание присутствия элемента, прежде чем утверждать, что он присутствует:

describe('Test', function () {

beforeEach(function () {
  browser.get('index.html#/example')
});

it('should have a button', function () {
   browser.wait(function() {
       return $('#test321').isPresent(); // keeps waiting until this statement resolves to true
   }, timeToWaitInMilliseconds, 'message to log to console if element is not present after that time');
   expect($('#test321').isPresent()).toBe(true);  

}); ...
person aricearice    schedule 01.12.2014
comment
Большое спасибо, это работает. Однако странно, что ему нужно так много рук, а не просто ждать, пока Angular установится, как они пишут в своих документах. Возможно, это связано с тем, что я не использую $http для получения данных (я использую Parse JS SDK) — это единственное, о чем я могу думать. Я дошел до того, что начал с макета Parse, однако пока я буду использовать ваше решение. - person app_sciences; 01.12.2014
comment
При дальнейшем осмотре кажется, что это не работает последовательно. $('#test321').isPresent() возвращает обещание, а не логическое значение, поэтому оно сразу не выполняется. Каким-то образом вызов, который работает несколько раз (возможно, путем введения задержки), но не постоянно. - person app_sciences; 02.12.2014
comment
Вот исправление: browser.wait(function () { return $('#addReferringButton').then(function (element) { return true; }, function(error) { return false; }); }, 5000); - person app_sciences; 02.12.2014
comment
Это очень полезно, я мог заставить работать первое решение, но не эту последнюю версию, используя обещание. Предназначены ли тесты/ожидания для включения в тело функции «тогда»? Я предположил, что они собираются заменить «возврат true», например: ошибка) { вернуть ложь; }); }, 5000); - person Rocket Garden; 30.03.2015
comment
browser.wait ожидает, пока переданная функция вернет значение true, поэтому переданная функция должна вернуть логическое значение, например: element.isPresent() или element.isDisplayed() или 5 === 5. expect(element).isPresent(); возвращает объект вместо логического значения. - person aricearice; 24.04.2015

В Angular 2 я использую в своем файле protractor.conf.js следующее:

onPrepare: function() {
    browser.ignoreSynchronization = false;
},
useAllAngular2AppRoots: true
person ibasoni    schedule 03.12.2015

person    schedule
comment
Суреш, хотя ваше предложение совершенно логично, оно не работает для меня по странной причине. Транспортир просто не ждет, насколько я могу судить. Это может быть связано, как я уже упоминал, с тем фактом, что я не использую $http для получения данных (я использую Parse JS SDK) - это единственное, о чем я могу думать. - person app_sciences; 01.12.2014