2010-09-09 22 views
61

Estoy escribiendo un caso de prueba de Selenium. Y aquí está la expresión xpath que uso para unir todos los botones 'Modificar' dentro de una tabla de datos.¿Cómo seleccionar el nodo especificado dentro de los conjuntos de nodos Xpath por índice con Selenium?

//img[@title='Modify'] 

Mi pregunta es, ¿cómo puedo visitar los conjuntos de nodos coincidentes por índice? He tratado con

//img[@title='Modify'][i] 

y

//img[@title='Modify' and position() = i] 

Pero ni las obras .. También probé con XPath corrector (Una extensión de Firefox). Hay totalmente 13 coincidencias encontradas, entonces no tengo idea de cómo voy a seleccionar una de ellas ... ¿O admite XPath la selección especificada de nodos que no están en el mismo nodo principal?

Respuesta

131

Esto es un FAQ:

//someName[3] 

significa: todos someName elementos del documento, que son el tercer someName hijo de su padre - hay pueden ser muchos de esos elementos.

Lo que se quiere es exactamente la tercera someName elemento:

(//someName)[3] 

Explicación: la [] tiene una prioridad más alta (prioridad) que //.Recuerde siempre poner expresiones del tipo //someName entre corchetes cuando necesite especificar el n-ésimo nodo de su lista de nodos seleccionada.

+8

+1 para explicación de precedencia. –

+1

¡Muchas gracias! Lo siento, me olvidé por completo de las cosas que preceden ... ¡Lo intenté y funciona! –

+0

@ Kymair-Wu: me alegro de que esta respuesta haya sido útil para ti. Aquí en SO, la forma de expresar gratitud es aceptando una respuesta (sugerencia: haga clic en la marca de verificación al lado de la respuesta). :) –

13

No hay i en XPath.

O se utilizan números literales: //img[@title='Modify'][1]

O se genera la cadena de expresión de forma dinámica: '//img[@title='Modify']['+i+']' (pero tenga en cuenta que las expresiones XPath dinámicas no funcionan desde dentro XSLT).

¿O admite XPath la selección especificada de los nodos que no están en el mismo nodo principal?

Sí: (//img[@title='Modify'])[13]


Este //img[@title='Modify'][i] significa "cualquier <img> con un título de 'Modificar' y un elemento secundario denominado <i>."

+0

1 para la explicación acerca de '[i]' significado –

+0

Gracias del predicado mucho :) Tengo mi problema resuelto. –

+0

Por alguna razón, necesitaba incluir el índice antes de la expresión del atributo. Por ejemplo, para encontrar 'td's que fueron el sexto hijo de un' tr' y no tienen contenido vacío: '// tr/td [6] [string-length (text())> 0]' –

1
//img[@title='Modify'][i] 

es corto para

/descendant-or-self::node()/img[@title='Modify'][i] 

por lo tanto está devolviendo el i-ésimo nodo bajo el mismo nodo padre.

¿Quieres

/descendant-or-self::img[@title='Modify'][i] 
+0

Simplemente '/ descenddant :: img [@ title = 'Modificar'] [$ index]' funcionará bien. También tenga en cuenta que la prueba del predicado '[i]' para la existencia del elemento secundario 'i'. –

0

(// * [@ atributo = 'valor']) [índice] encontrar objetivo de elemento, mientras que su búsqueda de varias coincidencias en ella

+1

¿Puedes explicar un poco más? – abhiarora

Cuestiones relacionadas