Protractor/WebDriverJS中的被拒绝的承诺

13

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

WebDriverJS(因此,Protractor)API是完全异步的。所有函数都返回promises。 WebDriverJS维护一个待处理promise队列,称为控制流,以保持执行有序。

根据定义:

Promise是表示值或值的最终计算的对象。每个promise都始于未决状态, 可以成功解决为值,也可以被拒绝以指定错误

关于promise rejection的最后一部分是我不完全理解并且在Protractor中没有处理过的内容。我们看到并编写的常见模式是使用then()并针对成功解决的promise提供一个函数:

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

问题:

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


@Bergi 很棒的回答,感谢提供链接! - alecxe
2个回答

14

在使用browser.wait()时,我遇到了Promise拒绝的用例。以下是一个示例:

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。我的第一点是,为拒绝提供回调函数可以使我们在预期结果上保持一致。在这种情况下,我相当确定承诺将始终解析为truefalse,因此我可以构建一个依赖于它的测试套件。如果我不提供fail回调,则由于超时而会收到未捕获的异常,这仍然会导致特定规范失败,并且仍然运行其余规范。顺便说一下,它不会未被捕获,Protractor会捕获它,但是我想提出第二点,即Protractor被认为是您用来编写和运行代码的工具,如果Protractor捕获异常,则此异常已经离开了您的代码并且您的代码有泄漏。但是...与此同时,我认为测试中不应该浪费时间去捕获所有东西:如果页面上没有元素或者单击失败了,则相应的规范显然也会失败,在大多数情况下,这样做是可以接受的。除非你想使用失败的结果来构建一些代码,就像在我的示例中一样。


3
这就是Promise的好处,你会得到一个响应,要么是数据响应,要么是错误信息。如果使用像Webdriver这样的一系列Promise,你将得到一个响应数组或者第一个失败的响应。如何处理失败的响应取决于你,我通常只是把它转储到日志中,以便控制台查看哪些失败了。你需要弄清楚的唯一一件事情是,你是中止其余测试还是继续进行。
这里也有一篇不错的文章:http://www.toolsqa.com/selenium-webdriver/exception-handling-selenium-webdriver/ 顺便说一句,你所做的很好,只是从未捕获任何错误,我不确定这对你是否重要,如果你想在某个地方记录它们,你也可以在一个函数中抽象调用以自动处理错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接