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:
Conclusiones:
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
Publicar un comentario