WebDriverJS和Protractor本身完全基于承诺的概念:
WebDriverJS(以及Protractor)API完全是异步的。所有 函数返回承诺。 WebDriverJS维护一个待处理的承诺队列,称为控件 流程,以保持执行有序。
而且,根据definition:
承诺是表示价值或最终价值的对象 计算一个值。每个承诺都在待定状态下开始 可以使用值成功解析,也可以拒绝 指定错误。
关于承诺拒绝的最后一部分是我不完全理解并且未在Protractor中处理过的事情。我们看到和编写的一个常见模式是使用then()
并为成功解决的承诺提供函数:
element(by.css("#myid")).getAttribute("value").then(function (value) {
// do smth with the value
});
问题:
任何Protractor / WebDriverJS功能返回的承诺是否有可能无法成功解决并被拒绝?我们真的应该担心并处理它吗?
答案 0 :(得分:13)
我在使用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
,这仍然会失败我的特定规格并仍然运行其余的规范。它不会被捕获,Protractor会抓住它,但在这里我想提出第二点,Protractor被认为是用来编写和运行代码的工具,如果Protractor捕获到异常,然后此异常使您的代码未处理,您的代码有泄漏。但是......同时我不认为人们应该浪费时间来检测测试中的所有内容:如果页面上没有元素或点击失败,那么相应的规范也会明显失败,这在大多数情况下都没问题这些案件。除非你想使用失败的结果在它之上构建一些代码,就像在我的样本中一样。
答案 1 :(得分:3)
对于承诺,您将获得响应,无论是数据响应还是错误消息,这都是一件好事。这延伸到像Webdriver使用的一系列承诺,你将获得一系列响应或第一个失败的失败响应。如何处理失败的响应取决于您我通常只是将其转储到日志中以便控制台查看失败的内容。您唯一需要弄清楚的是,您是否中止了其余的测试,或者继续。
这是一篇关于这个主题的优秀文章。 http://www.toolsqa.com/selenium-webdriver/exception-handling-selenium-webdriver/
Fyi你正在做的很好,你只是从不打扰抓住任何错误,但我不确定这对你是否重要,你也可以在函数中抽象调用以自动处理错误如果你想将它们记录在某个地方,你就可以了。