Selenium Webdriver(JAVA)代码在不存在NoSuchElementException元素的情况下在“如果条件”时退出。

时间:2018-08-01 11:52:33

标签: java selenium selenium-webdriver webdriver

我正在尝试使脚本自动化。您可以了解以下代码。

driver.findElement(By.id("ctl00_body_txtUserID")).sendKeys("Donhere");
driver.findElement(By.id("ctl00_body_txtPassword")).sendKeys("don@123");
driver.findElement(By.id("ctl00_body_btnLogin")).click();
if(driver.findElement(By.className("tcuarea")).isDisplayed()){
     driver.findElement(By.id("ctl00_Add")).click();
}
driver.findElement(By.id("ctl00_Add_to_Sum")).click();

标识为ctl00_Add的元素很少显示。因此,如果条件结果为TRUE,则脚本会继续正常运行。但是在FALSE条件下,如果没有这样的元素显示,它仍然进入if条件。会导致NoSuchElementException异常。

为什么脚本不直接移至下一步?

有没有尝试的任何解决方案,catch方法?

5 个答案:

答案 0 :(得分:0)

您可以使用try-catch块将其绑定,如下所示:

try {
    driver.findElement(By.className("tcuarea")).isDisplayed();
    driver.findElement(By.id("ctl00_Add")).click();
}
catch(Exception e) {
  System.out.println(e.getMessage());
            }  

因此,在driver.findElement(By.className("tcuarea")).isDisplayed();会引发NoSuchElement异常的情况下,您可以捕获块并执行某些操作。

答案 1 :(得分:0)

如果findElement找不到元素,则会抛出NoSuchElementException。为了避免出现这种情况,您可以使用findElements来查找列表并检查列表是否为空,这样就无需使用try catch

List<WebElement> elements = driver.findElements(By.id("ctl00_Add"));
if (elements.size() > 0) {
    elements.get(0).click();
}

这也是docs推荐的方法。

答案 2 :(得分:0)

该方法的预期行为。 isDisplayed()存在是为了告诉您是否已定位的元素

NoSuchElement异常: 硒引发异常,指出在DOM中找不到该元素

isDisplayed 有以下两种情况,

返回“ true ”:该元素已在DOM上找到并且未被隐藏,或者该元素的尺寸不为零。

返回“ false ”:该元素已在页面上找到;但它是隐藏的或具有属性style =“ display: none;“,那么isDisplayed()将返回false

在您的情况下,建议使用try catch!

答案 3 :(得分:0)

由于您的要求是在标识为click()的元素上调用By.id("ctl00_Add"),所以我认为没有必要进行检查:

driver.findElement(By.className("tcuarea")).isDisplayed())

此外,我不确定您的用例为什么要避免try/catch{}阻止。也许是以下任何一种例外:

  • NoSuchElementException
  • TimeoutException

通常,最好的出路是try/catch{},因为您总是可以捕获异常而不会暂停执行。 同样,findElements()是另一个潜在的解决方案。但就我个人而言,我会去try/catch{}

您可以立即进行:

try {
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.id("ctl00_Add"))).click();
}
catch(Exception e) {
    System.out.println(e.getMessage());
}  

答案 4 :(得分:0)

替换以下if条件:

if(driver.findElement(By.className("tcuarea")).getSize().height != 0){
     driver.findElement(By.id("ctl00_Add")).click();
}

有时selenium isDisplayed()函数不适用于HTML代码。因此,我们需要检查要查找的元素的高度。如果未显示该元素,而isDisplayed()仍返回true,则该元素的高度将为零。这种方法对我有用。