Использование транспортира с 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)
};
}