量角器TRY / Catch问题

时间:2016-01-13 19:32:11

标签: cucumber try-catch protractor nosuchelementexception

我使用的是Protractor和Cucumber,并注意到有些情况我希望捕获NoSuchElementError: No element found using locator: By.cssSelector("someCssLocatorHere")。但是,使用传统的try / catch块是行不通的,除非我同时调用.then()函数的回调和errBack并抛出错误,以便我可以像以下一样捕获它:

try{
  somePromise.then(function(){
  //callback function if promise gets resolved successfully
  }, function(e){
  console.log(e); //errBack in case promise gets rejected or fails
  throw e;   <--------------- THROW error here so can catch it in catch block below
  });
 }catch(e){
    console.log('error:'+e);
 }

上面的解决方案是/ Stackoverflow上的许多答案。所以我没有任何问题,但我将回答下面我自己的问题,向您展示处理此异常(NoSuchElementError: No element found using locator: By.cssSelector("someCssLocator"))的正确方法,而不使用try / catch块显式包装您的代码。

1 个答案:

答案 0 :(得分: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#PromisesValue 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))(不接受任何回调(而不是NULL)但只是一个errBack;所以基本上,这就是说我们不关心promise是否得到解决,我们只关心它是否失败,因此回调的NULL和errBack的函数(错误)。 无需在try / catch中包装它,然后按照Stackoverflow上的许多答案的建议抛出错误。

希望这可以帮助那些像我一样在Protractor中挣扎的人。