Использование транспортира с ng-upgrade

Я работаю над переносом моего приложения AngularJS (1.6) на Angular (4), и теперь у меня есть гибридное приложение, загруженное с помощью NgUpgrade.

Однако, это, кажется, полностью сломало мои тесты транспортира.

Ошибка: истекло время ожидания завершения асинхронных угловых задач через 11 секунд. Это может быть потому, что текущая страница не является угловым приложением. Пожалуйста, смотрите FAQ для получения дополнительной информации: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular

В ожидании элемента с локатором - Locator: By(селектор css, кнопка.toggle-summary-button)

Изменения в гибридном приложении

Приложение работает нормально, и компоненты AngularJS и Angular работают как положено. Изменения, которые я сделал в процессе начальной загрузки:

1 удалено ng-app из тега html:

<html lang="en" *ng-app="myapp">

2 Добавлены модули приложений (@NgModule) и т. Д.

3 Использовал NgUpgrade для начальной загрузки приложения:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
  const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
  upgrade.bootstrap(document.body, ['myapp'], {strictDi: true});
});

Испытания транспортира

Основываясь на вышеупомянутой ошибке, проблема, кажется, связана с тем, что Protractor делает, когда ожидает Angular. У меня есть блок beforeEach, который загружает страницу входа в систему, заполняет детали и входит в систему. Странно, что он по-прежнему открывает страницу и вводит текст в поле имени пользователя, но затем не может идти дальше.

Я не могу понять, почему все по-другому, и кажется, что никакие перемены вокруг меня не помогают, поэтому любое руководство будет приветствоваться!

Я пытался, но безуспешно

  • добавив rootElement: body в мой файл конфигурации транспортира
  • добавив "ng12Hybrid: true" в мой конфигурационный файл транспортира - я получаю сообщение о том, что он больше не нужен, так как он автоматически обнаруживает.
  • увеличивая allScriptsTimeout установка от 11000 до 60000 и время ожидания истекло.
  • выключая waitForAngularEnabled установка. Это решает проблему с полями входа в систему, но тогда ни одна из моих http-проверок не работает и тесты не пройдены.

1 ответ

Что смешно, я задал тот же вопрос (+github) 15 месяцев назад по поводу углового от 1 до углового 2:

Транспортир + Гибридный угловой 1+2 Применение = Ошибка

Без какого-либо решения я откатился до углового 1. Сегодня мы решили снова попытаться перейти от углового 1 к 4, как вы, и попали на ваш вопрос, потому что у нас все та же проблема...

Ну, на самом деле не так смешно... Я не могу понять, почему такая важная особенность так отделена. Предполагалось, что AngularJ будет активно поддерживаться из-за серьезного изменения в Angular 2+! Это немного разочаровывает (извините за ожидание реального ответа, я буду публиковать, если обновления)...

Я придумал временный прием, чтобы решить эту проблему, переопределив waitForAngular работают с приведенной ниже логикой.

onPrepare: function() {
            
            var script = "var callback = arguments[arguments.length - 1];" +
                "angular.element(document.querySelector(\"body\")).injector()"+
                ".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)");

            browser.waitForAngular = function() {
                return browser.executeAsyncScript(script)
            };
}
Другие вопросы по тегам