Подтвердить что ты не робот

Транспортир отключается, ожидая синхронизации со страницей при использовании $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 = [];

Тест завершился неудачно, но, что еще важнее: он не уходит.

С включенным запросом(), как при запуске приложения вручную в браузере, так и при просмотре окна браузера, открытого в Protractor, данные, возвращаемые API, корректно отображаются ретранслятором.

Почему Protractor не может синхронизироваться со страницей, когда служба обменивается данными с API?

AngularJS - v1.2.0-rc3. Транспортир v0.12.0.

4b9b3361

Ответ 1

Это известная проблема, но существует временное обходное решение. Установите 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);
  });
});

Ответ 2

browser.ignoreSynchronization = true; разработал у меня.

Ответ 3

Я использую 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);
    });
});

Ответ 4

Вместо browser.ignoreSynchronization используйте browser.waitForAngularEnabled(*boolean*). browser.waitForAngularEnabled(false) устанавливает browser.ignoreSynchronization в true, browser.waitForAngularEnabled(true) устанавливает browser.ignoreSynchronization в false.

вы также можете включить это как часть конфигурационного файла тестовых наборов:

onPrepare: function () {
    'use strict';
    browser.waitForAngularEnabled(false);
}

Ответ 5

Измените или добавьте тайм-аут в файле конфигурации транспортира, чтобы тратить дополнительное время на веб-странице. как

 allScriptsTimeout: 500000

Проверить этот тайм-аут md