2015-06-11 7 views
2

У меня есть тест-протрактор, который инициирует перезагрузку одного и того же Углового приложения. Иногда он терпит неудачу в сборке Тревиса, но пройдет через один или два перезапуска сборки. Редко это терпит неудачу на моей локальной машине. В сборниках 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> 

ответ

2

Я иногда сталкиваюсь с проблемами с неграмотными страницами входа (некоторые из которых имеют несколько шагов). Я думаю, что ваша страница выбора языка может быть похожей. Решение является немного логичным в ваших тестах, в сочетании с открытым API Webdriver в browser.driver.

if ('some condition that determines you are on a non-Angular page') { 
    browser.driver.findElement(by.id('language-choice')).click(); 
} 

Лучшие условия для теста:

  1. Test, если отображается какой-то уникальный элемент.
  2. Получить URL-адрес текущей страницы и сравнить ее с ожидаемым значением.

И используйте browser.driver в любое время, когда вы не находитесь на Угловой странице, поскольку он обходит Транспортир.В противном случае, Протрактор будет искать Угловое, не найти его и бросить ошибки. Все, что вы можете сделать с browser.driver можно найти здесь, в нижних отделах меню: http://angular.github.io/protractor/#/api

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

browser.driver.wait(function() { 
    return browser.driver.getCurrentUrl().then(function(url) { 
     return url.toString().indexOf('my angular page url') !== -1; 
    }, function(err) { 
     throw err; 
    }); 
}, 5000, 'Timed out waiting for your Angular page to load.'); 

Это особенно полезно в вашем заявлении onPrepare (просто добавьте return в самое начало, до browser.driver.wait). Тест будет ждать загрузки вашей Угловой страницы, после чего вы сможете транспортировать вокруг вашего сердца.

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

+0

Спасибо Исаак! У меня не было времени, чтобы вернуться в проект, но когда я это сделаю, я дам ему повод и подтвержу, работает ли он. –

+0

'browser.driver.getCurrentUrl()' работал при замене 'browser.getCurrentUrl()'. Большое спасибо! –

Смежные вопросы