如何在Protractor中处理元素未找到的异常

时间:2014-03-21 04:43:21

标签: javascript selenium selenium-webdriver protractor

就像Selenium webdriver为Java提供各种异常处理一样,有没有什么方法可以使用Protractor实现它。

如果我们想要处理未找到元素的异常,那么使用Protractor的最佳方法是什么?

3 个答案:

答案 0 :(得分:14)

回答这个问题is now in Protractor's FAQ

如何捕获ElementNotFound等错误?

  

WebDriver在命令无法完成时抛出错误 - 例如无法点击被其他元素遮挡的元素。如果您需要重试这些操作,请尝试使用webdriverjs-retry。如果您只想捕获错误,请按照这样做

适应您的问题:

elm.isPresent().then(function(present) {
  /* no webdriver js errors here */}
  if (present) {
    /* element exists */
  } else {
    /* element doesn't exist */
  }
, function(err) {
  /* error handling here, i.e. element doesn't if got ElementNotFound
     but, eventually and less likely, other issues will fall in here too like
     NoSuchWindowsError or ElementStaleError etc...
  */
});

答案 1 :(得分:0)

感谢@Leo Gallucci适应OP的问题:

我今天遇到了这个问题,希望能找到一个看起来很干净的解决方案:



/* Function to check for three possible DOM elements; return the element which exists, and get the text contents. */
this.getMySelector =  function(){
 if (element(by.css('.mySelector')).isPresent()){
   return element(by.css('.mySelector'));
 }
 else if (element(by.css('.mySelector2')).isPresent()){
   return element(by.css('.mySelector2'));
 }
 else{
  return element(by.css('.mySelector3'));
 }
}




然而,它始终击中第一个if()并且从不检查其他条件。结果我需要为我的场景链接承诺:



this.getMySelector =  function(){
    
  element(by.css('.mySelector')).isPresent().then(function (pres) {
    if (pres){
      defer.fulfill(  by.css('.mySelector')).getText() );
    }
    else{
       element(by.css('.mySelector2')).isPresent().then(function (pres) {
         if (pres){
            defer.fulfill(..);
         }
       }
    }
  }
}

// From calling test-spec.js file
getMySelector.then(function(text)){
   console.log('Now I got the text ==> ' + text);         
}
                                                        
                                                       




答案 2 :(得分:-1)

尝试,Catch在Protractor中具有以下语法。下面的代码将首先通过Id' IdTextBoxCode'找到一个元素。然后代码输入代码' codeTextBox.sendKeys(code);'是在TRY区块。如果代码抛出异常(在这种情况下,如果找不到具有Id' IdTextBoxCode'的元素),那么它将转到catch块和错误处理函数。

browser.driver.findElement(by.id(browser.params.loginPage.IdTextBoxCode)).then(function(codeTextBox)
    {
        try 
        {
            console.log("Entering Code: "+code);
            codeTextBox.sendKeys(code);
        }
        catch(err) {
            console.log('In catch block');
        }
   }, function(err) {
        console.info('Code Text Box not displayed on page. Proceeding with default Code');
    });