2011-04-27 12 views
8

tengo HTML que se ve básicamente como el siguiente:Selección de un elemento con XPath y selenio

...  
    <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a> 
... 

La siguiente XPath en selenio no encuentra un elemento :

//a[contains(text(), 'Sign in') and contains(@class,'btnX')] 

Los siguientes XPaths en Selenium tienen éxito, pero no son lo suficientemente específicos para mí.

//a[contains(text(), 'Sign in')] 
//a[contains(@class, 'btnX')] 

¿Por qué el xpath no encuentra un elemento y qué puedo hacer para que funcione?

+1

'// a [contiene (texto() , 'Iniciar sesión')] 'no debería seleccionar ese elemento –

+0

Sí, de las dos opciones que funcionan, estoy de acuerdo en que la primera debería * no * funcionar, a menos que esté buscando el texto() de los subelementos y unirlos , como lo hace JavaScript. Sin embargo, estaba teniendo problemas para conciliar eso con el hecho de que no funcionó junto con la otra prueba * excepto * cuando inventé una especie de lógica difusa que una vez que utilicé un elemento de "contexto" particular para la expresión, no pudo evaluar el resto de la expresión fuera de ese contexto. – cgp

+0

Funcionará porque también recoge el texto de subelementos. Esto puede ser un dolor y una bendición :) – Ardesco

Respuesta

13

casos partido en el que está directamente Sign in niño de a o hijo de otro elemento:

 
//a[contains(@class,'btnX') and .//text()='Sign in'] 

me refiero

<a class="btnX btnSelectedBG" href="#">Sign in</a>

y

<a class="btnX btnSelectedBG" href="#"><b>Sign in</b></a>

0

Yaaa para mí. ¡Creo que esta es la mejor respuesta, pero abierta a otras soluciones!

//a[contains(@class,'btnX') and span[text()='Sign in']] 
+1

Por supuesto: '// a [contiene (@ clase, 'btnX') y contiene (., 'Iniciar sesión')]'.** No aborde los nodos de texto en esquemas de contenido mixto como XHTML **. –

+0

Te das cuenta de que es funcionalmente idéntico a // a [contains (@class, 'btnX')] [span [. = 'Iniciar sesión']] En lugar de usar un y acabo de dividirlos en dos condiciones :) – Ardesco

4

// a [contiene (@ clase, 'btnX') y span [texto() = 'Iniciar sesión']] no es una buena idea porque buscará el DOM para cada delimitador y luego intentará y compárelo con sus criterios de búsqueda.

Lo ideal es que teclee su XPath en el primer elemento ascendente que tenga una ID y luego avance por el árbol.

p. Ej. si su html es

<div id="foo"> 
    <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a> 
</div> 

que puede usar:

//div[@id='foo']/a[contains(@class, 'btnX')][span[.='Sign in']] 

Desafortunadamente no sé el resto de la estructura de la página, así que no puedo dar nada más concreto que:

//a[contains(@class, 'btnX')][span[.='Sign in']] 

pero realmente no es una muy buena xpath.

(Mis de XPath ser ligeramente diferente a la que ya he utilizado. Como un acceso directo para el texto() y un segundo conjunto de [] como un atajo y)

+0

Tenía curiosidad sobre el. notación y cuando podría ser utilizado. Gracias por el ejemplo. – cgp

Cuestiones relacionadas