Skip to main content

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.

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 (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 de pages/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.
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.
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

import { MenuNavegacion } from '../../pages/common/menu-navegacion';
import { AccionesCrud } from '../../pages/common/acciones-crud';
import { ComponentesTabla } from '../../pages/common/componentes-tabla';

const menu = new MenuNavegacion(page);
const crud = new AccionesCrud(page);
const tabla = new ComponentesTabla(page);

await menu.navegar(['Reteica', 'Archivos', 'Terceros']);
await tabla.filtrar();
await tabla.seleccionarFila('900516574');
await crud.editar();

Páginas de módulos

Los page objects específicos de negocio viven bajo pages/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

pages/modulos/reteica/
└── archivos/
    ├── terceros.page.js                    →  class Terceros
    ├── conceptos.page.js                   →  class Conceptos
    └── contribuyentes/
        ├── contribuyentes.page.js          →  class Contribuyentes
        └── menu-procesos-contribuyentes/
            ├── establecimientos.page.js    →  class Establecimientos
            └── presentar-declaracion.page.js  →  class PresentarDeclaracion
ClaseArchivoResponsabilidad
Tercerosterceros.page.jsFormulario 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().
Conceptosconceptos.page.jsFormulario de conceptos tributarios.
Contribuyentescontribuyentes.page.jsListado y detalle de contribuyentes; navegación al menú more_vert de procesos (irAProcesoDesdeMenu()).
Establecimientosestablecimientos.page.jsSubformulario de establecimientos dentro de un contribuyente: nombre, teléfono, ubicación, fecha de inicio de actividad.
PresentarDeclaracionpresentar-declaracion.page.jsAsistente 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

import { Terceros } from '../../pages/modulos/reteica/archivos/terceros.page.js';

const terceros = new Terceros(page);

// Completar pestaña Básicos
await terceros.completarDatosBasicos({
  nit: '900852369',
  tipoDocumento: 'NIT',
  razonSocial: 'AUTOTEST QA SAS',
  tipoRegimen: 'Menores Ingresos',
  naturaleza: 'PERSONA JURIDICA',
  direccion: 'CL 18 25 50',
  telefonos: '6027234567',
});

// Completar pestaña Adicionales
await terceros.completarDatosAdicionales({
  pais: 'Colombia',
  departamento: 'BOYACA',
  ciudad: 'BOYACA',
  email: 'qa.autotest@example.com',
});
Tras llamar a 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ónReglaEjemplo
Nombre de archivo<modulo>.page.js para módulos; <componente>.js para comunesterceros.page.js, menu-navegacion.js
Nombre de clasePascalCase que coincide con el nombre del móduloclass Terceros, class MenuNavegacion
LocatorsTodos definidos en el constructor(page), como propiedades de la instanciathis.inputNit = page.getByRole('textbox', { name: 'Nit' })
MétodosVerbo + sustantivo en camelCase; deben ser asynccompletarDatosBasicos(), seleccionarFila(), buscarCamaraComercio()
ExportaciónNamed export con module.exports = { ClassName } (CJS) o export class (ESM)module.exports = { MenuNavegacion }
Locators con funciónPara locators parametrizados, usar arrow functions como propiedadthis.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.

Build docs developers (and LLMs) love