我正在尝试使脚本自动化。您可以了解以下代码。
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方法?
答案 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,则该元素的高度将为零。这种方法对我有用。