2012-05-22 33 views
11

que tiene este XPath: //*[@id="someId::button"]selenio WebDriver: encontrar todos los elementos con id similares

Al pulsarlo muestra una lista desplegable de valores.

Ahora, sé que todos los elementos de la lista tienen un identificador de la siguiente manera:

//*[@id="someId--popup::popupItemINDEX"] 

, donde el índice es un número de 1 a cualquiera que sea el número de opciones.

También sé el valor que debo hacer clic.

Una pregunta sería: dado que siempre sabré la identificación del botón que genera el menú desplegable, ¿puedo obtener todos los elementos en el menú desplegable con un método reutilizable? (Necesito para interactuar con más de un desplegable)

La forma en que pensaba al respecto es: obtener la raíz de la identificación inicial, como en:

//*[@id="someId 

continuación, añadir el resto: --popup::popupItem. También tengo que añadir el índice y pensé que podría utilizar un bloque try (con el fin de conseguir a pesar de las excepciones cuando doy un índice mayor de lo esperado) como esto:

for(int index=1;index<someBiggerThanExpectedNumber;index++){ 
    try{ 
     WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]")); 
     if(aux.getText().equals(myDesiredValue)) 
      aux.click(); 
    }catch(Exception e){} 
} 

Tenga en cuenta que estoy usando el WebDriver api y java.

Me gustaría saber si esto funcionaría y si hay una manera más fácil de hacerlo, dada la información inicial que tengo.

EDIT: La forma en que sugirió obras, pero para una solución más fácil, la respuesta aceptada debe ser visto

Respuesta

12

Como regla general, intente seleccionar más elementos con una consulta, si es posible. La búsqueda de muchos elementos uno por uno se volverá muy lenta.

Si entiendo bien sus necesidades, una buena manera de hacer esto sería usar

driver.findElement(By.id("someId::button")).click(); 
driver.findElement(By.xpath("//*[contains(@id, 'someId--popup::popupItem') " + 
    "and text()='" + myDesiredValue + "']")) 
    .click(); 

Para obtener más información sobre XPath, consulte the spec. ¡Sorprendentemente es una muy buena lectura si puedes saltearte la mierda!

Busca y hace clic en un elemento con texto igual al valor deseado que contiene "someId - popup :: popupItem" en su ID.

List<WebElement> list = driver.findElements(By.xpath("//*[contains(@id, 'someId--popup::popupItem')]")); 

Encuentra todos los elementos que contienen "algunosId - popup :: popupItem" en su ID.A continuación, puede recorrer la lista y buscar su elemento deseado.

¿Sabía que puede llamar al findElement() en un WebElement para buscar solo sus hijos? - driver.findElement(By.id("someId")).findElements(By.className("clickable"))

Sin echar un vistazo al HTML subyacente, creo que no puedo ofrecer el mejor enfoque, pero tengo algunas en mi cabeza.

+0

tratando de encontrar todos los elementos no funcionará, ya que la lista se genera ad-hoc, además de la parte de identificación, todos los demás atributos tienen valores diferentes todo el tiempo, incluso si los valores son los mismos. Primero necesito presionar el botón desplegable para poder acceder/ver los elementos. ¡Gracias por la entrada en encontrar niños de elementos! – CosminO

+0

Todavía no puedo ver el problema. Haga clic en el botón desplegable, luego encuentre todos los elementos que se muestran? –

+1

'// * [contiene (@id, 'someId - popup :: popupItem') y text() = 'myDesiredValue']' selecciona el elemento que ID contiene "someId - popup :: popupItem" y qué texto el valor es igual a su valor deseado. ... después de hacer clic en el botón desplegable, por supuesto. –

3

¿Ha intentado utilizar JavascriptExecutor?

Si usted está dispuesto a escribir un poco de JavaScript, entonces esto sería fácil que en java (creo)

Todo lo que necesita hacer es tener un poco de rastreo JavaScript a través de la sub-árbol DOM, y devolver una lista de Elementos DOM que coinciden con tus criterios. WebDriver se encargará felizmente de esto como List<WebElement> en el mundo java.

+0

en este momento, el proyecto depende en gran medida de muchas otras clases/métodos auxiliares. – CosminO

1

El método más seguro para usar aquí es

int size=driver.findElements(By.xpath("//*[@id='someId::button']")).size(); 

Start using Index Now 

String builtString="//*[@id='someId::button']["; 

for(int index=1;index<=size();index++) 
{ 

try 
{ 

    WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]")); 

    if(aux.getText().equals(myDesiredValue)) 
      aux.click(); 

} 
catch(Exception e){} 

} 

por favor hágamelo saber es la funda más arriba está funcionando o no.

+0

No me parece que haya entendido la pregunta. –

Cuestiones relacionadas