2010-04-15 3 views
52

С WebDriver от Selenium 2.0a2 У меня возникли проблемы с проверкой наличия элемента.Как проверить, является ли элемент видимым с помощью WebDriver

WebDriver.findElement возвращает WebElement, который, к сожалению, не предлагает метод isVisible. Я могу обойти это, используя WebElement.clear или WebElement.click, оба из которых бросают ElementNotVisibleException, но это кажется очень грязным.

Любые лучшие идеи?

ответ

16

element instanceof RenderedWebElement должно работать.

+0

работ, но я все еще нахожу это немного раздражает. Интересно, в чем заключается причина не предлагать WebElement.isDisplayed. – ponzao

+3

Это не работает, но этот интерфейс делегирует метод isDisplayed, и он работает. Спасибо за подсказку. (+1) – Gaim

+1

Это все еще актуально для селена 2.0? Я не думаю, что есть необходимость в RenderedWebElement (сам класс отсутствует). – Eugen

1

Важно знать, является ли элемент видимым или нет, поскольку Driver.FindElement будет проверять только источник HTML. Но всплывающий код может быть на странице html и не быть видимым. Поэтому Driver.FindElement функция возвращает ложный положительный результат (и ваш тест потерпит неудачу)

+1

Если элемент присутствует в HTML-коде, то findElement будет проходить, даже если элемент скрыт. Или сказать не видно (как выпадающее меню). Вопрос заключается в том, чтобы определить, является ли элемент видимым или нет. –

+0

Вы когда-нибудь разбирались, как это сделать? –

118

Несмотря на то, что я несколько поздно, отвечая на вопрос:

Теперь вы можете использовать WebElement.isDisplayed(), чтобы проверить, если элемент виден.

+0

isDisplayed возвращает true, даже элемент не отображается. –

+0

@SteveStaple: Этого не должно быть. Если да, рассмотрите вопрос об ошибке. – sleske

+0

Мне сообщили, что это не ошибка, и это работает так, как ожидалось. отображается не означает их то же самое, что и для остальной части англоязычного мира. –

13

У меня есть следующие 2 предложили пути:

  1. Вы можете использовать isDisplayed(), как показано ниже:

    driver.findElement(By.id("idOfElement")).isDisplayed(); 
    
  2. Вы можете определить метод, как показано ниже, и называют это:

    public boolean isElementPresent(By by) { 
        try { 
        driver.findElement(by); 
        return true; 
        } 
    catch (org.openqa.selenium.NoSuchElementException e) { 
        return false; 
        } 
    } 
    

Теперь вы можете сделать утверждение, как показано ниже, чтобы проверить либо элемент присутствует или нет:

assertTrue(isElementPresent(By.id("idOfElement"))); 
+0

, но это всегда будет ждать, пока не произойдет тайм-аут – wutzebaer

7

Если вы используете C#, было бы driver.Displayed. Вот пример из моего собственного проекта:

if (!driver.FindElement(By.Name("newtagfield")).Displayed)  //if the tag options is not displayed 
    driver.FindElement(By.Id("expand-folder-tags")).Click(); //make sure the folder and tags options are visible 
2

Проверяющий элемент виден.

public static boolean isElementVisible(final By by) 
    throws InterruptedException { 
     boolean value = false; 

     if (driver.findElements(by).size() > 0) { 
      value = true; 
     } 
     return value; 
    } 
+5

Не связан с OP, но вы можете упростить свою функцию. Как насчет: return driver.findElements (by) .size()> 0; –

-1

попробовать это

public boolean isPrebuiltTestButtonVisible() { 
    try { 

     if (preBuiltTestButton.isEnabled()) { 

      return true; 

     } else { 

      return false; 
     } 

    } catch (Exception e) { 

     e.printStackTrace(); 
     return false; 
    } 
} 
0

Вот как я бы это сделать (просьба игнорировать звонки беспокойство Logger класса):

public boolean isElementExist(By by) { 
    int count = driver.findElements(by).size(); 
    if (count>=1) { 
     Logger.LogMessage("isElementExist: " + by + " | Count: " + count, Priority.Medium); 
     return true; 
    } 
    else { 
     Logger.LogMessage("isElementExist: " + by + " | Could not find element", Priority.High); 
     return false; 
    } 
} 

public boolean isElementNotExist(By by) { 
    int count = driver.findElements(by).size(); 
    if (count==0) { 
     Logger.LogMessage("ElementDoesNotExist: " + by, Priority.Medium); 
     return true; 
    } 
    else { 
     Logger.LogMessage("ElementDoesExist: " + by, Priority.High); 
     return false; 
    } 
} 

public boolean isElementVisible(By by) { 
    try { 
     if (driver.findElement(by).isDisplayed()) { 
      Logger.LogMessage("Element is Displayed: " + by, Priority.Medium); 
      return true; 
     } 
    } 
    catch(Exception e) {  
     Logger.LogMessage("Element is Not Displayed: " + by, Priority.High); 
     return false; 
    }  

    return false; 
} 
+0

Я делаю то же самое. Использование isDisplayed() напрямую будет генерировать исключение, поэтому может быть проверкой, но не может быть условием для управления рабочим процессом следующим образом. –

0
public boolean isElementFound(String text) { 
     try{ 
      WebElement webElement = appiumDriver.findElement(By.xpath(text)); 
      System.out.println("isElementFound : true :"+text + "true"); 
     }catch(NoSuchElementException e){ 
      System.out.println("isElementFound : false :"+text); 
      return false; 
     } 
     return true; 
    } 

    text is the xpath which you would be passing when calling the function. 
the return value will be true if the element is present else false if element is not pressent 
+2

Просьба предоставить более подробную информацию для вашего ответа. Как это работает и как это решает проблему ОП? –

-1

element instanceof RenderedWebElement должен работать. // Но это для старой версии селена rc.

Обратите внимание:

RenderedWebElement был deprecated четыре года назад (в 2013 году) .Это было поддержана до selenium-2.0-rc-2 и удаляются из селена 2.0-RC-3 года

Так что нет такого класса RenderedWebElement в последней версии. Текущая версия - 2.46.0.Попробуйте использовать последнюю версию

Пожалуйста используйте WebElement Вместо нет необходимости бросить и все с isDisplayed() isEnabled() and driver.findElements(By.xpath(accessor)).size() > 0

Что-то вроде этого:

public static boolean isElementFoundDisplayedEnabled(WebDriver driver, String accessor){ 

     return driver.findElements(By.xpath(accessor)).size() > 0 && driver.findElement(By.xpath(accessor)).isDisplayed() && driver.findElement(By.xpath(accessor)).isEnabled(); 
     //isDisplayed(): method avoids the problem of having to parse an element's "style" attribute to check hidden/visible. False when element is not present 
     //isEnabled(): generally return true for everything but disabled input elements. 
}