protractor e2e testing Возвращение обещаний после шагов по утилизации

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

Я пытаюсь написать несколько тестов транспортира для моего сайта angularjs.

Я использую в основном bootstrap и angular, никаких других сторонних библиотек, кроме случайных надстроек angular, таких как toaster и bootstrap modal.

У меня есть несколько «шагов по организации», прежде чем я перейду к части своего теста с утверждениями. Скажем так:

  • а) Человек входит в систему
  • б) Пользователь получает доступ к форме параметров (которая может отображаться или не отображаться на экране в зависимости от некоторых внешних факторов, но если ее нет, они могут открыть ее нажатием кнопки).
  • c) Человек выполняет действие в форме опций.
  • г) утверждать, что текстовое поле в форме теперь содержит правильное значение.

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

Я пытался вернуть обещание от isDisplayed вот так:

//
// Is the user settings form active at the mo?
//
function _isUserSettingsFormActive()
{
    var result = element(by.id(logoutFormID)).isDisplayed;
    return result;
}

Но если я вызываю .then в _isUserSettingsFormActive (), я получаю следующую ошибку:

[31mTypeError: undefined is not a function[0m

Однако, если я выведу результаты _isUserSettinsFormActive (), я вижу следующее, поэтому я знаю, что он что-то возвращает:

function () {
return self.elementArrayFinder_[fnName].
apply(self.elementArrayFinder_, arguments).toElementFinder_();
}

Все, что я хочу сделать, это проверить, существует ли элемент, и действовать в соответствии с ним, прежде чем выполнять свое утверждение.

Он должен быть в функции, так как этот код будет использоваться во многих местах моего тестового костюма. Это не само «ожидание», а скорее шаг, который может потребовать или не потребовать действия для настройки браузера для прохождения моего теста.


person LinKeCodes    schedule 25.06.2015    source источник


Ответы (2)


isDisplayed - это функция, поэтому она должна быть называется так:

function _isUserSettingsFormActive()
{
    var result = element(by.id(logoutFormID)).isDisplayed();
    return result;
}
person Delian Mitankin    schedule 25.06.2015
comment
Спасибо dmitankin. Думаю, я лаял не на то дерево. Я немного запутался, поскольку в документации для isDisplayed указано, что он возвращает обещание, которое будет разрешено с учетом того, отображается ли этот элемент в настоящее время на странице. Вот почему я пытался получить обещание работать / вернуться. Если это просто функция, не могли бы вы пояснить, что для меня значат документы? Просто чтобы я понял, о чем буду читать в будущем! :) - person LinKeCodes; 25.06.2015
comment
Да, это немного сбивает с толку, но в основном из-за отсутствия примеров. isDisplayed - это функция, которая возвращает обещание, поэтому вы можете: element(by.id(logoutFormID)).isDisplayed().then(function(visible) { console.log(visible); }); - person Delian Mitankin; 25.06.2015

Protractor не работает так, как привязки Java или C # к Selenium (это еще больше, но требуется больше усилий для достижения простых действий на Java или C #). Было бы безопаснее возвращать обещание подсчета, если форма параметров также не находится в DOM, но если она находится в DOM и просто скрыта, вы можете использовать isDisplayed (). Я написал два примера ниже для обеих ситуаций, включая нажатие кнопки в зависимости от условия.

Вариант 1 (отсутствует в DOM и не отображается):

function _isUserSettingsFormActive() {
    //$$('#logoutFormId') is the equivalent of element.all(by.id('logoutFormId'))
    $$('#logoutFormId').count().then(function(num){
         if(num < 1) {
            element(by.id('openLogoutButton').click();
         }
    });
};

OR

Вариант 2 (присутствует в DOM, но не отображается):

function _isUserSettingsFormActive() {
    //$('#logoutFormId') is the equivalent of element(by.id('logoutFormId'))
    $('#logoutFormId').isDisplayed().then(function(visible){
         if(!visible) {
                element(by.id('openLogoutButton').click();
         }
    });
};
person sonhu    schedule 19.07.2016