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

Subir mi proyecto local a Azure repos

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