Imagínate esto. Estás escribiendo un script de prueba que necesita hacer clic en un enlace para verificar su funcionalidad, pero ese botón no tiene una identificación o una clase que lo identifique. ¿Cómo lo encuentras?
Primero, debes decidir si usarás un selector de CSS o si usarás XPath. Por el bien de este artículo, iremos directamente a XPath. Si nos fijamos un poco más en el código, veremos que este enlace está dentro de un <li> que tiene un ID, podemos usar esto para nuestra ventaja.
Para seleccionar esto podríamos usar algo como:
// li [@ id = 'menu-item-14 ′] / a
En este caso y en este sitio, esto devuelve solo 1 resultado, que es lo que queremos, pero algo parece sospechoso para mi ojo. ¿Qué sucede si » menu-item-14 » es una ID dinámica y cambia cuando recargamos la página o cambiamos si el creador del sitio decide agregar otro elemento a ese menú?
Lo que sucederá es que nuestro código se romperá y tendremos que arreglarlo . Eso es lo que va a pasar.
Esto significa que debemos encontrar una forma más confiable de encontrar nuestro elemento, para esto tendremos que profundizar en el código. Si observamos un poco más a fondo, encontraremos que este <li> está dentro de un <ul> que tiene una ID única, y esa ID parece ser una estática que no cambiará en el futuro cercano. Esto representa una apuesta mucho más segura para confiar en nuestro XPath.
Si usamos esto como el inicio para nuestro XPath, terminaremos con algo como esto:
// ul [@ id = 'menú superior'] / li / a
Pero espera, ahora tenemos otro problema. Este XPath seleccionará todos los enlaces almacenados en esta lista, necesitamos restringirlo aún mas. Para esto podemos seguir 2 rutas, podemos dejarlo como está y en el código manejar la lista de elementos que devuelve, o podemos ser un poco más específicos, por lo que XPath solo devuelve un elemento.
Por experiencia anterior, he notado que ser específico e introducir la complejidad en XPath ahorra tiempo en la ejecución y también hace que su script de prueba al final sea un poco más limpio, ya que no tendrás que lidiar con el índice más adelante.
Nuestra última expresión XPath para seleccionar este enlace se vería así:
// ul [@ id = 'menú superior'] / li / a [contiene (texto (), 'Inicio')]
Entonces, tiempo de preguntas. ¿Por qué no pedimos un enlace que contenga ese texto desde el principio?
Primero, porque eso es demasiado genérico de una expresión. Con una expresión tan simple como la que nos exponemos a encontrar más cosas que lo que realmente estamos buscando.
Segundo, una expresión como esa no es eficiente. Esa expresión obliga a Selenium a revisar todo el DOM del sitio para encontrar todas las coincidencias posibles.
XPath es una herramienta realmente poderosa, pero puede hacer que tu código sea mucho más difícil de leer, mucho más lento y más propenso a romperse porque si algo cambia en la ruta que estás utilizando para tu búsqueda, el XPath se romperá. Y no solo se romperá, no te dirá qué parte del XPath falló.
En conclusión, mantén su XPath corto, pero no demasiado corto y lo suficientemente específico como para poder resistir cambios leves en el DOM.