Protractor/WebDriverJS 中拒绝的承诺
Rejected promises in Protractor/WebDriverJS
WebDriverJS 和 Protractor 本身完全基于 promises 的概念:
WebDriverJS (and thus, Protractor) APIs are entirely asynchronous. All
functions return promises.
WebDriverJS maintains a queue of pending promises, called the control
flow, to keep execution organized.
并且,根据 definition:
A promise is an object that represents a value, or the eventual
computation of a value. Every promise starts in a pending state and
may either be successfully resolved with a value or it may be rejected
to designate an error.
关于 promise 拒绝的最后一部分是我不完全理解并且没有在 Protractor 中处理过的东西。我们看到和编写的一个常见模式是使用 then()
并提供一个成功解决承诺的函数:
element(by.css("#myid")).getAttribute("value").then(function (value) {
// do smth with the value
});
问题:
是否有可能任何 Protractor/WebDriverJS 函数返回的承诺无法成功解析并被拒绝?我们真的应该担心并处理它吗?
这就是关于您将获得响应的承诺的伟大之处,无论是数据响应还是错误消息。这扩展到一系列承诺,例如 Webdriver 使用您将获得一系列响应或第一个失败响应的失败响应。你如何处理失败的响应取决于你我通常只是将它转储到控制台的日志中以查看失败的内容。您唯一需要弄清楚的是您是中止其余的测试还是继续。
这里也有一篇关于这个主题的不错的文章。 http://www.toolsqa.com/selenium-webdriver/exception-handling-selenium-webdriver/
仅供参考,你所做的很好,你只是从不费心去捕捉任何错误,我不确定这对你是否重要,你也可以抽象函数中的调用来自动处理如果您想将错误记录在某个地方。
我在使用 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
。我的第一点是,为拒绝提供回调提供了与预期一致的能力。在这种情况下,我有点确定 promise 将始终解析为 true
或 false
,因此我可以依赖它构建一个套件。如果我不提供 fail
回调,那么我会因为超时而得到一个 Uncaught exception
,这仍然会使我的特定规范失败,并且仍然 运行 其余规范。顺便说一句,它不会被捕获,Protractor 会捕获它,但是这里我想提出第二点,Protractor 被认为是您用来编写和 运行 您的代码的工具,如果出现异常被 Protractor 捕获,则此异常导致您的代码未处理并且您的代码存在泄漏。但是...与此同时,我认为不应该浪费时间在测试中捕获所有内容:如果页面上没有元素或点击失败,那么相应的规范显然也会失败,这在大多数情况下都很好个案。除非你想使用失败的结果在它之上构建一些代码,就像我的示例中那样。
WebDriverJS 和 Protractor 本身完全基于 promises 的概念:
WebDriverJS (and thus, Protractor) APIs are entirely asynchronous. All functions return promises. WebDriverJS maintains a queue of pending promises, called the control flow, to keep execution organized.
并且,根据 definition:
A promise is an object that represents a value, or the eventual computation of a value. Every promise starts in a pending state and may either be successfully resolved with a value or it may be rejected to designate an error.
关于 promise 拒绝的最后一部分是我不完全理解并且没有在 Protractor 中处理过的东西。我们看到和编写的一个常见模式是使用 then()
并提供一个成功解决承诺的函数:
element(by.css("#myid")).getAttribute("value").then(function (value) {
// do smth with the value
});
问题:
是否有可能任何 Protractor/WebDriverJS 函数返回的承诺无法成功解析并被拒绝?我们真的应该担心并处理它吗?
这就是关于您将获得响应的承诺的伟大之处,无论是数据响应还是错误消息。这扩展到一系列承诺,例如 Webdriver 使用您将获得一系列响应或第一个失败响应的失败响应。你如何处理失败的响应取决于你我通常只是将它转储到控制台的日志中以查看失败的内容。您唯一需要弄清楚的是您是中止其余的测试还是继续。
这里也有一篇关于这个主题的不错的文章。 http://www.toolsqa.com/selenium-webdriver/exception-handling-selenium-webdriver/
仅供参考,你所做的很好,你只是从不费心去捕捉任何错误,我不确定这对你是否重要,你也可以抽象函数中的调用来自动处理如果您想将错误记录在某个地方。
我在使用 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
。我的第一点是,为拒绝提供回调提供了与预期一致的能力。在这种情况下,我有点确定 promise 将始终解析为 true
或 false
,因此我可以依赖它构建一个套件。如果我不提供 fail
回调,那么我会因为超时而得到一个 Uncaught exception
,这仍然会使我的特定规范失败,并且仍然 运行 其余规范。顺便说一句,它不会被捕获,Protractor 会捕获它,但是这里我想提出第二点,Protractor 被认为是您用来编写和 运行 您的代码的工具,如果出现异常被 Protractor 捕获,则此异常导致您的代码未处理并且您的代码存在泄漏。但是...与此同时,我认为不应该浪费时间在测试中捕获所有内容:如果页面上没有元素或点击失败,那么相应的规范显然也会失败,这在大多数情况下都很好个案。除非你想使用失败的结果在它之上构建一些代码,就像我的示例中那样。