2012-03-21 8 views
6

Soy nuevo en Selinium webdriver, quizás esta pregunta es obvia. Soy después de situación como esta:¿Utiliza webdriver para ver si un elemento existe SIN arrojar una excepción?

Si existe el elemento, haga clic en él y volver a la página de índice:

driver.findElement(By.id("...."])).click(); 

si no sale, saltar y volver a la página de índice. La prueba continúa sin ninguna excepción.

Yo sé una solución a este:

driver.findElements(By.id("...")).size() != 0 

así que intenté:

if(driver.findElements(By.id("....")).size() > 0) 
    { 
     driver.findElement(By.id("....")).click(); 
     driver.findElement(By.cssSelector("...")).click(); 
    } 
else 
    { 
     driver.findElement(By.cssSelector("....")).click(); 
    } 

Esto resultó muy feo, porque aunque si tengo 10 elementos a verificar, esta condición si tiene que ser escrito 10 veces

¿Alguna solución alternativa para hacerlo ordenado?

Respuesta

1

La solución podría ser muchas pero eso puede dificultar su arquitectura.

Así solución más fácil podría ser la siguiente:

Basta con crear un método como optionalClick() de alguna clase de utilidad o en algún lugar con los argumentos como:

  1. locator_keyword: {valores: Identificación o cssSelector o XPath etc}
  2. locator: {valores: "q"}

pasos del método:

  1. Get elemento basado en la comprobación locator_keyword y locator
  2. si el elemento está ahí y haga clic en él
  3. De lo contrario, no hacen nada

Este método puede ser utilizado como un tipo genérico de cosas para cualquier tipo de objetos.

+0

gracias por los comentarios! Otro problema es que, si la sintaxis es terriblemente lenta ... ¿hay alguna manera de hacerlo más rápido? – user1282634

+0

Ok, no use la instrucción if en lugar de usar el bloque try/catch como folows: try {WebElement elemnt = driver.findElement (By.ID ("..")); elemnt.click();} catch (Excepción e) {// No hay nada que hacer} – Nayan

+0

lo tengo ~~ gracias !! – user1282634

1

Hay formas de encontrar elementos sin arrojar excepciones mediante el uso de condiciones try-catch dentro de los bucles. Por ejemplo, este método me escribió (que se puede simplificar dependiendo de lo que se utiliza si por) devolverá un WebElement y se asegura de que se trata de hacer clic antes de devolverla a usted:

public static WebElement getElementByLocator(By locator) { 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    WebElement we = null; 
    boolean unfound = true; 
    int tries = 0; 
    while (unfound && tries < 10) { 
    tries += 1; 
    try { 
     we = driver.findElement(locator); 
     unfound = false; // FOUND IT 
    } catch (StaleElementReferenceException ser) {       
     unfound = true; 
    } catch (NoSuchElementException nse) {       
     unfound = true; 
    } catch (Exception e) { 
     staticlogger.info(e.getMessage()); 
    } 
    } 
    driver.manage().timeouts().implicitlyWait(DEFAULT_IMPLICIT_WAIT, 
     TimeUnit.SECONDS); 
    return we; 
} 
+1

erm de qué manera es que no está utilizando excepciones ?! –

+0

Dije "sin tirar", no "sin usar". – djangofan

0

Gracias por el puntero sobre el uso findelements. Creo que también necesitarás esperar a la lógica si no quieres que vuelva demasiado pronto.

aquí está mi solución en C#.

Básicamente vuelve a implementar la lógica de espera en la biblioteca de selenio - desafortunadamente el método que hace que la espera no esté expuesta (molestamente también es rethrows exceptions the wrong way y pierde los rastros de la pila).

Probablemente tengas que modificarlo un poco para Java, no estoy seguro de qué es la API de selenio cuando no puedes pasar las funciones.

Espere reimplementación:

private IWebElement WaitAndSeeIf(Func<IWebElement> canGet) 
    { 
     var end = DateTime.Now.AddSeconds(1); 

     IWebElement element; 
     while (true) 
     { 
      element = canGet(); 

      if (element != null) 
       break; 

      var time = DateTime.Now; 
      if (time > end) 
       break; 

      Thread.Sleep(200); 
     } 
     return element; 
    } 

Código de llamada:

 var dashboardButton = WaitAndSeeIf(() => 
               { 
                var elements = Driver.FindElements(By.XPath("//button[contains(.//*,'Dashboard')]")); 
                return elements.Any() ? elements.Single() : null; 
               }); 

Hasta ahora he encontrado esto útil en un par de lugares (comprobación de la presencia de cuadros de diálogo en extjs etc), pero tienen sin embargo, tuvo la necesidad de rebuscar y hacer que sea configurable. Supongo que lo mejor sería hacer que tome el tiempo de espera implícito como se menciona en la otra respuesta.

Cuestiones relacionadas