2009-09-10 12 views

Respuesta

11

Puede usar el comando getXpathCount para determinar la cantidad de elementos coincidentes. Luego puede recorrerlos usando un incremento para ubicar cada elemento individualmente. La siguiente (TestNG/JUnit) ejemplo de Java sería comprobar que todas las casillas de verificación en una página se comprueban:

int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue(); 
for (int i = 1; i < totalCheckboxes+1; i++) { 
    assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]")); 
} 
+0

Gracias a Dave, Santi. Mi problema es que no tengo una opción para usar el cliente de Selenium en pruebas unitarias. Desafortunadamente, estoy limitado a usar el Selenium IDE y las tablas de comandos, pero esto no significa que no pueda pellizcar algunos JS para hacer lo mismo. –

+1

Si lo resuelve en IDE con JavaScript envíe su solución. Me interesaría verlo. :) –

2

No hay manera de selenio podría evaluar una lista de los artículos devueltos por un localizador. Simplemente toma el primero y hace cosas con él.

Dave answer es la mejor alternativa para lo que estás buscando.

+0

Creo que todavía es merecedor de un ir en JS :) –

2

Estoy tratando de hacer exactamente lo mismo en Selenium e intenté usar el ejemplo de @ dave-hunt, pero es un método incorrecto para encontrar un elemento individual en una colección.

Consideremos el siguiente ejemplo:

<form> 
<div> 
    <input type="text" name="field1" /> 
</div> 
<div> 
    <input type="text" name="field2" /> 
</div> 
</form> 

Si utiliza una expresión como:

//input[@type='text'][1] 

Esto devolverá todas las entradas de texto en la página. ¿Por qué? Porque cada entrada es el primer elemento coincidente dentro de su propio árbol.

Sin embargo, si se utiliza una expresión como:

/descendant::input[@type='text'][1] 

o

/descendant::input[@type='text'][2] 

la primera expresión se agarra la primera entrada y la segunda expresión se agarra la segunda entrada. Es muy importante que use un solo "/" y NO un doble "//".

4

Con

/descendant::input[@type='text'][1] 
/descendant::input[@type='text'][2] 

sólo se puede buscar todos los elementos de entrada en el árbol. No funcionará si solo quieres analizar un subárbol.

Una mejor manera es:

(/form/div/input[@type='text'])[1] 
(/form/div/input[@type='text'])[2] 

que devolverá resultado # 1, # 2, etc., de la expresión XPath dentro de los corchetes.

Por supuesto, también podría hacer

(//input[@type='text'])[1] 

Esto es muy útil, como selenio, sólo utiliza el primer partido y no puede hacer frente a un conjunto de resultados, que es lo que generalmente vuelve XPath.

5

Probé el enfoque anterior y el selenio arrojaba excepciones de que no se encuentra el elemento.Agregar prefijo xpath = resolvió el problema.

ejemplo

xpath=(//td[@class='cell name bold'])[1] 
xpath=(//td[@class='cell name bold'])[2] 
+0

El prefijo 'xpath =' ha salvado mi día! ¡Un millón de gracias! –

Cuestiones relacionadas