2011-10-14 6 views
11

Quiero ubicar un elemento en una página web usando texto.
Sé que es un nombre de método contiene hacerlo, por ejemplo:Selenio: cómo localizar un nodo usando la coincidencia de texto exacta

tr[contains(.,'hello')]/td 

Pero el problema es si tengo dos elementos de nombre hola y hello1 entonces esta función no funciona correctamente.

¿Hay algún otro método como el contenido para una coincidencia de cadena exacta para localizar elementos?

+0

¿Qué quiere decir con "no funciona correctamente"? ¿Cuál es el comportamiento inesperado? –

+0

si tenemos dos elementos con el texto hello y hello1 y cuando usamos contains (., 'Hello'), este método siempre buscará hello. Problema si estos elementos están en una tabla y hello1 es el primer elemento y hello es el segundo, y cuando lo usemos, siempre indicará hello1, ya que es el primer elemento y contiene hello, pero queremos buscarlo. método de coincidencia –

Respuesta

1

Bueno, su problema es que está buscando texto en el tr (que de todos modos no es correcto) y esto causa un problema a la función contains que no puede aceptar una lista de texto. Intenta usar esta ruta de ubicación en su lugar. Debe recuperar lo que quieras.

//tr/td[contains(./text(),"hello")] 

Esta ruta de ubicación recuperará un conjunto de nodos en el que debe iterar para obtener el texto. Usted puede tratar de añadir el

/text() 

pero esto hará que (al menos en mi prueba) un resultado que es una cadena que es una concatenación de todas las cadenas coincidentes.

+0

No hay nada de malo con el uso de 'contiene (., lo que sea) 'en un elemento TR, aunque probablemente no sea lo que realmente quiere Abhinav. '.' es una abreviatura para' self :: node() ', no para' descenddant-or-self :: text() ', por lo que el TR y todos sus descendientes se convierten en cadenas, concatenadas y comparadas , en lugar de buscar un solo nodo de texto que coincida. –

+0

@RossPatterson El hecho es que si está haciendo un buen código, no hay texto debajo de un tr sino solo uno (o más) td. Con esto en mente, dije sobre "lo que no es correcto de todos modos". –

16
tr[.//text()='hello']/td 

Esto seleccionará todos los elementos td niño de todos los elementos tr tener un hijo con exactamente 'hola' en ella. Tal XPath todavía me suena extraño.

creo que esto tiene más sentido:

tr/td[./text()='hello'] 

porque selecciona sólo el TD que contiene el texto.

¿Eso ayuda?

3

Todo depende de lo que en realidad contiene el código HTML, pero el selector de tr[contains(.,'hello')]/td XPath significa "la primera celda de la primera fila que contiene la cadena 'hola' en cualquier lugar dentro de ella" (o, más exactamente, "la primer elemento TD en el elemento TR que contiene la cadena 'hola' en cualquier lugar dentro de él ", ya que Selenium no tiene idea de lo que realmente hacen los elementos involucrados). Es por eso que está obteniendo el resultado incorrecto cuando hay filas que contienen "hello" y "hello1"; ambas contienen "hello".

El selector tr[. ='hello']/td sería más preciso, pero es un poco inusual (porque los elementos HTML TR no deben contener texto, se supone que el texto debe estar en elementos TH o TD dentro del TR) y probablemente ganó No funciona (porque el texto en otras celdas rompería la comparación). Probablemente deseetr[td[.='hello']]/td, que significa "el primer elemento TD contenido en el elemento TR que contiene un elemento TD que tiene la cadena 'hola' ya que es texto completo".

+0

Acabo de aprender el truco. = 'Texto' gracias a esta publicación. Gracias @Ross Patterson! En este caso puede coincidir exactamente CUALQUIER td en la página con //td[.='hello '] para encontrar CUALQUIER celda TD que contenga EXACTAMENTE' hola '. Es probable que el tr no sea necesario a menos que desee asegurarse de que el td esté dentro de un tr. –

Cuestiones relacionadas