Ejemplo de implementación de login con Next.js y Playwright para testing.
- Formulario de login funcional
- Validación de credenciales en memoria (sin base de datos)
- Redirección al dashboard cuando el login es exitoso
- Alert cuando las credenciales son incorrectas
- Tests automatizados con Playwright
- Usuario:
admin/ Password:admin - Usuario:
jvh/ Password:jvh
app/
├── login/
│ └── page.tsx # Página de login
├── dashboard/
│ └── page.tsx # Dashboard (protegido)
└── api/
└── login/
└── route.ts # Endpoint de validación
tests/ # Tests de Playwright
├── pages/
│ ├── LoginPage.ts # Page Object para Login
│ └── DashboardPage.ts # Page Object para Dashboard
├── login.spec.ts # Tests básicos de Playwright
└── login2.spec.ts # Tests POM de Playwright
tests-selenium/ # Tests de Selenium
├── config/
│ └── setup.ts # Configuración de Selenium
├── helpers/
│ ├── testRunner.ts # Runner personalizado para tests
│ └── assertions.ts # Assertions helpers
├── pages/
│ ├── LoginPage.ts # Page Object para Login (Selenium)
│ └── DashboardPage.ts # Page Object para Dashboard (Selenium)
├── login-basic.test.ts # Tests básicos de Selenium
└── login-pom.test.ts # Tests POM de Selenium
docs/
└── POM-vs-Basic.md # Documentación comparativa
npm installIniciar el servidor de desarrollo:
npm run devAcceder a http://localhost:3000/login
El proyecto incluye tests implementados con dos frameworks: Playwright y Selenium WebDriver.
npm testnpm run test:uinpm run test:headednpx playwright show-reportNota: Los tests de Selenium se ejecutan en modo headless (sin mostrar el navegador) por defecto.
npm run test:seleniumnpm run test:selenium:basicnpm run test:selenium:pomPara ver el navegador mientras se ejecutan los tests, comenta la línea de headless en tests-selenium/config/setup.ts:
// options.addArguments('--headless=new'); // Comentar esta línea6 tests que cubren:
- ✅ Verificar que el formulario de login se muestra correctamente
- ✅ Login exitoso con admin/admin
- ✅ Login exitoso con jvh/jvh
- ✅ Login fallido con credenciales incorrectas
- ✅ Login fallido con usuario correcto pero password incorrecto
- ✅ Validación de campos vacíos
9 tests usando el patrón POM:
- ✅ Verificar que el formulario de login se muestra correctamente
- ✅ Login exitoso con admin/admin usando POM
- ✅ Login exitoso con jvh/jvh usando POM
- ✅ Login fallido con credenciales incorrectas usando POM
- ✅ Login fallido con usuario correcto pero password incorrecto usando POM
- ✅ Login fallido con password correcto pero usuario incorrecto usando POM
- ✅ Validación de campos vacíos usando POM
- ✅ Login con espacios en blanco usando POM
- ✅ Verificar sensibilidad a mayúsculas/minúsculas usando POM
Total Playwright: 15 tests
6 tests implementados con Selenium:
- ✅ Debe mostrar el formulario de login
- ✅ Login exitoso con admin/admin
- ✅ Login exitoso con jvh/jvh
- ✅ Login fallido con credenciales incorrectas
- ✅ Login fallido con usuario correcto pero password incorrecto
- ✅ Validación de campos vacíos
9 tests usando el patrón POM con Selenium:
- ✅ Debe mostrar el formulario de login correctamente
- ✅ Login exitoso con admin/admin usando POM
- ✅ Login exitoso con jvh/jvh usando POM
- ✅ Login fallido con credenciales incorrectas usando POM
- ✅ Login fallido con usuario correcto pero password incorrecto usando POM
- ✅ Login fallido con password correcto pero usuario incorrecto usando POM
- ✅ Validación de campos vacíos usando POM
- ✅ Login con espacios en blanco usando POM
- ✅ Verificar sensibilidad a mayúsculas/minúsculas usando POM
Total Selenium: 15 tests
🎯 TOTAL GENERAL: 30 tests pasando
El proyecto implementa el patrón Page Object Model para los tests, lo que proporciona:
- Mejor mantenibilidad: Los cambios en la UI solo requieren actualizar los Page Objects
- Reutilización de código: Los métodos de interacción se pueden reusar en múltiples tests
- Lectura clara: Los tests son más descriptivos y fáciles de entender
- Separación de responsabilidades: La lógica de interacción está separada de la lógica de testing
goto(): Navegar a la página de loginlogin(username, password): Hacer login con credencialesloginWithValidCredentials(user): Login rápido con usuarios válidosexpectLoginPageToBeVisible(): Verificar que la página de login está visiblesetupDialogHandler(message): Configurar handler para alerts- Y más métodos...
goto(): Navegar al dashboardexpectToBeOnDashboard(): Verificar que estamos en el dashboardexpectWelcomeMessageToBeVisible(): Verificar mensaje de bienvenida
Request:
{
"username": "admin",
"password": "admin"
}Response exitoso (200):
{
"success": true,
"message": "Login exitoso"
}Response fallido (401):
{
"success": false,
"message": "usuario no existe"
}