需要关于try-catch的帮助

时间:2014-01-02 12:10:53

标签: javascript angularjs testing promise protractor

我在量角器测试中尝试使用try-catch块,请参阅下面的代码:

try {
    element(by.id('usernameas')).sendKeys(data);
}
catch(err) {
    console.log('error occured');
} 

我故意传递错误的定位器以检查它是否进入catch块,目前它在命令提示符下给我错误NoSuchElementError并且测试执行停止而不是进入catch块。

请建议。

2 个答案:

答案 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的人。