Pregunta

¿Es posible que Selenium evalúe todos los elementos que pueden coincidir con un determinado XPath ?

Por ejemplo, me gustaría evaluar si todas las casillas de verificación están marcadas con // input [type = 'checkbox'] - el problema es que solo obtengo una elemento devuelto.

¿Fue útil?

Solución

Puede usar el comando getXpathCount para determinar el número de elementos coincidentes. Luego, puede recorrerlos utilizando un incremento para ubicar cada elemento individualmente. El siguiente ejemplo de Java (TestNG / JUnit) verificará que todas las casillas de verificación en una página estén marcadas:

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

Otros consejos

Probé el enfoque anterior y Selenio estaba lanzando excepciones de que no se encuentra el elemento. Agregando el prefijo xpath = resolvió el problema.

ejemplo

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

Con

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

solo puede buscar todos elementos de entrada en el árbol. No funcionará si solo desea analizar un subárbol.

Una mejor manera es:

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

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

Por supuesto que también podrías hacer

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

Esto es bastante útil ya que Selenium solo usa la primera coincidencia y no puede lidiar con un conjunto de resultados, que es lo que devuelve XPath.

No hay forma de que el selenio pueda evaluar una lista de elementos devueltos por un localizador. Simplemente toma el primero y hace todo lo que tiene.

La respuesta de Dave es la mejor alternativa para lo que estás buscando.

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.

Considere el siguiente ejemplo:

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

Si usas 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 usas una expresión como:

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

o

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

la primera expresión tomará la primera entrada y la segunda expresión tomará la segunda entrada. Es muy importante que utilice una única " / " y NO un doble " // " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top