Я опишу проблему как можно лучше - если я упустил детали, скажите, пожалуйста, - я все еще изучаю Protractor.
Я пишу свой первый тест транспортира для веб-сайта, и его содержание очень простое.
учитель.js
describe("teacher list", function () {
beforeEach(function () {
browser.get('http://127.0.0.1:9000/teachers');
});
it("has teacher", function () {
initiateDebug();
var teachers = element.all(by.repeater("teacher in items track by $index"));
initiateDebug();
expect(teachers.count()).toBe(20);
initiateDebug();
})
});
...где initiateDebug()
— это функция, определенная в функции onPrepare
в protractor_conf.js
следующим образом:
инициировать отладку()
global.initiateDebug = function() {
browser.pause(debugPortNumber);
debugPortNumber++;
};
Причина, по которой я включил это, заключалась в том, что вызов browser.pause() приводит к ошибке:
Port 5858 is already in use. Please specify another port to debug.
[launcher] Process exited with error code 1
и я скопировал временное исправление, предложенное участником в ветке этой проблемы: https://github.com/angular/protractor/issues/2206.
Назад к проблеме
Вопрос 1
Если я запускаю этот код, страница просто висит и ничего не загружается. Погуглив придумал это (Получение ошибки : ошибка при ожидании синхронизации Protractor со страницей: {}), и я напрямую использовал browser.driver.get()
, и это похоже на работоспособное решение.
Однако мой первый вопрос: это случай, когда он не может найти angular? Потому что я отчетливо помню, что когда я запускал Protractor за неделю до этого, если он не мог найти Angular, он выдавал эту ошибку:
UnknownError: javascript error: angular is not defined
Однако ошибка из моей консоли заключается в следующем:
1) teacher list has teacher
Message:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at [object Object]._onTimeout (/Users/Baggio/project/project_bugs/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1812:23)
Вопрос. Причина в том, что эта ошибка возникает из-за того, что страница постоянно зависает при загрузке, а асинхронный вызов никогда не выполняется? Или может быть, что angular не загружается? Или что-то еще?
Я совершенно уверен, что транспортир загружается, потому что я вывел его в консоль, он перечисляет все свойства объекта.
И как продолжение вопроса 1, вот следующий вопрос, который я не понимаю.
Вопрос 2
Если я попытаюсь запустить этот тест с browser.driver.get()
, я получу точно такое же сообщение об ошибке:
1) teacher list has teacher
Message:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at [object Object]._onTimeout (/Users/Baggio/project/project_bugs/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1812:23)
Так что это не должно иметь ничего общего с загрузкой страницы или нет.
Что я пробовал
Я попытался после вызова инициироватьDebug() в интерактивном режиме отладки (введя ту же строку, что и первая точка останова, и я получил это:
wd-debug> repl
> element.all(by.repeater("teacher in items track by $index"))
A Jasmine spec timed out. Resetting the WebDriver Control Flow.
A Jasmine spec timed out. Resetting the WebDriver Control Flow.
F
Если я правильно понял (https://github.com/angular/protractor/blob/master/docs/debugging.md), ввод команды protractor должен что-то дать, но здесь он просто возобновил поток управления вне режима отладки, не соответствуя спецификации Jasmine.
Я представлю здесь соответствующий код, который:
HTML-код, который строка element.all
должна взять из
<section ng-if="staFlag" class="teacher-item yes-cursor cursor-over" ng-repeat="teacher in items track by $index">
Вопрос 2. Почему здесь не работает Protractor?
Вопрос 3
Что я тоже пробовал - думая, что это тот случай, когда Protractor может не найти Angular, определяя свойство rootElement
в protractor_conf.js
(добавляя ng-app='kp'
в корневой файл html и rootElement: 'html'
в файл конфигурации), но он возвращает но точно такое же сообщение об ошибке:
1) teacher list has teacher
Message:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at [object Object]._onTimeout (/Users/Baggio/project/project_bugs/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1812:23)
Message:
Мысль 3: может ли это эффективно доказать, что это не проблема, когда Protractor не может найти Angualr?
Дополнительная информация
Я должен запустить этот тест на том же сервере, где веб-сайт работает локально, потому что по какой-то причине, если он запускается на другом сервере, веб-сайт вообще не работает. Под «не работает» я имею в виду: страница загружается правильно, но все биты, требующие получения данных из бэкэнда через Restangular, не отображаются.
Короткий вопрос
Что именно мешает правильному выполнению этого теста Protractor? Я думаю, что упускаю что-то очень очевидное, но я смотрел на это часами и не придумал никаких идей.
Я был бы очень признателен за указатели в правильном направлении или решение, если это возможно - большое спасибо.