Ng: test нет инжектора, найденного для аргумента element для getTestability

Есть и другой вопрос о SO с той же проблемой, но решения для меня не работали. Здесь мой spec.js

describe('Protractor Demo App', function() {
  it('should have a title', function() {
    browser.driver.get('http://rent-front-static.s3-website-us-east-1.amazonaws.com/');

    expect(browser.getTitle()).toEqual('How It Works');
  });
});

И вот мой conf.js

exports.config = {
  framework: 'jasmine',
  rootElement: 'body',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['spec.js']
}

Итак, когда я пытаюсь запустить мой тест im, получая ошибку

  Message:
    Failed: Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.5.0/ng/test"
  Stack:
    Error: Failed: Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.5.0/ng/test"
        at C:\Users\ShapeR\PycharmProjects\ratest\node_modules\jasminewd2\index.js:101:16
        at Promise.invokeCallback_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:1329:14)
        at TaskQueue.execute_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:2790:14)
        at TaskQueue.executeNext_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:2773:21)

1 spec, 1 failure

У меня есть ручная загрузка для элемента body и установка корневого элемента в тело в config, но это не помогло. Я даже попытался удалить ручную boostraping и просто добавить ng-app = 'rentapplicationApp' в элемент body, но ничего не меняет, все еще ту же ошибку.

Итак, что не так?

Ответ 1

Проблема заключалась в загрузке моего приложения. По какой-то причине он не работает с тегом ng-app. Единственным рабочим решением было ручное бутстрап это

angular.bootstrap(document, ["rentapplicationApp"]);

И первым аргументом должен быть dom node, а не строка, как это было в моем случае, хотя с строкой приложение будет работать, но getTestability завершится с ошибкой.

Ответ 2

Основное значение Protractor заключается в том, что он управляет загрузкой angular для вас, включая синхронизацию, поэтому вы совершенно правы, не желая использовать: browser.ignoreSynchronization = true.

Сообщение об ошибке, которое вы получаете, заключается в том, что транспортир не может найти angular для синхронизации. Это связано с комбинацией двух проблем:

  • Страница не готова, angular не загружен
  • Не удается найти ng-приложение, даже если страница загружена.

Во-первых, из Страница настройки трассировщика.

Если ваша страница делает ручную загрузку, то транспортир не сможет загрузить вашу страницу с помощью browser.get. Вместо этого используйте базовый экземпляр webdriver - browser.driver.get. Это означает, что Protractor не знает, когда ваша страница полностью загружена, и вам может потребоваться добавить выражение ожидания, чтобы убедиться, что ваши тесты не будут соответствовать условиям гонки.

Решение 1

Добавьте wait.

Решение 2

Если у вас нет веской причины для ручной начальной загрузки или вы не хотите ждать:

  • Остановить ручную загрузку приложения
  • Используйте browser.get над browser.driver.get

Ответ 3

[ng: test] не найден инжектор для аргумента element для getTestability

Я подозреваю, что что-то не так с самим приложением, так как он загружается, так как Protractor фактически находит корневой элемент (вы можете явно установить rootElement: "body.root" внутри вашей конфигурации), но не удается настроить инжектор для корневого элемента.

Я попытался бы выяснить, что происходит поэтапно - во-первых, попробуйте запустить тест транспортира против нестроенного приложения, запущенного непосредственно из источника, чтобы убедиться, что это не веб-пакет или другая часть сборки неисправность.

Затем я попробую перейти на последнюю версию 1.x Angular и Protractor (последняя версия 3.0.0).


Самым простым обходным решением на данный момент было бы отключить синхронизацию между Protractor и Angular, используя browser.ignoreSynchronization = true:

describe("Strange Protractor/Angular problem", function () {
    beforeEach(function () {
        browser.ignoreSynchronization = true;
        browser.get("https://dl.dropboxusercontent.com/u/597502/vxcv/index.html");

        var elm = $(".navbar-brand");
        browser.wait(EC.presenceOf(elm), 5000);
    });

    it("should have an expected title", function () {
        expect($(".navbar-brand").getText()).toEqual('RENT APPLICATION');
    });
});

Конечно, есть недостатки в этом подходе - вам нужно будет использовать вызовы browser.wait здесь и там для решения проблемы синхронизации. Испытательный поток не был бы таким же естественным и простым, как при синхронизации.