14. Selectores, identificadores y elementos confiables para pruebas E2E

14.1 Introducción

En una prueba End-to-End que interactúa con una interfaz de usuario, la prueba necesita encontrar elementos: campos, botones, enlaces, mensajes, tablas, filas o secciones. La forma de ubicar esos elementos se conoce como selector.

Elegir buenos selectores es clave para la estabilidad. Una prueba puede estar bien pensada y aun así fallar si depende de elementos frágiles, como clases visuales cambiantes, posiciones en pantalla o textos que se modifican con frecuencia.

En este tema veremos qué hace confiable a un selector y cómo elegir identificadores adecuados para pruebas E2E.

14.2 Qué es un selector

Un selector es una forma de indicar qué elemento de la interfaz debe usar la prueba. Por ejemplo, un selector puede apuntar al botón "Comprar", al campo de correo electrónico o al mensaje de confirmación de una operación.

Un selector confiable permite encontrar el elemento correcto por su significado dentro del flujo, no por detalles accidentales de presentación.

Si la prueba no puede encontrar el elemento correcto, no podrá interactuar con la aplicación ni verificar el resultado esperado.

14.3 Por qué los selectores afectan la estabilidad

Las interfaces cambian con frecuencia: se ajustan estilos, se reorganizan componentes, se cambian textos, se agregan contenedores o se modifican clases CSS. Si la prueba depende de esos detalles, puede fallar aunque el comportamiento del sistema siga siendo correcto.

Ejemplos de fallas por selectores frágiles:

  • La prueba busca el tercer botón de una pantalla y se agrega un botón nuevo antes.
  • La prueba depende de una clase CSS que cambia por rediseño visual.
  • La prueba usa un texto que luego se ajusta por UX o traducción.
  • La prueba elige el primer campo de un formulario, pero se agrega otro campo arriba.
  • La prueba usa una estructura HTML demasiado específica que cambia al refactorizar componentes.

Un buen selector reduce mantenimiento y evita fallas que no representan defectos reales.

14.4 Selectores frágiles

Un selector frágil depende de detalles que no forman parte del comportamiento que queremos validar. Puede funcionar al principio, pero romperse con cambios menores.

Selector frágil Por qué es riesgoso
Posición del elemento Puede cambiar si se agrega o reordena contenido.
Clases CSS de estilo Cambian con rediseños sin afectar la funcionalidad.
Estructura HTML muy profunda Se rompe al refactorizar componentes o contenedores.
Texto no contractual Puede cambiar por redacción, traducción o ajustes de producto.
Elementos demasiado genéricos Pueden coincidir con varios botones, enlaces o campos.

14.5 Selectores confiables

Un selector confiable identifica un elemento de manera estable y significativa. Debe seguir funcionando aunque cambien detalles visuales no relevantes.

Características de un buen selector:

  • Representa el propósito del elemento.
  • No depende de la posición en pantalla.
  • No depende de clases usadas solo para diseño.
  • Es único dentro del contexto necesario.
  • Se mantiene estable mientras la funcionalidad exista.
  • Es fácil de leer por el equipo.

La estabilidad del selector debe pensarse como parte de la mantenibilidad de la prueba.

14.6 Identificadores específicos para pruebas

Una práctica habitual es agregar atributos específicos para pruebas, como data-testid, data-test o data-cy. Estos identificadores permiten ubicar elementos sin depender del diseño visual.

Un identificador de prueba debe expresar la función del elemento dentro del flujo: por ejemplo, login-email, checkout-confirm o order-success-message.

Estos atributos no deberían usarse para estilos ni lógica de negocio. Su propósito es ayudar a las pruebas a encontrar elementos estables.

14.7 Ejemplos de buenos y malos identificadores

La calidad del nombre también importa. Un identificador confuso o demasiado genérico puede dificultar el mantenimiento.

Menos recomendable Más recomendable Motivo
button1 checkout-confirm-button El segundo expresa la acción del usuario.
green-btn save-profile-button El color puede cambiar; la acción es más estable.
msg payment-error-message El segundo indica qué mensaje se espera.
row-3 order-row-12345 La posición cambia; la entidad es más clara.

14.8 Selectores por rol o accesibilidad

En algunas herramientas modernas, es posible seleccionar elementos por su rol accesible: botón, enlace, campo de texto, encabezado o nombre visible. Esto puede ser útil porque se parece a cómo un usuario interpreta la interfaz.

Ejemplos conceptuales:

  • Seleccionar un botón por su nombre: "Confirmar compra".
  • Seleccionar un campo por su etiqueta: "Correo electrónico".
  • Seleccionar un enlace por su texto accesible: "Mis cursos".
  • Verificar un encabezado visible: "Compra confirmada".

Este enfoque mejora legibilidad y puede favorecer accesibilidad, pero depende de que los nombres visibles sean parte estable del contrato de la interfaz.

14.9 Cuándo usar texto visible

Usar texto visible puede ser adecuado cuando ese texto forma parte del comportamiento esperado. Por ejemplo, un mensaje de error, una confirmación o una etiqueta importante.

Pero puede ser frágil cuando el texto cambia con frecuencia por decisiones de diseño, marketing, traducción o ajustes de tono.

Uso del texto Recomendación
Mensaje de confirmación funcional. Puede ser una verificación válida.
Texto decorativo o promocional. No conviene depender de él.
Etiqueta estable de un campo. Puede ser útil si forma parte del contrato de la UI.
Texto sujeto a traducción frecuente. Conviene usar otro identificador o controlar el idioma del ambiente.

14.10 Elementos dinámicos

Muchas interfaces muestran listas dinámicas: productos, órdenes, turnos, usuarios o solicitudes. En estos casos, la prueba debe identificar el elemento correcto sin depender de su posición.

Buenas prácticas:

  • Usar datos únicos creados por la prueba.
  • Buscar la fila por un identificador de negocio, como número de orden o correo.
  • Limitar la búsqueda a una sección o tabla específica.
  • Verificar que el elemento contiene los datos esperados.
  • Evitar expresiones como "primer resultado" si el orden puede cambiar.

Cuando la prueba crea un dato único, luego puede buscarlo de manera más confiable.

14.11 Contexto del selector

A veces un mismo elemento aparece varias veces en una pantalla. Por ejemplo, varios botones "Editar" en una tabla. En esos casos, no alcanza con seleccionar "Editar"; necesitamos ubicar el botón dentro del contexto correcto.

Ejemplo conceptual:

Buscar la fila de la orden 12345 y, dentro de esa fila, seleccionar el botón "Ver detalle".

El contexto evita que la prueba interactúe con el elemento equivocado.

14.12 Elementos ocultos, deshabilitados o duplicados

Un selector puede encontrar un elemento que existe en el HTML, pero que no está listo para usarse. Puede estar oculto, deshabilitado, cubierto por otro elemento o duplicado en una versión móvil y otra de escritorio.

Antes de interactuar, conviene verificar:

  • Que el elemento sea visible para el usuario.
  • Que esté habilitado.
  • Que sea el único elemento relevante en ese contexto.
  • Que pertenezca a la sección correcta.
  • Que la pantalla no esté en estado de carga.

Esto conecta el tema de selectores con el tema anterior de sincronización.

14.13 Nombres alineados con el negocio

Los identificadores de prueba son más mantenibles cuando se alinean con el lenguaje del producto. Si el negocio habla de "solicitudes", "turnos", "órdenes" o "cursos", esos términos deberían aparecer en los nombres cuando corresponda.

Ejemplos:

  • course-buy-button
  • appointment-confirm-button
  • request-status-label
  • order-history-table
  • payment-rejected-message

Esto ayuda a que los escenarios sean comprensibles para el equipo y no dependan de nombres técnicos internos.

14.14 Trabajo conjunto con desarrollo

Los selectores confiables no son solo responsabilidad de QA. El equipo de desarrollo puede ayudar agregando identificadores estables y evitando cambios innecesarios en elementos que son parte de pruebas críticas.

Buenas prácticas de equipo:

  • Acordar una convención para atributos de prueba.
  • Agregar identificadores a elementos críticos del flujo.
  • No reutilizar el mismo identificador para elementos distintos.
  • Actualizar pruebas cuando una funcionalidad cambia realmente.
  • Diferenciar cambios visuales de cambios funcionales.

Cuando el equipo diseña la aplicación pensando en testabilidad, las pruebas E2E se vuelven más simples y estables.

14.15 Ejemplo: compra de un curso

Para un flujo de compra de curso, podríamos necesitar elementos como estos:

Elemento Identificador posible Uso en la prueba
Botón para comprar curso course-buy-button Iniciar el flujo de compra.
Campo de cupón checkout-coupon-input Ingresar una variante alternativa del flujo.
Botón confirmar pago checkout-confirm-payment Ejecutar la acción principal.
Mensaje de compra confirmada purchase-success-message Verificar la confirmación visible.
Curso en "Mis cursos" my-courses-course-item Comprobar que el curso quedó habilitado.

14.16 Errores comunes

Al trabajar con selectores en pruebas E2E, conviene evitar estos errores:

  • Depender de clases CSS usadas solo para estilo.
  • Seleccionar elementos por posición cuando el orden puede cambiar.
  • Usar textos que no forman parte del comportamiento esperado.
  • No diferenciar elementos repetidos dentro de tablas o listas.
  • Usar identificadores genéricos como button, item o section.
  • Reutilizar el mismo identificador para varios elementos.
  • No actualizar selectores cuando cambia realmente el flujo funcional.

14.17 Lista de verificación

Antes de usar un selector en una prueba E2E, podemos revisar:

  • ¿Identifica el elemento correcto?
  • ¿Es estable frente a cambios visuales?
  • ¿Expresa el propósito del elemento?
  • ¿Es único dentro del contexto necesario?
  • ¿Evita depender de posición o estructura interna frágil?
  • ¿Funciona con datos dinámicos?
  • ¿Permite diagnosticar con claridad qué elemento falló?
  • ¿Está alineado con una convención del equipo?

14.18 Qué debes recordar de este tema

  • Los selectores permiten encontrar elementos de la interfaz durante una prueba E2E.
  • Los selectores frágiles generan fallas aunque la funcionalidad esté correcta.
  • Conviene evitar depender de posición, clases visuales y estructuras HTML profundas.
  • Los identificadores de prueba ayudan a ubicar elementos de forma estable.
  • Los nombres deben expresar el propósito funcional del elemento.
  • En listas dinámicas, conviene buscar por datos únicos o contexto.
  • Buenos selectores reducen mantenimiento y aumentan confianza en la suite.

14.19 Conclusión

Los selectores son una parte técnica pequeña, pero tienen un impacto grande en la estabilidad de las pruebas End-to-End. Una suite puede volverse frágil si depende de detalles visuales que cambian con frecuencia.

Elegir identificadores estables, significativos y alineados con el flujo permite que las pruebas fallen por problemas reales y no por cambios accidentales de la interfaz.

En el próximo tema veremos verificaciones: qué comprobar al final y durante el flujo.