Транспортир ожидает ожидания синхронизации со страницей при использовании $resource
Я тестирую Protractor с помощью небольшого приложения AngularJS.
Это тест:
describe('Testing Protractor', function() {
var draftList;
it('should count the number of drafts', function() {
browser.get('#/');
draftList = element.all(by.repeater('newsletter in drafts'));
expect(draftList.count()).toEqual(2);
});
});
контроллер:
angular.module('myApp.controllers', []).
controller('DraftsCtrl', ['$scope', 'Draft', function($scope, Draft) {
$scope.drafts = Draft.query();
}])
Черновой сервис:
angular.module('myApp.services', ['ngResource']).
factory('Draft', ['$resource',
function($resource) {
return $resource('api/drafts/:id')
}])
Запуск этого теста с использованием Protractor приводит к следующей ошибке:
Error: Timed out waiting for Protractor to synchronize with the page after 11 seconds
Однако, если в контроллере я изменяю эту строку:
$scope.drafts = Draft.query();
к этому:
$scope.drafts = [];
Тест не проходит, как ожидалось, но что еще более важно: он не истекает.
Если функция query() включена, как при запуске приложения вручную в браузере, так и при просмотре окна браузера, открытого Protractor, данные, возвращаемые API, правильно отображаются повторителем.
Почему Protractor не может синхронизироваться со страницей, когда служба взаимодействует с API?
AngularJS v1.2.0-rc3. Транспортир v0.12.0.
4 ответа
Это известная проблема, но есть временное решение. Задавать ptor.ignoreSynchronization = true
,
Например:
describe('Testing Protractor', function() {
var draftList;
var ptor;
beforeEach(function() {
ptor = protractor.getInstance();
ptor.ignoreSynchronization = true;
});
it('should count the number of drafts', function() {
ptor.get('#/');
draftList = element.all(by.repeater('newsletter in drafts'));
expect(draftList.count()).toEqual(2);
});
});
Вместо того, чтобы использовать browser.ignoreSynchronization
использовать browser.waitForAngularEnabled(*boolean*)
, browser.waitForAngularEnabled(false)
наборы browser.ignoreSynchronization
в true
, browser.waitForAngularEnabled(true)
наборы browser.ignoreSynchronization
в false
,
Вы также можете включить это как часть файла конфигурации ваших тестовых наборов:
onPrepare: function () {
'use strict';
browser.waitForAngularEnabled(false);
}
Я использую Protractor 3.3.0, и чтобы заставить его работать в моем тесте, мне пришлось отложить синхронизацию игнорирования до того, как я выполню настройку.
Так что в моем beforeEach я называю свое действие:
var searchBox = element(by.css('#inpt_search'));
searchBox.sendKeys('test');
Затем мне нужно подождать, пока фиктивный бэкэнд не заполнит представление (я не рад этим sleep
звонки, поэтому, если у кого-то есть лучший способ сделать это, пожалуйста, прокомментируйте, я не могу получить expectedConditions.presenceOf
работать как часть той же ошибки) с помощью browser.sleep(500)
, Затем в тесте я установил browser.ignoreSynchronization = true
который разблокирует все, что заблокировано, и видит содержимое браузера.
describe('standard search', function (){
beforeEach(function (){
openApp();
var searchBox = element(by.css('#inpt_search'));
searchBox.sendKeys('test');
browser.sleep(500);
});
it('should work or summat', function () {
browser.ignoreSynchronization = true;
var fileItems = element.all(by.repeater('item in list'));
expect(fileItems.count()).toEqual(50);
});
});