У меня есть тест-протрактор, который инициирует перезагрузку одного и того же Углового приложения. Иногда он терпит неудачу в сборке Тревиса, но пройдет через один или два перезапуска сборки. Редко это терпит неудачу на моей локальной машине. В сборниках Travis используется Firefox, но в то время, когда он сработал на моей машине, они использовали как хромированный рекордер Firefox, так и Selenium.Тест на проталкивание иногда терпит неудачу при перезагрузке Угловое приложение
Я установил rootElement: 'html'
(как рекомендовано в this GitHub issue on Protractor), потому что именно там ng-app
, но я все еще получаю эту ошибку:
Error while waiting for Protractor to sync with the page: "root element (html) has no injector. this may mean it is not inside ng-app."
ошибка является результатом angular.element('html').injector()
возвращения falsey, хотя Angular has loaded , A previous test в коде Protractor подтверждает это.
Тест включает в себя перенаправление на другой index.html
, который оказывается одним и тем же угловым приложением. Причиной перенаправления является выбор языка, а затем перезагрузка приложения на этом языке.
Существует несколько локалей (два показаны здесь для простоты). app
- это корень документа, поэтому app/index.html
- это точка входа, которая определяет системный язык или по умолчанию en-gb
, а затем перенаправляет на app/<locale>/index.html
. Первый не является угловым приложением (app/
); последний (app/<locale>/
) и ссылки на ../common/
для библиотек и файлов с угловым модулем. Файлы index.html
в папках локали идентичны.
Что происходит, когда вы посещаете корень документа?
/
-> перенаправлять /en-gb/#/language
И когда вы выбираете немецкий язык?
/en-gb/#/language
редирект ../de/#/menu
->/de/#/menu
Структура каталогов:
└── app
├── common
│ ├── fonts
│ ├── images
│ ├── lib
│ ├── modules
│ └── styles
├── de
│ ├── i18n.js
│ └── index.html
├── en-gb
│ ├── i18n.js
│ └── index.html
└── index.html
Тест:
(function() {
'use strict';
describe('Module: app, language screen:', function() {
beforeEach(function() {
browser.get('http://localhost:9000/en-gb/#/language/');
this.$germanChoice = // get the clickable element to select German
this.$buttonContinue = // get the clickable element to continue
});
describe('continue button', function() {
it('should go forward to the menu', function() {
this.$germanChoice.click();
this.$buttonContinue.click();
expect(browser.getCurrentUrl()).toBe('http://localhost:9000/de/#/menu/');
});
});
});
}());
Locale index.html
используя уменьшенные файлы:
<!doctype html>
<!--[if IE 8]> <html id="ng-app" ng-app="app" lang="{{ app.locale.html }}" class="no-js lt-ie10 lt-ie9"> <![endif]-->
<!--[if IE 9]> <html id="ng-app" ng-app="app" lang="{{ app.locale.html }}" class="no-js lt-ie10"> <![endif]-->
<!--[if gt IE 9]><!--> <html id="ng-app" ng-app="app" lang="{{ app.locale.html }}" class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title ng-bind="app.page.title ? app.page.title + ' - ' + app.page.titleBase : app.page.titleBase"></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="../common/lib/nouislider/jquery.nouislider.css" />
<!--[if gt IE 8]><!-->
<link rel="stylesheet" href="../common/styles/b8a085fb.main.css">
<!--<![endif]-->
<!--[if lt IE 9]>
<link rel="stylesheet" href="../common/styles/f71e8123.ie.css">
<![endif]-->
<!--[if lt IE 9]>
<script src="../common/scripts/a5663f12.lt-ie9.js"></script>
<![endif]-->
</head>
<body ng-class="{ 'ios6': app.environment.ios6, 'gt-ios6': app.environment.gtIos6, 'cordova': app.environment.cordova }">
<div ng-view="" autoscroll="true"></div>
<script src="../common/scripts/cbd2241e.app.js"></script>
<script src="i18n.js"></script>
</body>
</html>
Спасибо Исаак! У меня не было времени, чтобы вернуться в проект, но когда я это сделаю, я дам ему повод и подтвержу, работает ли он. –
'browser.driver.getCurrentUrl()' работал при замене 'browser.getCurrentUrl()'. Большое спасибо! –