2010-04-15 129 views
52

Con WebDriver de Selenium 2.0a2 Tengo problemas para verificar si un elemento es visible.Cómo comprobar si un elemento es visible con WebDriver

WebDriver.findElement devuelve WebElement, que lamentablemente no ofrece un método isVisible. Puedo evitar esto usando WebElement.clear o WebElement.click, ambos lanzando un ElementNotVisibleException, pero esto se siente muy sucio.

¿Alguna idea mejor?

Respuesta

16

element instanceof RenderedWebElement debería funcionar.

+0

obras, pero me sigue resultando esto un poco molesto. Me pregunto cuál es el razonamiento para no ofrecer un WebElement.isDisplayed. – ponzao

+3

Esto no funciona, pero este método de delegado de interfaz se muestra y funciona. Gracias por la pista. (+1) – Gaim

+1

¿Sigue siendo relevante para el selenio 2.0? No creo que haya necesidad de RenderedWebElement (la clase misma se ha ido). – Eugen

1

Es importante ver si el elemento es visible o no, ya que el Driver.FindElement solo comprobará la fuente HTML. Pero el código emergente podría estar en la página html y no estar visible. Por lo tanto, Driver.FindElement función devuelve un falso positivo (y su prueba fallará)

+1

Si el elemento está presente en el código HTML, findElement pasará incluso si el elemento está oculto. O di no visible (como un menú desplegable). La pregunta es encontrar si el elemento es visible o no. –

+0

¿Alguna vez resolvió cómo hacer esto? –

118

Aunque estoy un poco tarde responder a la pregunta:

Ahora puede utilizar WebElement.isDisplayed() para comprobar si un elemento es visible.

+0

isDisplayed devuelve true incluso si el elemento no está visible. –

+0

@SteveStaple: Eso no debería suceder. Si lo hace, considera archivar un error. – sleske

+0

Me han informado que no es un error, y que esto funciona como se esperaba. que se muestra no significa lo mismo para ellos que para el resto del mundo de habla inglesa. –

13

tengo los siguientes 2 sugerido maneras:

  1. Puede utilizar isDisplayed() de la siguiente manera:

    driver.findElement(By.id("idOfElement")).isDisplayed(); 
    
  2. Puede definir un método que se muestra a continuación y lo llaman:

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

Ahora, se puede hacer la afirmación de la siguiente manera para comprobar o bien el elemento está presente o no:

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

pero esto siempre esperará hasta que se agote el tiempo de espera – wutzebaer

7

Si estás usando C#, sería driver.Displayed. Aquí hay un ejemplo de mi propio proyecto:

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

Verificación de ele es visible.

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

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

No relacionado con el OP, pero puede simplificar su función. Qué tal: return driver.findElements (por) .size()> 0; –

-1

probar esto

public boolean isPrebuiltTestButtonVisible() { 
    try { 

     if (preBuiltTestButton.isEnabled()) { 

      return true; 

     } else { 

      return false; 
     } 

    } catch (Exception e) { 

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

Aquí es cómo lo haría (por favor ignorar las llamadas de clase Logger preocupación):

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

Estoy haciendo lo mismo. El uso de isDisplayed() directamente arrojará una excepción, por lo que puede ser una verificación, pero no puede ser una condición para impulsar el flujo de trabajo de esta manera. –

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

Proporcione más detalles a su respuesta. ¿Cómo funciona esto y cómo resuelve esto el problema del PO? –

-1

element instanceof RenderedWebElement debería funcionar. // Pero esto es para la versión anterior de selenio rc.

Tenga en cuenta:

RenderedWebElement fue hace deprecated cuatro años (en 2013) .Es fue apoyado hasta selenium-2.0-rc-2 y se retira de selenio-2,0-RC-3 en adelante

lo que no hay tal clase RenderedWebElement en la última versión. La versión actual es 2.46.0.Trate de usar la versión más reciente

favor Utilice WebElement su lugar sin necesidad de emitir y todo ello con isDisplayed() isEnabled() and driver.findElements(By.xpath(accessor)).size() > 0

Algo como esto:

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. 
} 
Cuestiones relacionadas