org - Seleccionar un elemento con xpath y Selenium
selenium webdriver java (3)
Relacionar casos en los que el Sign in
es directamente hijo de a
hijo de otro elemento:
//a[contains(@class,''btnX'') and .//text()=''Sign in'']
quiero decir
<a class="btnX btnSelectedBG" href="#">Sign in</a>
y
<a class="btnX btnSelectedBG" href="#"><b>Sign in</b></a>
Tengo HTML que se ve básicamente como el siguiente:
...
<a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
...
El siguiente xpath en Selenium no puede encontrar 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?
Yaaa para mi ¡Creo que esta es la mejor respuesta, pero abierta a otras soluciones!
//a[contains(@class,''btnX'') and span[text()=''Sign in'']]
// a [contiene (@ clase, ''btnX'') y span [texto () = ''Iniciar sesión'']] no es una buena idea porque vas a buscar a través del DOM para cada ancla y luego intentas compararlo 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.
por ejemplo, si tu html es
<div id="foo">
<a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
</div>
Podrías usar:
//div[@id=''foo'']/a[contains(@class, ''btnX'')][span[.=''Sign in'']]
Desgraciadamente, no conozco el resto de la estructura de la página, así que no puedo darte nada más concreto que:
//a[contains(@class, ''btnX'')][span[.=''Sign in'']]
pero en realidad no es una muy buena xpath.
(El aspecto de mi XPath es ligeramente diferente a ti, porque lo he usado como un atajo para el texto () y un segundo conjunto de [] como un atajo para y)