Los Xpath dinámicos pueden aparecer cuando te enfrentas a elementos en una página web o una aplicación que cambian de posición o estructura. Esto puede dificultar la automatización, ya que los tradicionales Xpath estáticos ya no funcionarán. ¡tenemos una solución para ti!
1. ¿Qué es un Objeto Dinámico? #
En el desarrollo web, muchos elementos de una página (botones, tablas, menús) no tienen atributos fijos. Cada vez que la página se recarga, se inicia sesión o se realiza una acción, los identificadores técnicos de estos elementos (como el id, name o parte del class) podrían cambian automáticamente.
Un objeto dinámico es aquel cuyo localizador varía en el tiempo. Si intentamos automatizar un comando utilizando un selector estático copiado directamente del navegador, el robot fallará en la siguiente ejecución con un error de tipo FALLO – NO ENCONTRADO
Para lograr que tus automatizaciones sean robustas y no se «rompan» con los cambios de la aplicación, debes aplicar estrategias de localización avanzadas en la sección Propiedades y Valor del formulario “Nuevo Objeto” de STELA.
2. Uso de XPath Relativos y Funciones Lógicas #
En lugar de depender de IDs dinámicos (como id=»btn-38492″ donde el número cambia siempre), utiliza funciones de XPath que busquen patrones estables:
contains() (Contiene): Busca elementos que contengan una parte fija en su atributo. Ejemplo: //button[contains(@id, ‘btn-guardar’)] (Ignora los números dinámicos que puedan ir antes o después).
starts-with() (Empieza con): Ideal cuando el inicio del atributo es siempre el mismo. Ejemplo: //input[starts-with(@name, ‘txt_usuario_’)]
Guiarse por el Texto: Los textos visibles suelen ser lo más estable de una aplicación de negocio. Ejemplo: //span[text()=’Confirmar Compra’] o //a[contains(text(),’Descargar’)]
Localización por Eje o Parentesco (Estructura Relativa): Si un elemento es completamente dinámico y no tiene ningún atributo del cual agarrarse, busca un «elemento ancla» cercano que sí sea estático (como un título o una etiqueta de texto) y muévete a través de la estructura del código:
- Ir al elemento hijo: //div[@id=’contenedor-estable’]/input
- Buscar un hermano (following-sibling): Si necesitas interactuar con un campo de texto que está al lado de la palabra «Código de Barra»:
- Ejemplo: //label[text()=’Código de Barra’]/following-sibling::input
3. Mapear Objetos Dinámicos en STELA #
Cuando estés identificando un objeto con el Inspector de STELA o editando sus propiedades en el formulario de Nuevo Objeto, sigue este procedimiento:
- Detecta el dinamismo: Recarga la página web dos o tres veces. Inspecciona el elemento y observa qué partes de su código cambian (¿Cambiaron los números del ID? ¿Cambió el nombre de la clase?).
- Escribe el selector robusto: Cambia el tipo de propiedad a XPath (o la estrategia que aplique) e ingresa tu fórmula optimizada (usando contains, text, etc.) en el campo Valor.
- Guarda y Prueba: Haz clic en GUARDAR CAMBIOS y ejecuta el comando en modo depuración para verificar que el robot localice el objeto sin problemas.
4. Ejemplos Prácticos de Conversión #
Qué captura el Inspector | Cómo debes registrarlo en STELA (Robusto/Dinámico) | Razón del cambio |
|---|---|---|
| //*[@id=»input-45″] | //input[@type=’email’] | El número 45 cambiará en la próxima sesión. El tipo email es permanente. |
| /html/body/div[2]/div/div[3]/button | //button[text()=’Aceptar’] | Un XPath absoluto (toda la ruta de carpetas) se rompe si los desarrolladores agregan un simple banner arriba. El texto ‘Aceptar’ es directo. |
| //*[@class=»btn btn-primary active_392″] | //button[contains(@class, ‘btn-primary’)] | La clase active_392 contiene un sufijo dinámico. Filtrar solo por btn-primary asegura la coincidencia. |