🎯 0/7 · ⭐ 0/2
1 / 17
← → navegar · N notas presentador · F pantalla completa · click en comandos = copiar
🎙 Notas del presentador
Lab práctico · QA Engineering

Dojo Lab I 🥷

Hoy no hay simuladores. Hoy tu código controla un navegador real contra una app real.
De cero a 5 tests verdes en tu máquina.

7 misiones 🎯codegenUI modetrace viewerdojo.upexgalaxy.com

Sesión 3 de la serie, formato LAB: ellos trabajan, tú guías. Prerrequisitos: Coding Base + Coding Classes vistos, laptop con permisos de instalación, internet. Ritmo sugerido: misiones 1-2 todos juntos (setup es donde más se atascan), 3-5 guiadas, 6-7 semi-libres con apoyo. Duración realista: 2-3 horas con pausas.

Reglas del juego

Así funciona un lab de misiones

🎯

7 misiones

Cada una con objetivo, comandos copiables (click = copiar 📋) y criterio de éxito verificable — sabrás exactamente cuándo la lograste.

Marca tu progreso

Checkbox en cada misión. Se guarda en tu navegador: cierra y vuelve cuando quieras, tu avance sigue ahí.

💡

Pistas colapsables

Atáscate primero, pide pista después. El atasco es parte del entrenamiento — en el trabajo real no hay slide con la respuesta.

⌨️

Laptop abierta

Esto NO es para mirar. Cada misión se hace en TU terminal y TU editor, en paralelo.

🐢

Ritmo propio

Nadie se queda atrás: el archivo es tuyo para siempre. Lo que no termines hoy, lo terminas en casa.

📚

Prerrequisitos

Coding Base ✓ y Coding Classes ✓ (o saber: variables, funciones, async/await, clases). Sin eso, primero esos decks.

Establece el contrato del lab: trabajo activo, pistas solo tras intentar, criterio de éxito como juez (no tu opinión). El checkbox persistente baja la ansiedad de los lentos. Pide a todos abrir terminal AHORA — la transición mental de "ver slides" a "trabajar" ocurre en este momento.

El campo de entrenamiento

Conoce tu dojo 🏯

🌐 dojo.upexgalaxy.com

App real construida A PROPÓSITO para práctica de QA automation. Rompe lo que quieras — para eso existe.

Login / Registro24 componentes UIDashboard kanbanAPI + docs

🔑 Credenciales demo

email: testuser@upex.dev
password: Test123!

También puedes registrar tu propio usuario — eso será uno de tus tests.

🧭

Regla de oro del lab: los códigos de ejemplo en estas slides muestran la FORMA correcta. Los selectores exactos de cada elemento los descubres TÚ con codegen y el inspector — así funciona el trabajo real: nadie te regala los selectores.

🗺️ Tu plan de vuelo

M1-M2 → kit + proyecto
M3-M4 → grabar y ejecutar tu primer test
M5 → romper y diagnosticar
M6 → 4 specs a mano
M7 → 🏆 suite completa verde

Navega el dojo en vivo 2 minutos: login con las credenciales demo, muestra el dashboard y la página de componentes. La regla de oro es el seguro anti-frustración: si un selector de las slides no coincide exacto con la app, ESO es lo esperado — descubrirlos es la habilidad que entrena este lab. Valida antes de la clase que el dojo esté arriba.

MISIÓN 1

Instala el kit del oficio

🎯 Tener Node.js (el motor que ejecuta JavaScript fuera del navegador) y VS Code (tu editor) funcionando.

1. Descarga e instala (versión LTS / estable):

nodejs.org → Node.js LTS  ·  code.visualstudio.com → VS Code

2. Abre una terminal y verifica:

$node --version📋 click = copiar
$npm --version📋
$ node --version
v22.16.0   ← cualquier v18+ sirve
$ npm --version
10.9.2
Pista: "command not found"

Cierra y reabre la terminal después de instalar (la terminal vieja no conoce programas nuevos). En Windows: usa la terminal de VS Code o PowerShell, no CMD viejo.

Criterio de éxito: ambos comandos responden con un número de versión (Node v18 o superior).

La misión más aburrida y la más traicionera: permisos de admin, antivirus corporativo, terminal sin refrescar. No avances hasta que TODOS tengan las dos versiones en pantalla. Explica qué es Node en una frase: "el motor que ejecuta JavaScript fuera del navegador — Playwright corre sobre él". npm viene incluido con Node.

MISIÓN 2

Crea tu proyecto Playwright

🎯 Generar el proyecto completo con el instalador oficial y ver los tests de ejemplo pasar en verde.
$npm init playwright@latest mi-dojo-lab📋

El asistente pregunta — responde así:

¿TypeScript o JavaScript?TypeScript
¿Carpeta de tests?tests (default)
¿GitHub Actions workflow?false (hoy no)
¿Instalar browsers?true ✓ (tarda unos minutos)

Entra al proyecto y ejecuta los tests de ejemplo:

$cd mi-dojo-lab📋
$npx playwright test📋
Running 6 tests using 4 workers

  6 passed (8.3s)
Pista: ¿qué acaba de pasar?

Corriste 6 tests de ejemplo (incluidos en el proyecto) contra playwright.dev en 3 navegadores — SIN abrir ninguna ventana. Playwright corre headless (invisible) por defecto: por eso es tan rápido.

Criterio de éxito: npx playwright test termina con 6 passed.

npm init playwright = instalador oficial: descarga Playwright + navegadores (Chromium/Firefox/WebKit propios — no usa tu Chrome). La descarga de browsers tarda: lanza el comando y aprovecha para explicar mientras instala. El "6 passed" sin ventanas visibles sorprende — anticipa la explicación headless de la pista.

Reconocimiento del terreno

Tour del proyecto: ya conoces todo esto

mi-dojo-lab/
├─ package.json ← la "cédula" (Coding Base, slide 32)
├─ playwright.config.ts ← browsers, baseURL, timeouts
├─ node_modules/ ← herramientas instaladas (no se toca)
├─ tests/
│  └─ example.spec.ts ← ⭐ ábrelo en VS Code AHORA
└─ tests-examples/ ← demo más grande (de lectura)
tests/example.spec.ts
import { test, expect } from "@playwright/test";

test("has title", async ({ page }) => {
  await page.goto("https://playwright.dev/");
  await expect(page).toHaveTitle(/Playwright/);
});

Inventario de lo que reconoces: importtest()async ({ page })awaitexpect ✓ — cero sorpresas. Las dos sesiones anteriores fueron exactamente para este momento.

Momento de cosecha: el árbol es el de Coding Base slide 32 y el spec se lee completo con lo aprendido. Pide a alguien que LEA el example.spec.ts en voz alta explicando cada línea — validación pública de que las bases están. Menciona playwright.config.ts sin profundizar: "ahí viven los 3 browsers del 6 passed; lo exploramos en Playwright Pro".

MISIÓN 3

Graba tu primer test con codegen

🎯 Usar la grabadora oficial: tú haces click en el dojo, Playwright escribe el código por ti.
$npx playwright codegen https://dojo.upexgalaxy.com📋

Se abren DOS ventanas: el navegador y el inspector (donde aparece el código en vivo). Ahora, en el navegador:

1. Navega al login
2. Escribe email y password demo
3. Click en el botón de entrar
4. Mira el inspector: 👀 el código se escribió solo

5. Copia el código grabado a un archivo nuevo:

tests/login.spec.ts — créalo en VS Code y pega adentro de un test("login", async ({ page }) => { ... }) si codegen no lo envolvió ya.

Pista: el inspector no muestra código

Verifica que el panel "Record" esté activo (botón rojo). Si cerraste el inspector por accidente: cierra todo y relanza el comando.

⚠️

Codegen es un borrador, no un producto. Graba TODO lo que haces (incluso clicks accidentales) y no agrega aserciones inteligentes. La próxima slide: limpiarlo.

Criterio de éxito: tienes tests/login.spec.ts con el flujo de login grabado por codegen.

El momento mágico del lab: ven su click convertirse en código instantáneamente. Deja que graben libremente 3-4 minutos. Codegen además SUGIERE los buenos locators (getByLabel, getByRole) — fíjate cómo los eligió y úsalo en la siguiente slide. Anticipa la limpieza: nadie entrega código grabado tal cual.

Del borrador al test digno

Limpia la grabación — y agrégale el expect

❌ Lo que graba codegen (borrador)
await page.goto("https://dojo.upexgalaxy.com/");
await page.getByRole("link", { name: "Login" }).click();
await page.getByLabel("Email").click();   ← click inútil
await page.getByLabel("Email").fill("testuser@upex.dev");
await page.getByLabel("Password").click(); ← otro
await page.getByLabel("Password").fill("Test123!");
await page.getByRole("button", { name: "Sign in" }).click();
// ...y AQUÍ TERMINA. ¿Dónde está la verificación? 😱
✅ Tu versión limpia (con aserción)
test("login exitoso en el dojo", async ({ page }) => {
  await page.goto("https://dojo.upexgalaxy.com/login");
  await page.getByLabel("Email").fill("testuser@upex.dev");
  await page.getByLabel("Password").fill("Test123!");
  await page.getByRole("button", { name: /sign in/i }).click();

  await expect(page).toHaveURL(/dashboard/);
});

Limpieza: clicks inútiles fuera, goto directo al login, y el expect que codegen nunca escribe — sin aserción no hay test, hay paseo.

Regla profesional: codegen para descubrir locators y esqueleto, humano para intención y aserciones. Nota los locators getByLabel/getByRole que codegen eligió — son los modernos (semánticos, estables); mejor que #ids del simulador de decks anteriores: la app puede cambiar ids, pero "el botón que dice Sign in" es estable. Recuerda la regla de oro: si los textos exactos del dojo difieren, ajustan con lo que codegen grabó — eso ES el ejercicio.

MISIÓN 4

Córrelo con tus propios ojos

🎯 Ejecutar tu login.spec.ts viendo el navegador moverse, y conocer el UI mode — tu centro de control.

1. Con navegador visible (headed):

$npx playwright test login --headed📋

2. El modo que vas a AMAR — UI mode:

$npx playwright test --ui📋

🕹️ En UI mode prueba esto

▶ Corre tu test desde la lista
⏱️ Click en cada paso de la línea de tiempo: viaje en el tiempo — ves la página ANTES y DESPUÉS de cada acción
🔍 Pestaña "Locator": pasa el mouse sobre la página y te dice el locator de cada elemento

Pista: "login" no corre nada

npx playwright test login filtra por nombre de archivo. Verifica que tu archivo se llame login.spec.ts y esté dentro de tests/.

Criterio de éxito: viste el navegador hacer login solo, y en UI mode recorriste la línea de tiempo paso a paso.

Headed produce la foto del lab: el navegador llenando el formulario solo — el momento que vinieron a buscar. UI mode es la herramienta de trabajo diaria #1: time-travel + locator picker (esa pestaña les resuelve "¿qué selector uso?" para la misión 6). Déjalos jugar 5 minutos: cada minuto en UI mode hoy ahorra horas después.

MISIÓN 5

Rómpelo a propósito y diagnostica

🎯 Provocar un fallo controlado, leer el error sin pánico y usar el trace viewer para ver la "caja negra" del accidente.

1. En tu login.spec.ts cambia la password a "incorrecta"
2. Corre con la caja negra activada:

$npx playwright test login --trace on📋

3. Falla (esperado ✓). Abre el reporte y el trace:

$npx playwright show-report📋
   login.spec.ts:3 › login exitoso

  Error: expect(page).toHaveURL(/dashboard/)
  Expected pattern: /dashboard/
  Received string:  "…/login"  ← se quedó en login
    at login.spec.ts:9:24

En el reporte, click en el test rojo → Trace: línea de tiempo con screenshots de cada paso, red, consola. La caja negra completa del fallo.

Pista: leer el error como detective

Tres preguntas SIEMPRE: ¿qué esperaba? (Expected) ¿qué encontró? (Received) ¿en qué línea? (at …). El error de Playwright es un reporte de bug bien escrito — tu oficio es leerlos.

Criterio de éxito: encontraste en el trace el screenshot del momento del fallo (la página que se quedó en login). Restaura la password buena y vuelve a verde antes de seguir.

Misión anti-miedo: el rojo es información, no fracaso. El test "falló" porque ENCONTRÓ algo — login con password mala no llega al dashboard: ¡el test funciona! Distinción importante a sembrar: este fallo es "test correcto detectando comportamiento esperado del sistema" — en el trabajo real distinguirán bug real vs test mal escrito con estas mismas herramientas. No olviden restaurar la password.

⭐ QUIZ 1 · Leer errores

Tu test falla con: TimeoutError: waiting for getByLabel("Email") — ¿qué significa?

💡 TimeoutError en un locator casi siempre = "busqué y no existe (con ese nombre, en esta página)". Primer reflejo: abrir UI mode o trace y MIRAR qué página había y cómo se llama el elemento realmente. Subir el timeout (opción C) solo hace que el error tarde más en aparecer — es esconder el problema bajo la alfombra.

La opción C es la mala práctica más común de los juniors: timeout arriba y a rezar. Mata esa intuición HOY: timeout largo no arregla locators rotos. El reflejo correcto: trace/UI mode → mirar la página real → corregir el locator. La opción A enseña a no escalar sin diagnosticar.

MISIÓN 6

Escribe 4 specs a mano

🎯 Sin codegen esta vez (úsalo solo para consultar locators): escribe tú el código. Un archivo por funcionalidad.
SpecPasos (Act)Aserción mínima (Assert)
1 · login-invalid.spec.tsLogin con password malaEl mensaje de error es visible
2 · register.spec.tsRegistra un usuario nuevo (email único: usa Date.now())Llegas logueado o ves confirmación
3 · navigation.spec.tsDesde el home, navega a la página de componentesLa URL y el título cambian
4 · components.spec.tsInteractúa con un componente (checkbox, select…)El estado del componente cambió
Pista: email único para el registro
const email = `tester${Date.now()}@upex.dev`;

Date.now() = milisegundos actuales → cada corrida genera un email distinto y el test es repetible. Tu primer truco de test data dinámica.

Criterio de éxito: 4 archivos nuevos en tests/, cada uno verde individualmente: npx playwright test <nombre>.

El corazón del lab — 40-60 minutos de trabajo semi-libre. Tu rol: circular y destrabar. Atascos típicos: locator no encontrado (→ UI mode pestaña Locator), olvido de await (→ ya saben diagnosticarlo), registro falla en segunda corrida (→ pista del email único — además es la primera vez que NECESITAN test data dinámica, concepto de oro). Quien termine rápido: spec extra de logout.

La forma de todo test digno

Patrón AAA — tu brújula para la Misión 6

test("login inválido muestra error", async ({ page }) => {
  // 1. ARRANGE — prepara el escenario
  await page.goto("https://dojo.upexgalaxy.com/login");

  // 2. ACT — ejecuta la acción bajo prueba
  await page.getByLabel("Email").fill("testuser@upex.dev");
  await page.getByLabel("Password").fill("incorrecta");
  await page.getByRole("button", { name: /sign in/i }).click();

  // 3. ASSERT — verifica el resultado esperado
  await expect(page.getByText(/invalid|incorrect/i)).toBeVisible();
});

🎬 Arrange

Precondiciones de tu test case manual: "estando en la página de login…"

⚡ Act

Los pasos. UNA acción principal bajo prueba por test.

🔍 Assert

El resultado esperado. Test sin expect no es test — es paseo.

AAA = la estructura de su test case manual con otros nombres: precondiciones / pasos / resultado esperado. Los comentarios del ejemplo son didácticos — en código real la estructura se nota sola con líneas en blanco. Regla "una acción principal por test": si el título lleva un "y" (prueba esto Y aquello), son dos tests.

Sabiduría destilada

Tips de supervivencia 🧰

Nunca uses sleep

Playwright espera solo a que los elementos aparezcan (auto-wait). waitForTimeout(5000) = test lento Y flaky. Si crees necesitarlo, falta un expect intermedio.

🎯

getByRole > selectores CSS

getByRole("button", { name: "Sign in" }) sobrevive rediseños; .btn-primary > div:nth-child(2) muere mañana. Locators semánticos = mantenimiento barato.

1️⃣

Un test, un objetivo

Título describe UN comportamiento verificable. Si necesitas "y" en el título, divide en dos tests.

🔁

Corre en cada cambio

Escribe 3 líneas → corre. Feedback inmediato = errores chicos y fáciles. Escribir 50 líneas sin correr = arqueología de bugs.

Cuatro hábitos que separan juniors de profesionales desde el día 1. El anti-sleep es el más importante: auto-wait es LA ventaja de Playwright sobre Selenium viejo; cada waitForTimeout es una confesión de no entender qué se espera. getByRole conecta con la limpieza de codegen (slide 8). Imprime estos 4 en la memoria antes del trabajo libre de M6.

MISIÓN 7 · BOSS 🏆

Suite completa en verde + reporte

🎯 Tus 5 specs (login + los 4 de la M6) corriendo juntos como suite, y el reporte HTML como evidencia.
$npx playwright test📋
$npx playwright show-report📋
Running 15 tests using 4 workers
  5 specs × 3 browsers

  15 passed (31.2s)   🎉

📊 En el reporte HTML explora

✅ Lista de tests por browser (¡corrieron en 3!)
⏱️ Duración de cada test
📷 Click en cualquiera → pasos detallados
Este reporte es lo que un QA Engineer adjunta como evidencia de ejecución

Pista: uno falla solo en WebKit/Firefox

Bienvenida/o a los bugs cross-browser — los mismos pasos, distinto motor. Mira el trace de ESE browser. Si no lo resuelves hoy, anótalo: es exactamente el tipo de hallazgo que un QA reporta.

Criterio de éxito: reporte HTML mostrando tu suite completa en verde (15 passed = 5 specs × 3 browsers).

El boss revela el multiplicador: escribieron 5 tests, corrieron 15 — 3 browsers gratis (config por defecto). Eso manual serían horas; aquí 30 segundos. El reporte HTML es presentable a un lead tal cual: así se ve la evidencia profesional. Si aparece fallo cross-browser real, celébralo: hallazgo legítimo en su primer día.

⭐ QUIZ 2 · El integrador

Tu suite pasó 15/15 hoy. Mañana corre de nuevo SIN cambios de código… y un test falla. ¿Primera hipótesis profesional?

💡 Test que falla sin cambios de código = señal de que algo SÍ cambió en otra parte: deploy de la app, datos de prueba consumidos (¿tu registro reusó un email?), timing de red. El trace te dice cuál. Si va y viene sin causa, se llama flaky — y diagnosticarlos es una habilidad estrella del QA Engineer (la entrenarás en Playwright Pro).

Mentalidad final del lab: el rojo intermitente no se ignora ni se borra — se diagnostica con evidencia (trace). La opción B es la tentación real en equipos con prisa: tests borrados = cobertura perdida en silencio. Anticipa que Playwright Pro ataca flakiness de frente con hooks y datos aislados.

Debrief

Misiones completadas

🏠

Tarea

Termina las misiones pendientes — tu progreso quedó guardado en este archivo.

Reto extra

Spec de logout + spec del kanban del dashboard (drag & drop: investígalo).

🚀

Próxima parada

Playwright Pro: hooks, fixtures, tu LoginPage (POM) conectada a tests reales, y API testing contra el dojo.

Lee el tablero de misiones en voz alta y celebra el progreso real (no todos llegan a 7/7 hoy — está diseñado así; el archivo persiste su avance). Logro de hoy en una frase: instalaron su entorno profesional y escribieron su primera suite real multi-browser contra una app de verdad. Recoge atascos comunes para ajustar la próxima sesión. Anuncia Playwright Pro: ahí el Page Object de Coding Classes conoce a Playwright real.