Отклонено promises в Protractor/WebDriverJS

WebDriverJS и Protractor полностью основаны на концепции promises:

API-интерфейсы WebDriverJS (и, следовательно, Protractor) полностью асинхронны. Все функции возвращают promises. WebDriverJS поддерживает очередь ожидающих promises, называемых элементами управления чтобы сохранить выполнение.

И, в соответствии с

Вопрос:

Возможно ли, что обещание, возвращенное любой из функций Protractor/WebDriverJS, не будет успешно разрешено и будет отклонено? Должны ли мы действительно беспокоиться об этом и справляться с этим?

Ответ 1

Я испытал случай отказа от обещания при использовании browser.wait(). Вот пример:

var EC = protractor.ExpectedConditions;

function isElementVisible() {

    var el = element(by.css('#myel'));

    // return promise
    return browser.wait(EC.visibilityOf(el), 1000)
    .then(function success() {
        return true; // return if promise resolved
    }, function fail() {
        return false; // return if promise rejected
    });
}

expect(isElementVisible()).toBe(true);
expect(isElementVisible()).toBe(false);

Здесь, если элемент находится на странице, будет выполняться success, в противном случае, если он не будет найден, когда пройдет 1 секунда, тогда будет вызываться fail. Мой первый момент заключается в том, что предоставление обратного вызова для отклонения дает возможность соответствовать тому, что следует ожидать. В этом случае я уверен, что обещание всегда будет разрешено true или false, поэтому я могу построить набор, полагающийся на него. Если я не предоставляю обратный вызов fail, тогда я получу Uncaught exception из-за тайм-аута, который по-прежнему будет терпеть неудачу в моей конкретной спецификации и все еще будет работать с остальными спецификациями. Кстати, он не будет укушен, Транспартер поймает его, но здесь я хочу принести второй момент, что Транспортер считается инструментом, который вы используете для написания и запуска своего кода, и если исключение поймано Транспортером, то это исключение оставило ваш код необработанным и ваш код имел утечку. Но... в то же время я не думаю, что нужно тратить время на то, чтобы поймать все на тестах: если на странице нет элемента или щелчка не удалась, то соответствующая спецификация, очевидно, тоже потерпит неудачу, что прекрасно в большинстве случаев. Если вы не хотите использовать результат неудачи для сборки некоторого кода поверх него, как в моем примере.

Ответ 2

Это замечательно в promises, вы получите ответ, либо ответ данных, либо сообщение об ошибке. Что распространяется на серию из promises, например, с помощью Webdriver, вы собираетесь получить массив ответов или ответ сбоя первого, который терпит неудачу. Как вы справляетесь с неудавшимся ответом, зависит от вас. Обычно я просто выгружаю его в журнал для консоли, чтобы узнать, что не удалось. Единственное, что вам нужно выяснить, это прервать остальные тесты или продолжить.

Вот достойная статья на эту тему. http://www.toolsqa.com/selenium-webdriver/exception-handling-selenium-webdriver/

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