El patrón Page Object Model (POM) separa la lógica de interacción con la interfaz de la lógica de los tests. En automation-arqc cada pantalla o grupo de controles reutilizables tiene su propia clase: el test solo orquesta pasos de negocio (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Giofelix/Proyecto-automatizacion-Empresa/llms.txt
Use this file to discover all available pages before exploring further.
menu.navegar(...), crud.guardar()) y delega en el page object el conocimiento de cómo encontrar e interactuar con cada elemento del DOM de Angular. Esto hace que los tests sean legibles, tolerantes a cambios de UI y fáciles de mantener.
Páginas comunes
Las tres clases depages/common/ son la columna vertebral del proyecto. Cualquier spec, sin importar el módulo de negocio que pruebe, las importa y las instancia para moverse por la app, ejecutar operaciones CRUD y manejar la tabla de resultados.
MenuNavegacion — navegación por acordeón de Angular Material
MenuNavegacion — navegación por acordeón de Angular Material
AccionesCrud — botones de acción reutilizables
AccionesCrud — botones de acción reutilizables
Encapsula los seis botones de acción presentes en casi todas las pantallas del sistema: Agregar (
page.getByText('add', { exact: true })), Guardar (mat-icon save), Editar (mat-icon edit), Eliminar (mat-icon delete), Aceptar (button[role=button][name=Aceptar]) y Cancelar (button[role=button][name=Cancelar]). Todos los locators se resuelven en el constructor; los métodos son envoltorios de un solo .click().Cuándo usarla: para cualquier operación CRUD estándar. Si la pantalla expone un botón con nombre distinto, modela ese caso en el page object del módulo, no en AccionesCrud.ComponentesTabla — filtro, paginación y selección de filas
ComponentesTabla — filtro, paginación y selección de filas
Abstrae los controles de la tabla de datos reutilizable del sistema: botones de refrescar y filtrar, selector de cantidad de filas por página, navegación de páginas (primera, anterior, siguiente, última) y selección de fila por checkbox. El método
seleccionarFila(textoFila) usa getByRole('gridcell', { name, exact: true }) para evitar seleccionar una fila cuyo NIT sea prefijo de otro (p. ej. 900516574 vs 9005165746). El método filtrar() espera a que el diálogo de filtro sea visible antes de devolver el control al test.Cuándo usarla: para cualquier interacción con la tabla de listado: aplicar filtros, navegar páginas o seleccionar registros antes de editar o eliminar.Ejemplo de uso conjunto
Páginas de módulos
Los page objects específicos de negocio viven bajopages/modulos/ replicando la jerarquía del menú de la aplicación. Cada clase modela una sola pantalla: define todos sus locators en el constructor y expone métodos de alto nivel que agrupan varias interacciones en una sola acción con nombre de negocio.
Jerarquía del módulo Reteica
| Clase | Archivo | Responsabilidad |
|---|---|---|
Terceros | terceros.page.js | Formulario de tercero: pestañas Básicos y Adicionales, campos NIT/razón social/régimen/naturaleza/ubicación, búsqueda de cámara de comercio. Métodos: completarDatosBasicos(), completarDatosAdicionales(), buscarCamaraComercio(). |
Conceptos | conceptos.page.js | Formulario de conceptos tributarios. |
Contribuyentes | contribuyentes.page.js | Listado y detalle de contribuyentes; navegación al menú more_vert de procesos (irAProcesoDesdeMenu()). |
Establecimientos | establecimientos.page.js | Subformulario de establecimientos dentro de un contribuyente: nombre, teléfono, ubicación, fecha de inicio de actividad. |
PresentarDeclaracion | presentar-declaracion.page.js | Asistente de cuatro pasos para presentar una declaración: año gravable, establecimientos, liquidación de conceptos y formulario final de terceros asociados. |
Ejemplo: Terceros en acción
completarDatosBasicos(), el campo NIT recibe un press('Tab') interno que dispara el cálculo automático del dígito de verificación por Angular — el test no necesita preocuparse por ese detalle.
Convenciones de nomenclatura
Todas las clases del proyecto siguen un conjunto de reglas estrictas para garantizar coherencia y facilitar la búsqueda de code en el repositorio.| Convención | Regla | Ejemplo |
|---|---|---|
| Nombre de archivo | <modulo>.page.js para módulos; <componente>.js para comunes | terceros.page.js, menu-navegacion.js |
| Nombre de clase | PascalCase que coincide con el nombre del módulo | class Terceros, class MenuNavegacion |
| Locators | Todos definidos en el constructor(page), como propiedades de la instancia | this.inputNit = page.getByRole('textbox', { name: 'Nit' }) |
| Métodos | Verbo + sustantivo en camelCase; deben ser async | completarDatosBasicos(), seleccionarFila(), buscarCamaraComercio() |
| Exportación | Named export con module.exports = { ClassName } (CJS) o export class (ESM) | module.exports = { MenuNavegacion } |
| Locators con función | Para locators parametrizados, usar arrow functions como propiedad | this.checkboxSeleccion = (texto) => page.getByRole(...) |
No crees un nuevo page object para un test E2E a menos que el flujo pase por una pantalla que aún no está modelada. Los tests E2E reutilizan las clases existentes de
pages/modulos/ y pages/common/. Si necesitas un nuevo locator en una pantalla ya existente, agrégalo a la clase correspondiente — no crees una clase paralela.Fixtures
Cómo los fixtures gestionan autenticación y datos de prueba con setup/teardown automático.
Referencia de componentes comunes
API completa de
MenuNavegacion, AccionesCrud y ComponentesTabla.