Ожидание диалогов ионической загрузки с помощью Транспортера

Есть похожие вопросы (см. ниже), но никто не решает эту проблему. Я пишу протракторные тесты для Ионного проекта. Мне нужно выполнить тесты, когда появляется диалоговое окно "Ионная загрузка" и исчезает.

Я создал репо с голыми костями приложения и те тесты, которые нужно выполнить. Решите эту проблему и решите проблему (я описываю проблему ниже): https://github.com/TmanTman/StackoverflowQ. Просто настройте путь к вашему Chrome для своей системы в conf.js.

Чтобы смоделировать диалоговое окно асинхронной ионической загрузки, я просто добавляю это в контроллер в пустой проект Ionic:

$interval( function() {
        $ionicLoading.show({
            template: 'Async ionicLoading',
            duration: 5000
        });
      }, 5000 , 1);
    })

Мне нужно заставить транспортир ждать появления диалогового окна, выполнить некоторые тесты, дождаться исчезновения диалога, а затем выполнить еще несколько тестов. Моя последняя попытка в моем тестовом файле:

it('should only test when ionicLoading appears', function() {
  browser.wait(function(){
    return element(by.css('.loading-container.visible.active')).isPresent();
  }, 10000);
  var ionicLoadingText = element(by.css('.loading-container.visible.active')).getText();
  expect(ionicLoadingText).toEqual('Async IonicLoading');
})



it('should only test once ionicLoading disappears', function() {
  browser.wait(function() {
    var deferred = protractor.promise.defer();
    var q = element(by.css('.loading-container.visible.active')).isPresent()
      q.then( function (isPresent) {
        deferred.fulfill(!isPresent);
      });
      return deferred.promise;
    });
  expect(1).toEqual(1);
})

Я пытаюсь избежать использования синхронной функции сна, так как мой код очень асинхронный. Я пробовал бесчисленные вариации, но я не могу заставить его работать. Ссылки, которые я использовал для информации, включают:

Ответ 1

Проблема двояка:

1) Из того, что я могу вывести, свойство длительности метода $ionicLoading реализовано с помощью функции тайм-аута. Транспортир не работает с $timeout. Поэтому вместо использования свойства duration диалоговое окно $ionicLoading может быть скрыто с помощью $interval call (адаптация кода из вопроса):

$interval( function() {
      $ionicLoading.show({
          template: 'Async IonicLoading'
      });
      $interval( function() {
        $ionicLoading.hide();
      }, 5000, 1)
  }, 5000 , 1);

2) Код для обнаружения асинхронного изменения следующий:

it('should only test when ionicLoading appears', function() {
    browser.wait(function() {
      var deferred = protractor.promise.defer();
      var q = element(by.css('.loading-container.visible.active')).isPresent()
      q.then( function (isPresent) {
          deferred.fulfill(isPresent);
      });
      return deferred.promise;
    }, 10000);
      var ionicLoadingText = element(by.css('.loading-container.visible.active')).getText();
      expect(ionicLoadingText).toEqual('Async IonicLoading');
    })

    it('should only test once ionicLoading disappears', function() {
      browser.wait(function() {
        var deferred = protractor.promise.defer();
        var q = element(by.css('.loading-container.visible.active')).isPresent()
          q.then( function (isPresent) {
            deferred.fulfill(!isPresent);
          });
          return deferred.promise;
        }, 10000);
      expect(1).toEqual(1);
    })

Затем проходят оба теста.