在Protractor/WebDriverJS中拒绝了承诺

ale*_*cxe 13 javascript testing selenium promise protractor

WebDriverJS和Protractor本身完全基于承诺的概念:

WebDriverJS(以及Protractor)API完全是异步的.所有功能都返回承诺.WebDriverJS维护一个待处理的承诺队列,称为控制流,以保持执行的有序性.

并且,根据定义:

promise是一个表示值的对象,或者是值的最终计算.每个承诺都以挂起状态开始,可以使用值成功解析,也可以拒绝指定错误.

关于承诺拒绝的最后一部分是我不完全理解并且未在Protractor中处理过的事情.我们看到和编写的一种常见模式是使用then()并为成功解决的承诺提供功能:

element(by.css("#myid")).getAttribute("value").then(function (value) {
    // do smth with the value
});
Run Code Online (Sandbox Code Playgroud)

问题:

是否有可能由任何Protractor/WebDriverJS函数返回的承诺无法成功解决并被拒绝?我们真的应该担心并处理它吗?

Mic*_*nov 14

我在使用时经历过承诺拒绝的用例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);
Run Code Online (Sandbox Code Playgroud)

这里,如果元素在页面上,success将被执行,否则,如果在1秒后没有找到,fail则将被调用.我的第一点是,提供拒绝回调可以提供与人们期望的一致的能力.在这种情况下,我确信承诺将永远解决truefalse,所以我可以建立一个依赖它的套件.如果我不提供fail回调,那么我会得到一个Uncaught exception由于超时,这仍然会失败我的特定规格,仍然运行其余的规格.它不会被捕获,Protractor会抓住它,但在这里我想提出第二点,Protractor被认为是用来编写和运行代码的工具,如果Protractor捕获到异常,然后此异常使您的代码未处理,您的代码有泄漏.但是......同时我不认为人们应该浪费时间来检测测试中的所有内容:如果页面上没有元素或点击失败,那么相应的规范也会明显失败,这在大多数情况下都没问题这些案件.除非你想使用失败的结果在它之上构建一些代码,就像在我的样本中一样.