Este directorio contiene tests end-to-end (e2e) para la extensión de Chrome de Exploratory Testing, implementados con Playwright.
- ✅ Carga correcta del popup de la extensión
- ✅ Contadores iniciales en cero
- ✅ Añadir anotaciones (Bug, Note, Idea, Question)
- ✅ Actualización de contadores al añadir anotaciones
- ✅ Captura de URL de la página activa
- ✅ Limpieza de campos después de añadir anotaciones
- ✅ Múltiples anotaciones simultáneas
- ✅ Botones de crop visibles para todos los tipos de anotación
- ✅ Alerta cuando falta descripción antes de crop
- ✅ Inicio de selección de área de crop
- ✅ Message passing correcto al content script
- ✅ Verificación de IDs de botones
- ✅ Exportación a CSV
- ✅ Exportación a JSON
- ✅ Generación de informe HTML
- ✅ Importación de sesión desde JSON
- ✅ Limpiar sesión
- ✅ Persistencia de datos al cerrar/abrir popup
- ✅ Estadísticas correctas en contadores
Los paquetes necesarios ya están instalados si ejecutaste npm install. Si necesitas reinstalar:
npm install --save-dev @playwright/test
npx playwright install chromiumnpm run test:e2enpm run test:e2e:headednpm run test:e2e:uinpm run test:e2e:debugnpm run test:e2e:reportnpx playwright test basic-functionality.spec.js
npx playwright test crop-screenshot.spec.js --headed
npm run test:e2e:crop # Atajo para crop testsnpm run test:allLa configuración de Playwright está en playwright.config.js en la raíz del proyecto. Características clave:
- Tests secuenciales: Las extensiones de Chrome requieren ejecución secuencial
- Modo headful: Las extensiones no funcionan en modo headless
- Servidor de desarrollo: Inicia automáticamente
start_test_server.ps1en puerto 8000 - Screenshots/videos: Se capturan automáticamente en fallos
- Traces: Se guardan en reintentos de tests fallidos
El archivo helpers/extension-helper.js proporciona utilidades reutilizables:
const {
launchBrowserWithExtension, // Inicia Chrome con la extensión cargada
openExtensionPopup, // Abre el popup de la extensión
clearExtensionStorage, // Limpia el storage para tests limpios
getSessionData, // Obtiene datos de la sesión actual
waitForStorageUpdate, // Espera a que se actualice el storage
takeScreenshotWithExtension, // Toma captura con la extensión
} = require('./helpers/extension-helper');const { test, expect } = require('@playwright/test');
const { launchBrowserWithExtension, openExtensionPopup } = require('./helpers/extension-helper');
test.describe('Mi Suite de Tests', () => {
let context, extensionId, popupPage;
test.beforeAll(async () => {
const result = await launchBrowserWithExtension();
context = result.context;
extensionId = result.extensionId;
});
test.beforeEach(async () => {
popupPage = await openExtensionPopup(context, extensionId);
});
test('mi test', async () => {
// Tu código de test aquí
await popupPage.fill('#bugName', 'Test Bug');
await popupPage.click('#addBug');
});
test.afterAll(async () => {
await context.close();
});
});- Usa
--headedpara ver el navegador - Usa
--debugpara pausar y depurar paso a paso - Usa UI Mode (
--ui) para una experiencia visual completa
Error: Extension ID not found
- Asegúrate de que
manifest.jsones válido - Verifica que la ruta de la extensión es correcta
- Comprueba que el service worker se carga correctamente
Tests lentos o timeouts
- Las extensiones son más lentas que páginas normales
- Aumenta timeouts si es necesario:
test.setTimeout(120000) - Los screenshots toman tiempo, ajusta
waitForStorageUpdate
El servidor no inicia
- Verifica que
start_test_server.ps1funciona manualmente - Asegúrate de que el puerto 8000 está libre
- Usa
reuseExistingServer: trueen desarrollo
Después de ejecutar tests, puedes ver el reporte HTML:
npm run test:e2e:reportEl reporte incluye:
- ✅ Tests pasados/fallados
- 📸 Screenshots de fallos
- 🎬 Videos de ejecución (en fallos)
- 📋 Traces para debugging
- ⏱️ Tiempos de ejecución
- Usa UI Mode durante desarrollo: Es la forma más rápida de iterar
- Tests pequeños y enfocados: Cada test debe probar una funcionalidad específica
- Limpia el estado: Usa
clearExtensionStorage()antes de cada test - Espera adecuadamente: Usa
waitForStorageUpdate()después de operaciones async - Selectores robustos: Prefiere IDs o data-testids sobre clases CSS