ng: проверить, не найден ли инжектор для аргумента элемента 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']
}
Поэтому, когда я пытаюсь запустить свой тест, я получаю ошибку
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
У меня есть ручная начальная загрузка для тела элемента и установить rootElement для тела в конфигурации, но это не помогло. Я даже пытался удалить ручной бустрапинг и просто добавить ng-app='rentapplicationApp' к элементу body, но это ничего не меняет, все та же ошибка.
Так что не так?
3 ответа
Проблема была в загрузке моего приложения. По какой-то причине он не работает с тегом ng-app. Единственным рабочим решением было запустить его вручную
angular.bootstrap(document, ["rentapplicationApp"]);
И первым аргументом должен быть dom node, а не строка, как это было в моем случае, хотя со строкой приложение будет работать, но getTestability завершится ошибкой.
[ng:test] не найден инжектор для аргумента элемента getTestability
Я подозреваю, что что-то не так с самим приложением, как оно загружается, так как Protractor
на самом деле находит корневой элемент (вы можете явно установить rootElement: "body.root"
в вашей конфигурации), но не удается настроить инжектор для корневого элемента.
Я постараюсь выяснить, что происходит, шаг за шагом - сначала попробуйте запустить тест транспортира для не построенного приложения, запущенного непосредственно из исходного кода, чтобы убедиться, что это не веб-пакет или другая часть ошибки сборки.
Затем я попробую обновить систему до последней версии 1.x Angular and Protractor (3.3.0 - самая последняя версия).
Самый простой обходной путь на данный момент - отключить синхронизацию между транспортиром и 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
звонки тут и там, чтобы решить проблему времени. Ход тестирования не будет таким естественным и простым, как при синхронизации.
Основная ценность Protractor заключается в том, что он управляет угловой нагрузкой для вас, включая синхронизацию, поэтому вы совершенно правы в том, что не хотите использовать: browser.ignoreSynchronization = true
,
Сообщение об ошибке, которое вы получаете, состоит в том, что транспортир не может определить угловое положение для синхронизации. Это из-за комбинации двух проблем:
- Страница не готова, угловая не загружена
- Невозможно найти приложение ng, даже после загрузки страницы
Во-первых, со страницы настройки транспортира.
Если ваша страница загружается вручную, Protractor не сможет загрузить вашу страницу с помощью browser.get. Вместо этого используйте базовый экземпляр webdriver - browser.driver.get. Это означает, что Protractor не знает, когда ваша страница полностью загружена, и вам может понадобиться добавить оператор ожидания, чтобы убедиться, что ваши тесты избегают условий гонки.
Решение 1
Добавьте оператор ожидания.
Решение 2
Если у вас нет веских причин для ручной загрузки или вы не хотите ждать:
- Прекратить загрузку приложения вручную
- использование
browser.get
надbrowser.driver.get