我在量角器测试中尝试使用try-catch块,请参阅下面的代码:
try {
element(by.id('usernameas')).sendKeys(data);
}
catch(err) {
console.log('error occured');
}
我故意传递错误的定位器以检查它是否进入catch块,目前它在命令提示符下给我错误NoSuchElementError
并且测试执行停止而不是进入catch块。
请建议。
答案 0 :(得分:16)
对element(locator).sendKeys的调用返回一个已解决或拒绝的promise。承诺是测试control flow的一部分。
对element(locator)本身的调用不会抛出错误,它是被拒绝的承诺。 如果您找不到元素,实际上您希望整个测试失败,因为无法完成scneario。
要获取错误消息,您可以使用promise回调,如下所示。
重要提示:如果您自己处理承诺失败,您的测试不会失败,所以您最好重新抛出它
try {
element(by.id('usernameas')).sendKeys(data).then(function() {
console.log('keys sent successfully');
}, function(err) {
console.error('error sending keys ' + err);
throw err;
});
}
catch(err) {
console.log('error occured');
}
控制台输出是(修剪):
error sending keys NoSuchElementError: no such element
(Session info: chrome=31.0.1650.63)
(Driver info: chromedriver=2.8.241075,platform=Windows NT 6.1 S .....
答案 1 :(得分:1)
我最近遇到了这个问题并注意到你不需要try / catch块。在Protractor中,您可以实现如下的try / catch:
try { <---------------------------- Traditional TRY/CATCH method
loadWebApp();
login();
openUserPreferences();
changePassword();
} catch (err) {
console.error(
"An error was thrown! " + err);
}
loadWebApp().
then(login).
then(openUserPreferences).
then(changePassword).
then(null, function(err) { <----------------- PROTRACTOR equivalent of try/catch
console.error(
"An error was thrown! " + err);
});
以下是我获取此信息的来源:https://code.google.com/p/selenium/wiki/WebDriverJs#Promises
在Value Propagation and Chaining
下
同样,您不需要显式添加try / catch。
简而言之,这种方法起作用的原因是因为a promise can either be RESOLVED or REJECTED and in case of a rejected or failed promise, this line [ then(null, function(err) { ... } ] will act as the CATCH block.
也注意到then(null,function(err))(不进行任何回调而只是一个errBack ;所以基本上,这就是说我们不关心承诺是否得到解决,我们只关心它是否失败,因此回调的NULL和errBack的函数(错误)。
不需要将它包装在try / catch中然后按照接受的答案抛出错误(@Eitan Peer)。
希望这可以帮助那些与我一起努力争取Protractor的人。