получить текст элемента во время тайм-аута angular $ в транспортире

Примечание: использование MEAN — Mocha, Express, Angular и Node для приложения.

Я изучаю, как проводить тест e2e, и я создал небольшое приложение для тестирования. Одна вещь, которую он делает, это то, что всякий раз, когда вы выполняете действие, он отображает сообщение в течение X секунд, а затем исчезает. Я использую angulars $timeout.

$scope.displayMessage = function(messageIn, borderColor){

        var timeoutTime = 5000; //clear the message after x seconds
        $scope.borderType = "1px solid " + borderColor;

        $scope.messages = messageIn;

        $scope.visibility = true; //reveal the div
        $timeout.cancel($scope.timeout); //cancel any previous timers

        $scope.timeout = $timeout(function(){ //Set and start new timer.

            $scope.visibility = false;
            $scope.messages = "";
        }, timeoutTime);
    };

Сейчас я пытаюсь это проверить. В настоящее время у меня есть

 it("should display message", function(done){

        var button = element(by.id("getStudents"));

        console.log("clicking button");

        var messageElem = element(by.binding("messages"));

        button.click().then(function () {

            console.log("button clicked");

            messageElem.getText().then(function(text){

               console.log("The text should equal: " + text);
            });

            //expect(messageElem.getText()).toBe("Students retrieved");
            console.log("test executed");

        });

        done();
    });

Но, похоже, он ждет, пока не истечет время ожидания, чтобы выполнить messageElem.getText().then(), после чего div был очищен. Во время тайм-аута будет распечатан журнал «выполненный тест», но не функция «getText()». Я предполагаю, что это как-то связано с жизненным циклом углов?

А вот и HTML (в формате Jade)

 div(ng-model="messages",ng-show = "visibility", style = "clear:both;padding-top:3em;border:{{borderType}};text-align:center;")

    h3
        {{messages}}

игнорируйте мой стиль, мне было лень делать css файл для этого тестового приложения :D


person Chauncey Philpot    schedule 04.06.2014    source источник


Ответы (2)


Попробуйте использовать $interval вместо $timeout.

Транспортир пытается дождаться полной загрузки страницы, прежде чем выполнять какое-либо действие (например, найти элемент или отправить команду элементу).

Прочитайте здесь. Подробности здесь.

person user2847643    schedule 04.06.2014
comment
Ах, подробности заставили меня сделать ptor.ignoreSynchronization = true для этого конкретного теста. Это сработало после этого. Не уверен, что это хорошая практика или нет. - person Chauncey Philpot; 04.06.2014
comment
Это должно работать, но не лучшее решение. Вы можете легко заменить $timeout на $interval, просто используйте count = 1, а остальное останется прежним. Это капля на замену. Простой. - person user2847643; 04.06.2014
comment
Хорошо, да, сейчас он зависает, но если я вручную нажму кнопку, которую должен делать транспортир, он заработает правильно. Странный - person Chauncey Philpot; 04.06.2014
comment
Проголосовал за интересную идею, но она мне не подошла. Боюсь, ignoreSynchronization — единственный относительно простой способ решить эту проблему. - person alecxe; 21.03.2015

Я взломал это, используя приведенный ниже блок кода. У меня была панель уведомлений из стороннего пакета узлов (ng-notifications-bar), которая использовала $timeout вместо $interval, но мне нужно было ожидать, что текст ошибки имеет определенное значение. Я использовал короткий сон(), чтобы разрешить появление анимации панели уведомлений, переключил ignoreSynchronization на true, чтобы Protractor не ждал окончания $timeout, установил ожидаемый() и снова переключил ignoreSynchronization на false, чтобы Protractor мог продолжайте тест в рамках обычной каденции AngularJS. Я знаю, что сон не идеален, но он очень короткий.

browser.sleep(500);
browser.ignoreSynchronization = true;
expect(page.notification.getText()).toContain('The card was declined.');
browser.sleep(500);
browser.ignoreSynchronization = false;
person Chris Traynor    schedule 18.08.2015