Транспортир не может обнаружить Angular 5 в развернутом приложении - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь создать репозиторий с тестами E2E для моего веб-приложения, используя Protractor и Cucumber.Я начал с этого репозитория: https://github.com/spektrakel-blog/angular-protractor-cucumber

Когда я заставляю Protractor рассматривать приложение как обычную веб-страницу, тесты запускаются нормально.Тестовый бегун взаимодействует с приложением и ожидает некоторого результата.Дело в том, что я хотел бы, чтобы Protractor обнаружил Angular, чтобы дождаться стабильности зон перед проверкой утверждений «Тогда».

Вот мой protractor.conf.js:

exports.config = {
  allScriptsTimeout: 30000,
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: ['--no-sandbox']
    }
  },
  directConnect: true,
  baseUrl: 'http://<ci-server-address>/',

  specs: [
    './e2e/features/*.feature'
  ],

  framework: 'custom',
  frameworkPath: require.resolve('protractor-cucumber-framework'),

  cucumberOpts: {
    require: ['./e2e/steps/**/*.ts'],
    strict: true,
    format: [
      'json:reports/summary.json'
    ],
    dryRun: false,
    compiler: []
  },

  onPrepare() {
    browser.ignoreSynchronization = true;
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
  }
};

Вкратце - тесты выполняются со следующей конфигурацией, но когда я удаляю browser.ignoreSynchronization = true;, я получаю следующую ошибку: Timed out waiting for asynchronous Angular tasks to finish after 30 seconds. This may be because the current page is not an Angular application..

Вещи, которые я пробовал до сих пор (без улучшений):

  • добавление ng-app к тегу <body>
  • проверка window.getAllAngularRootElements() - возвращает app-root правильно
  • проверка window.getAllAngularTestabilities() - возвращает Testability object
  • запуск тестов в Chrome (с изолированной программной средой или без нее)
  • запуск тестов в Firefox
  • с попытками сервера CI с развернутым приложением и локального env с ng serve

Я использую последние версии Protractor, Cucumber, Chai и TypeScript.Любая помощь приветствуется.Заранее большое спасибо!

Ответы [ 5 ]

0 голосов
/ 24 июля 2018

транспортир / глобалы были удалены из v4.0.9, теперь мы можем просто импортировать транспортиры-помощники непосредственно из пространства имен транспортира, которое намного чище.

Пример:

import {browser} from 'protractor';
0 голосов
/ 22 июля 2018

Убедитесь, что ваше приложение действительно стабильно:

  constructor(zone:NgZone)
  {
    zone.onStable.subscribe(()=> window.console.info('onStable'));
    zone.onUnstable.subscribe(()=> window.console.info('onUnstable'));
    zone.onMicrotaskEmpty.subscribe(()=> window.console.info('onMicrotaskEmpty'));
  }
0 голосов
/ 18 июля 2018

Это звучит как потенциальная Зона проблема для меня.Угол зависит от ZoneJS (ngZone).Нередко встречается эта ошибка при использовании любых асинхронных функций javaScript, таких как setTimeout(), setInterval() и т. Д. *

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

На вашем месте я бы посмотрел в вашем приложении на любые асинхронные функции, которые обезьяна ZoneJS исправляет .Кроме того, в общем, ищите в своем коде все, что работает вне контекста зоны ваших приложений.

Вот хорошая статья о ZoneJS, которая не только помогает вам понять ZoneJS, но и перечисляет функции, которые были исправлены обезьяной Понимание ZoneJS

0 голосов
/ 19 июля 2018

Попробуйте варианты ниже

// CSS Selector for the element housing the angular app - this defaults to
// body, but is necessary if ng-app is on a descendant of <body>.
rootElement: 'body',

// The timeout in milliseconds for each script run on the browser. This should
// be longer than the maximum time your application needs to stabilize between
// tasks.
allScriptsTimeout: 3600 * 1000,

// How long to wait for a page to load.
getPageTimeout: 3600 * 1000,

и, если ваша угловая страница загружается, попробуйте отключить анимацию с кодом ниже

    var disableNgAnimate = function () {
        angular.module('disableNgAnimate', []).run(['$animate', function ($animate) {
            $animate.enabled(false);
        }]);
    };
    browser.addMockModule('disableNgAnimate', disableNgAnimate);

Надеюсь, что вышеуказанные решения помогут вам,browser.ignoreSynchronization = true; устарело, попробуйте использовать browser.waitForAngularEnabled(true); см. здесь для дополнительных входных данных

0 голосов
/ 15 мая 2018

пытается удалить baseUrl: 'http://<ci-server-address>/', в транспортире conf.js

...