5

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

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

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

请建议。

4

2 回答 2

17

对 element(locator).sendKeys 的调用返回一个已解决或拒绝的承诺。承诺是测试控制流的一部分。

对 element(locator) 本身的调用不会引发错误,它是被拒绝的承诺。如果你找不到一个元素,你实际上希望你的整个测试失败,因为 scneario 无法完成。

要获取错误消息,您可以使用承诺回调,如下所示。

重要说明:如果你自己处理承诺失败,你的测试不会失败,所以你最好重新抛出它

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 .....
于 2014-01-02T15:07:35.770 回答
2

我最近遇到了这个问题,并注意到你不需要 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)的建议抛出错误).

希望这可以帮助像我一样在量角器上苦苦挣扎的人。

于 2016-01-13T19:21:11.973 回答