2014-11-30 2 views
2

Я новичок в Протрактор и AngularJS. Я использую Parse на заднем конце. Попытка провести очень простой тест:Транспортир, 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 
       }... 

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

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

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

Обновление: Согласно this было решено, в Protractor 1.2, но я на 1.4. Очень странно.

+0

до сих пор единственным временным решением я нашел (вдохновленный aricearice), чтобы вставить явное ожидание. Вот один из способов, который, кажется, работает:. 'browser.wait (функция() { возврата $ ('# addReferringButton'), то (функция (элемент) { возвращающие; }, функция (ошибка) { возврат false; }); }, 5000); ' –

ответ

0
isPresent() will return promises,so put your expect code inside the callback function and try to execute. 

Try below code.hope it will work, 

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

    $('#test321').isPresent().then(function(result){ 
           expect(result).toBe(true); 
           }); 
}); 
+0

Суреш, в то время как ваше предложение совершенно логично, это не работает для меня по странной причине. Насколько я могу судить, транспортир просто не дожидается. Возможно, это связано с тем, что я не использую $ http для получения данных (я использую Parse JS SDK) - это единственное, о чем я могу думать. –

6

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

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); 

}); ... 
+0

Большое спасибо, это действительно работает. Тем не менее, странно, что ему нужно столько владения руками и не просто ждать, пока Угловые «успокоятся», поскольку они вставляют свои документы. Это может быть связано с тем, что я не использую $ http для получения данных (я использую Parse JS SDK) - это единственное, о чем я могу думать. Я дошел до того, что начал макет Парса, но тем временем я буду использовать ваше решение. –

+0

При дальнейшей проверке это не работает последовательно. $ ('# test321'). isPresent() возвращает обещание, а не логическое, поэтому оно сразу же падает. Как-то вызов, который работает несколько раз (возможно, путем введения задержки), но не последовательно. –

+1

Вот исправление: 'browser.wait (function() { return $ ('# addReferringButton').затем (функция (элемент) { return true; }, функция (ошибка) { return false; }); }, 5000); ' –

1

В Угловое 2 я использую следующие в моей транспортира .conf.js файл:

onPrepare: function() { 
    browser.ignoreSynchronization = false; 
}, 
useAllAngular2AppRoots: true 
+0

did not work bruv –

Смежные вопросы