Selenium isDisplayed()在我预期为false时返回NoTouchElementException

Selenium isDisplayed()在我预期为false时返回NoTouchElementException,selenium,Selenium,当我的代码运行并且元素存在时,它eleExists被设置为true,但是当它不存在而不是被设置为false时,我会得到一个NoTouchElementException。 我想知道这是否是硒的一个缺陷 try{ boolean eleExists = driver.findElement(By.cssSelector("Element cssSelector")).isDisplayed(); if(eleExists) {

当我的代码运行并且元素存在时,它eleExists被设置为true,但是当它不存在而不是被设置为false时,我会得到一个NoTouchElementException。 我想知道这是否是硒的一个缺陷

try{

    boolean eleExists = driver.findElement(By.cssSelector("Element cssSelector")).isDisplayed();
    if(eleExists)
    {
             // do stuff
    }
    else{
            // do other stuff
    }

}catch (Exception e) {
    System.out.println(e);
}
关于这个问题,我明白了: Selenium Webdriver-在If语句中使用isDisplayed()不起作用

解决方案是将代码包装在一个try-catch中,我已经完成了,现在它正在工作。
但我很想知道这种行为是否是有意的。

Web元素可以有多种状态。这是因为一个元素可以在页面上,也可以不在页面上,或者不可见,或者启用。 处理这个问题的一个好方法是使用硒

以下是一些值得注意的web元素状态:

存在:-元素在DOM上,但我们不能说它是启用的还是可见的

可见:-元素位于DOM上并且可见,但是我们不能说它是否启用(例如,如果它是一个按钮,则不可能单击它)

可单击或启用:-该元素可完全运行

这是一个使用wait与元素交互的代码示例

...
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
...
selector = (By.TAG_NAME, 'body')

# this returns the element as driver.find_element()
element = WebDriverWait(driver, timeout).until(EC.element_to_be_clickable(selector))

element.click()

这是预期的行为。元素不存在。您正在检查“isDisplayed”。。。这与“存在”不同。元素可能在那里,但不可见/显示。当元素不存在时,将抛出NoTouchElement。值得注意的是,findElements()不会抛出该错误,而是返回一个空数组。