xpath tips - encontrando elementos dinamicamente

Buenas Lectores.

Hoy vamos a revisar como encontrar un elemento de forma dinamica por medio de la comparación de un atributo o texto de forma parcial, esto ocurre muchas veces cuando nos queda el recurso de ubicar un control por medio de un texto debido a que no tiene id.

De nuevo como va ser costumbre en el blog, tenemos parte teórica que es para las personas que apenas estan comenzando y la parte practica que es cuando ya conocemos del tema y queremos encontrar especificamente la sintaxis.


-----Parte teoríca

contains es una función xpath que se utiliza para encontrar elementos que contienen un texto en particular. También podemos usar atributos para identificarlos.

Sintaxis:

Usando atributos

//tagname[contains (@Attribute, ‘Value’)] = //button[contains(@id,'login')]

Usando texto

//tagname[contains(text(),'XYZ')] = //button[contains(text(),'Login')]


Así mismo existe la posibilidad de buscar un control que no contenga algo en particular, la sintaxis ejemplo sería:

//production[not(contains(category,'Business'))]


-----Parte práctica

Supongamos que tenemos el siguiente reto:






Queremos extraer de forma dinámica el segundo control, existen varias posibilidades.


Solo vamos a revisar las tres opciones más viables en orden de prioridad:


3 - Usando index


La forma dinámica menos dinámica es usando index, para solucionar el reto sería:


(//div[@class='InfoPlaca']/div)[2]


Le estamos diciendo que encuentre un div dentro del elemento InfoPlaca
y me traiga el segundo div que encuentre, en este caso el elmento que necesitamos



2 - Usando contains text


La forma dinámica más común de usar es está, sin embargo
si nuestra estrategía de automatización incluye diferentes idiomas, esta forma no es.


//div[@class='InfoPlaca']/div[contains(text(),'214')]


Estamos diciendo que busque un div que contenga el texto 214 que se encuentra dentro del div InfoPlaca


1 - Usando not contains


Es aquí que si tenemos una estrategia basada en idioma, la mejor solución sería la siguiente:


//div[@class='InfoPlaca']/div[not(contains(@class,'Img-event-note'))]


Le estamos diciendo que nos busque un div que no tiene la class que diferencia
a los dos div hijos que estamos buscando. Con esto evitamos estar ligados a un texto en particular.

También podemos usar que no tenga un atributo en específico, por ejemplo que no tenga el atributo aria-label:

//*[not(@aria-label)]



Conclusiones:
Estas funciones de xpath nos permiten encontrar elementos de una forma dinámica sin necesidad de ingresar cambios a nivel de desarrollo sobre el aplicativo, sin embargo, siempre es necesario recordar que la mejor forma de hacerlo es buscando por medio de un identificador único (id)



Fuentes:
https://www.educba.com/xpath-contains/
https://stackoverflow.com/questions/11024080/how-to-use-not-contains-in-xpath
https://stackoverflow.com/questions/3674569/how-to-select-specified-node-within-xpath-node-sets-by-index-with-selenium


Comentarios

Entradas populares de este blog

Tiempo de espera "muerto" explicito en Playwright

Como tener un condicional en Playwright en caso que siga aun presente un elemento

Subir mi proyecto local a Azure repos