Higiene de datos y estado en pruebas de automatización del navegador
Mantén datos sintéticos, estado del navegador y limpieza con propietarios explícitos en workers aislados.
Quieres la documentación estructurada de Identidad?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
Una prueba fiable declara cada entrada, propietario, resultado observable y límite de limpieza. Un contexto nuevo no vuelve independiente una cuenta compartida, un registro del servidor o una carpeta de descargas. Usa datos sintéticos creados por una interfaz de pruebas documentada y nunca exportaciones reales, documentos personales ni credenciales. Consulta la guía de fixtures y aislamiento para elegir el alcance.
Matriz de propiedad de datos y estado
| Recurso | Creador | Propietario mutable | Resultado observable | Límite de limpieza |
|---|---|---|---|---|
| Cuenta sintética | servicio de pruebas | worker del escenario | encabezado o acceso | API de reinicio |
| Contexto y cookies | fixture | fixture | contexto limpio | cerrar en finally |
| Baseline de estado | repositorio | copia del fixture | ruta cargada | conservar baseline; borrar copia |
| Carpeta de artefactos | worker | worker | recibo corto | borrar ruta local |
| Trabajo remoto | aplicación | servicio | estado documentado | cancelar o esperar expiración |
El cierre local no demuestra que se borró un registro remoto. Mantén el baseline de solo lectura y escribe copias con worker e intento. Dos contextos aún pueden competir por el mismo registro; asigna registros distintos o serializa la mutación documentada.
Fixture de fallo
Prueba una página sintética sin marcador de disponibilidad y conserva el primer error junto al resultado de limpieza:
import os from 'node:os';
import path from 'node:path';
import { mkdtemp, rm } from 'node:fs/promises';
import { chromium } from 'playwright';
import { expect } from '@playwright/test';
const dir = await mkdtemp(path.join(os.tmpdir(), 'state-hygiene-'));
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ baseURL: 'http://fixture.test' });
const page = await context.newPage();
await page.route('/fixtures/without-ready-marker', route =>
route.fulfill({ status: 200, contentType: 'text/html', body: '<main><p>Waiting</p></main>' })
);
let failure;
const remember = (label, error) => {
const current = new Error(`${label}: ${error.message}`, { cause: error });
failure = failure ? new AggregateError([failure, current], `${failure.message}; ${label} failed`) : current;
};
try {
await page.goto('/fixtures/without-ready-marker');
await expect(page.getByRole('status')).toHaveText('Ready', { timeout: 250 });
} catch (error) {
remember('aserción de fixture', error);
} finally {
try {
await context.close();
} catch (error) {
remember('cierre de contexto', error);
}
try {
await rm(dir, { recursive: true, force: true });
} catch (error) {
remember('limpieza de artefacto', error);
}
try {
await browser.close();
} catch (error) {
remember('cierre de navegador', error);
}
}
if (failure) throw failure;
Tabla de decisión
| Observación | Categoría | Acción | No demuestra |
|---|---|---|---|
| Falta el baseline | fixture | fallar y reparar la entrada | disponibilidad del servicio |
| Aparece una cookie antigua | estado del navegador | descartar contexto | invalidación del servidor |
| Workers sobrescriben datos | datos de prueba | separar o serializar | fallo de aislamiento del navegador |
| Pasa la aserción, falla limpieza | infraestructura | conservar ambos errores | borrado remoto |
| Pasa un reintento | resultado incierto | consultar estado admitido | que el primer intento fuera inocuo |
Revisar las transiciones
Trata el estado como una secuencia: baseline, comprobación visible y limpieza. El cambio de cuenta requiere la salida documentada y un contexto nuevo; borrar el almacenamiento local no invalida una sesión remota. Una instantánea debe conservar su versión y origen, y una copia incompleta debe fallar en lugar de regenerarse en silencio.
Proteger secretos y artefactos
Las instantáneas pueden contener cookies. Restringe sus permisos y conserva un recibo corto con escenario, worker, resultado y limpieza. No registres tokens, cuerpos completos ni texto personal. La carpeta temporal del worker y la retención de CI son responsabilidades distintas. La guía de cargas y descargas muestra un límite parecido.
Revisar reintentos y paralelismo
Nombra archivos con escenario, worker e intento, no con identificadores personales. Tras un tiempo de espera, consulta el estado admitido antes de repetir una mutación. Ejecuta casos de contexto limpio, estado expirado, cambio de cuenta, salida paralela y limpieza forzada después de cambios de navegador o aplicación.
La repetibilidad procede de entradas controladas, no de un navegador compartido durante mucho tiempo.
Fija la ruta, el esquema del fixture, la forma del registro sintético y la configuración necesaria.
Así cada cambio se atribuye a la aplicación, al fixture o al runner.
Evita una preparación global que cree cuentas, conceda permisos y deje páginas abiertas.
Esa preparación mezcla la causa del primer fallo con los efectos de pruebas anteriores.
El fixture de inicio debe informar que cargó estado conocido o que completó el acceso documentado.
No debe imprimir el material de sesión que permitió ese acceso.
El fixture de datos debe informar etiqueta de escenario y resultado del reinicio.
No debe enumerar registros para encontrar uno que funcione por casualidad.
Si falta la entrada esperada, termina como fallo de fixture.
Una sustitución no planificada impide reproducir el resultado.
Algunos estados viven fuera del navegador, como un simulador de correo o un servicio de notificaciones.
Cada dependencia externa necesita su propio espacio sintético y recibo.
La prueba de navegador puede observar una confirmación, no afirmar cada entrega posterior.
Usa la interfaz de prueba del servicio para los hechos que pertenecen al servicio.
Cerrar una página libera listeners y handles de esa página.
Cerrar un contexto libera el estado gestionado dentro de ese contexto.
Ninguna de esas acciones borra por sí sola un archivo copiado, un objeto cargado o un token de otro dispositivo.
Haz el cierre de sesión documentado mientras la página está disponible.
Después cierra recursos del navegador y elimina el directorio local del worker.
Un fallo de limpieza de la aplicación puede ser independiente del cierre del navegador.
Conserva ambas observaciones en el recibo breve.
No amplíes la limpieza buscando perfiles, directorios o contextos con nombres parecidos.
Una recuperación puede poner en cuarentena su propio directorio conocido si no logra eliminarlo.
Un registro sintético debe reconocerse sin parecer datos de una persona.
Usa prefijo de escenario, etiqueta de ejecución y valores diseñados para la aserción.
Para un límite, cambia una sola propiedad declarada de la entrada.
Un reinicio debe restaurar una baseline conocida y no adivinar una reparación parcial.
No reutilices automáticamente una etiqueta cuyo recibo informa limpieza incompleta.
Una aserción debe describir lo que una persona o prueba autorizada puede ver.
No deduzcas una sesión remota a partir de una entrada vacía de almacenamiento local.
No deduzcas un trabajo asíncrono por una navegación completada.
Registra la señal ausente, el estado visible inesperado o la categoría de error documentada.
Revisa primero registro único, contexto único y directorio privado antes de cambiar tiempos.
La revisión periódica compara el recibo fallido con el contrato declarado antes de cambiar una espera.
Capacidad y límite de BotBrowser
BotBrowser ofrece BrowserContexts aislados con cookies, almacenamiento y estado de sesión separados para flujos sintéticos autorizados. Sirve para comprobar que un contexto nuevo no hereda estado del cliente; consulta la documentación de aislamiento multi-cuenta. No sustituye el ciclo de vida de Playwright o Selenium, la limpieza de la aplicación, la invalidación de sesiones del servidor ni la gestión de secretos. No garantiza la aceptación de una cookie expirada, la cancelación de un trabajo ni el borrado de un registro del proveedor.
Registra solo escenario, worker, resultado visible y limpieza. Ejecuta un caso limpio, uno expirado y este fallo forzado antes de integrar cambios.
Fuentes
Artículos Relacionados
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.