如果找不到元素,请继续操作,如果找到,请保存

时间:2019-11-08 15:20:33

标签: java selenium

我有一个循环,在这里我一个接一个地打开链接。在此循环中,我具有if语句,该语句检查:

  1. 如果看到名字,我就复制它
  2. 如果我看不到名字,那么我会忽略它并继续循环播放。

    List<WebElement> demovar = driver.findElements(By.xpath("//*[@id=\"big_icon_view\"]/ul/li/p/a"));
    System.out.println(demovar.size());
    ArrayList<String> hrefs = new ArrayList<String>(); 
    for (WebElement var : demovar) {
        System.out.println(var.getText());
        System.out.println(var.getAttribute("href"));
        hrefs.add(var.getAttribute("href"));
    }
    
    int i = 0;
    for (String href : hrefs) {
        driver.navigate().to(href);
        System.out.println((++i) + ": navigated to URL with href: " + href);
        if(driver.findElement(By.xpath("//a[@id='name']")).isDisplayed()) {
            System.out.println("I can see Name");
        } else {
            System.out.println("I cant see Name");
        }
        Thread.sleep(3000); // To check if the navigation is happening properly.
    }
    

为什么这不能正常工作?正如我所假设的,它应该具有以下内容:

  1. 如果显示了该元素,那么我可以看到名称
  2. 否则未显示该元素,则看不到名称。

3 个答案:

答案 0 :(得分:1)

我不确定您在这里看到的错误消息是什么,但是如果您的代码无法正常工作,则很可能该元素未显示在页面上,因此在尝试查找该元素时会收到异常消息。

您可以捕获NoSuchElementException来处理元素未出现在页面上的情况。

 for (String href : hrefs) {
    driver.navigate().to(href);
    System.out.println((++i) + ": navigated to URL with href: " + href);
    // create isDisplayed variable
    boolean isDisplayed = true;
    try {
        isDisplayed = driver.findElement(By.xpath("//a[@id='name']")).isDisplayed();
        }
    catch(NoSuchElementException) {
            isDisplayed = false;
        }
        // do something else here with isDisplayed
        if (isDisplayed) { System.out.println("I can see Name"); }
        else { System.out.println("I can not see Name"); }
}

此代码与您的代码几乎具有相同的功能,但是如果该元素未出现在页面上,我们会捕获NoSuchElementException

如果这对您不起作用,请随时在代码中发布错误消息或看到的结果,这将有助于查找问题。

答案 1 :(得分:0)

WebDriver接口中findElement(by by)的

API声明以下

”使用给定的方法查找第一个WebElement。该方法受执行时有效的“隐式等待”时间的影响。findElement(..)调用将返回匹配的行,或重复尝试直到达到配置的超时。不应使用findElement查找不存在的元素,而应使用findElements(By)并声明零长度响应。”

这意味着,如果未找到该元素,它将一直尝试直到配置的超时并抛出NoSuchElementException异常-如果找不到匹配的元素

因此,最好通过以下方式处理

  1. 使用FindElements返回所有WebElement的列表,如果没有匹配项,则返回一个空列表,如下所示:

    if(driver.findElements(By.ByXPath).size()<0)

  2. 使用try / catch / finally捕获NoSuchElementException和一个布尔标志来确定其是否存在。如果捕获到异常,则可以将boolean标志设置为false。

答案 2 :(得分:0)

在@Christine帮助之后,我为我解决了一个问题

for (String href : hrefs) {
            driver.navigate().to(href);
            boolean isPresent = driver.findElements(By.xpath("element")).size() > 0;
            if (isPresent) {
                String test = driver.findElement(By.xpath("element")).getText();
                System.out.println(test);
            } else {
                System.out.println("Name not found");
            }
            Thread.sleep(3000); // To check if the navigation is happening properly.
        }
    }
}

这很好=)