Ответ 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
из-за тайм-аута, который по-прежнему будет терпеть неудачу в моей конкретной спецификации и все еще будет работать с остальными спецификациями. Кстати, он не будет укушен, Транспартер поймает его, но здесь я хочу принести второй момент, что Транспортер считается инструментом, который вы используете для написания и запуска своего кода, и если исключение поймано Транспортером, то это исключение оставило ваш код необработанным и ваш код имел утечку. Но... в то же время я не думаю, что нужно тратить время на то, чтобы поймать все на тестах: если на странице нет элемента или щелчка не удалась, то соответствующая спецификация, очевидно, тоже потерпит неудачу, что прекрасно в большинстве случаев. Если вы не хотите использовать результат неудачи для сборки некоторого кода поверх него, как в моем примере.