如何在Selenium WebDriver中处理ElementNotFound异常

时间:2017-01-04 19:00:47

标签: java selenium

概述:我已经在Java中准备了Selenium Web驱动程序脚本中的自动化脚本,该脚本将登录到网站并自动进行选择,一旦选择完成,它将运行报告。< / p>

我想要的是什么:我在优化自动化脚本时遇到了问题。

简要说明:实际上我熟悉我们在Selenium中使用的各种等待,但所有那些等待,即隐含,明确或流畅的等待都无法帮助我制作代码更优化。目前我在各处都使用Thread.sleep()方法,以便完全运行脚本而不会失败,但我知道这不应该是最佳实践,因为有时元素加载速度快,有时慢,因为我脚本执行需要很长时间或基于Element可用性失败。我为Webdriver等待创建了一个单独的方法,我可以在我的主脚本中需要时调用各种webelements但是这种方法有时也可以工作或者有时甚至没有通过800第二个作为等待的时间段,但如果我使用Thread.sleep(5000)它将工作没有任何问题不确定为什么??

我希望有一个单独的等待方法,可以在需要时在主脚本中调用,我希望我们的脚本在我们看到的时候能够完美地工作,就像我们在与任何网络交互时所做的一样。 / p>

注意: 我已经尝试了ExpectedCondition方法,例如elementtobeclickable,visibilityOfElementLocated,presenceofElementLocated,所有这些方法在某些时候都有效,但有时却不会。

我创建的单独等待方法

public static WebElement waiting(WebDriver driver,String path){
    WebDriverWait wait = new WebDriverWait(driver,800);
    WebElement element=wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(path)));
    return element;
   }

我称之为此方法的一段主要代码。

if(nam.equals("Some name"))
{
WebElement e=driver.findElement(By.xpath("1st Webelement path"));
e.click();
System.out.println("Value clicked under First Drop Down is:"+e);
Listing.waiting(driver,"2nd WebElement xpath").click();
//Thread.sleep(5000);
//driver.findElement(By.xpath("2nd WebElement xpath")).click();
System.out.println("Second Dropdown clicked");

}

当我评论Thread.sleep()然后它将抛出ElementNotFound异常,即使我在Webdriver等待方法中使用了800秒,但是当我从Thread.sleep()方法中删除注释时它将起作用。

请帮助我获得可重复使用且有用的等待方法,我可以在主代码中多次调用。

先谢谢!!

1 个答案:

答案 0 :(得分:0)

这通常适合我(不过FluentWait):

WebDriverWait wait = new WebDriverWait(driver, TIMEOUT);
    ExpectedCondition elementIsDisplayed = new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver arg0) {
      try {
         webElement.isDisplayed();
         return true;
      }
      catch (NoSuchElementException e ) {
        return false;
      }
      catch (StaleElementReferenceException f) {
        return false;
      }
        } 
    };
    wait.until(elementIsDisplayed);

当然,将TIMEOUT设置为您要等待找到元素的时间量(以秒为单位)。