Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理SeleniumWebDriver中的ElementNotFound异常_Java_Selenium - Fatal编程技术网

Java 如何处理SeleniumWebDriver中的ElementNotFound异常

Java 如何处理SeleniumWebDriver中的ElementNotFound异常,java,selenium,Java,Selenium,概述:我已经用Java编写了Selenium Web驱动程序脚本中的自动化脚本,该脚本将登录到网站并自动进行选择,选择完成后将运行报告 我想要什么:我在优化自动化脚本时面临问题 简要说明:事实上,我熟悉Selenium中使用的不同类型的等待,但所有这些等待(即隐式、显式或流畅的等待)都无法帮助我优化代码。目前我正在使用Thread.sleep()方法,以便完全无故障地运行脚本,但我知道这不应该是最好的做法,因为有时元素加载快,有时加载慢,因为我的脚本执行时间长,或者基于元素可用性失败。我为Web

概述:我已经用Java编写了Selenium Web驱动程序脚本中的自动化脚本,该脚本将登录到网站并自动进行选择,选择完成后将运行报告

我想要什么:我在优化自动化脚本时面临问题

简要说明:事实上,我熟悉Selenium中使用的不同类型的等待,但所有这些等待(即隐式、显式或流畅的等待)都无法帮助我优化代码。目前我正在使用Thread.sleep()方法,以便完全无故障地运行脚本,但我知道这不应该是最好的做法,因为有时元素加载快,有时加载慢,因为我的脚本执行时间长,或者基于元素可用性失败。我为Webdriver wait创建了一个单独的方法我可以随时在我的主脚本中调用各种Web元素,但这种方法有时有效,有时无效,即使我等待的时间超过800秒,但如果我使用Thread.sleep(5000)它将正常工作,没有任何问题不知道为什么

我想要的是有一个单独的等待方法,可以随时在主脚本中调用,我希望我的脚本在webeelment可见的那一刻就可以完美地工作,就像我们人类与任何web交互时所做的一样

注意:我尝试过预期条件方法,如elementtobelickable、elementlocated的visibilityOfElementLocated、elementpresenceofelementlocated。所有这些方法有时有效,但有时无效

我创建的单独等待方法

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()方法中删除注释的那一刻,它就会工作

请帮助我获得可重用且有用的wait方法,我可以在主代码中多次调用它

提前谢谢

这通常对我有效(但不是FluentWait):

WebDriverWait wait=newwebdriverwait(驱动程序,超时);
ExpectedCondition elementIsDisplayed=新的ExpectedCondition(){
公共布尔应用(WebDriver arg0){
试一试{
webElement.isDisplayed();
返回true;
}
捕获(无接触元素例外e){
返回false;
}
捕获(StaleElementReferenceException f){
返回false;
}
} 
};
等待.直到(元素显示);

当然,设置超时是指您希望等待找到元素的时间(以秒为单位).

Show
HTML
code您未能处理的元素的代码
ExpectedConditions
用于第二次下拉:用于第二次下拉:请帮助我解决这个问题如果只是使用
WebDriverWait wait=new WebDriverWait(driver,800);WebElement=wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(path))?不是在方法内部,而是直接在代码中
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);