Cargando...
Cargando...
Misión 1 · en curso
Un test automatizado es una receta que el computador sigue solo: abre la página, mira la pantalla y dice “está bien” o “está mal”. Tú escribes la receta una vez y el robot la repite las veces que quieras, sin cansarse.
Tu tarea: Completa el test para que verifique que en la pantalla aparece el título “Iniciar sesión”.
Lo nuevo de esta misión
test('nombre', async ({ page }) => { … })await page.goto(url)page.getByRole('heading', { name: '…' })await expect(…).toBeVisible()Atajo: Ctrl/⌘ + Enter ejecuta. Tu código se guarda solo.
$ npx playwright test
Aprieta “Ejecutar test” para ver el resultado aquí.Llévalo a tu computador
La tienda de la práctica está publicada en www.causprosolutions.cl/fruteria-demo. Todo lo que escribiste funciona igual en un proyecto real, y el test de la misión 5 también va a fallar allá: el bug es de la tienda, no del simulador.
Descarga la versión LTS desde nodejs.org e instálala. Para comprobar, abre una terminal y escribe:
node -v
En una carpeta nueva ejecuta el instalador. Elige TypeScript, deja la carpeta tests y responde que no a GitHub Actions (eso viene en el paso 2).
npm init playwright@latest
Crea el archivo tests/tienda.spec.ts con tus misiones. Si no terminaste alguna, se usa la solución de referencia.
import { test, expect } from '@playwright/test';
test.describe('Misión 1 · Tu primer test', () => {
test('la página de login abre', async ({ page }) => {
await page.goto('https://www.causprosolutions.cl/fruteria-demo');
await expect(page.getByRole('heading', { name: 'Iniciar sesión' })).toBeVisible();
});
});
test.describe('Misión 2 · Escribir y hacer clic', () => {
test('iniciar sesión con datos correctos', async ({ page }) => {
await page.goto('https://www.causprosolutions.cl/fruteria-demo');
await page.getByLabel('Correo').fill('ana@fruteria.test');
await page.getByLabel('Contraseña').fill('fruta123');
await page.getByRole('button', { name: 'Entrar' }).click();
await expect(page.getByRole('heading', { name: 'Catálogo' })).toBeVisible();
});
});
test.describe('Misión 3 · El caso negativo', () => {
test('no deja entrar con contraseña incorrecta', async ({ page }) => {
await page.goto('https://www.causprosolutions.cl/fruteria-demo');
await page.getByLabel('Correo').fill('ana@fruteria.test');
await page.getByLabel('Contraseña').fill('clave-mala');
await page.getByRole('button', { name: 'Entrar' }).click();
await expect(page.getByText('Correo o contraseña incorrectos')).toBeVisible();
await expect(page.getByRole('heading', { name: 'Catálogo' })).not.toBeVisible();
});
});
test.describe('Misión 4 · Cuando hay muchos iguales', () => {
test('agregar una manzana al carrito', async ({ page }) => {
await page.goto('https://www.causprosolutions.cl/fruteria-demo');
await page.getByLabel('Correo').fill('ana@fruteria.test');
await page.getByLabel('Contraseña').fill('fruta123');
await page.getByRole('button', { name: 'Entrar' }).click();
const manzana = page.getByRole('listitem').filter({ hasText: 'Manzana Fuji' });
await manzana.getByRole('button', { name: 'Agregar' }).click();
await expect(page.getByTestId('carrito-cantidad')).toHaveText('1');
});
});
test.describe('Misión 5 · Un test que encuentra un bug', () => {
test('el total multiplica por la cantidad', async ({ page }) => {
await page.goto('https://www.causprosolutions.cl/fruteria-demo');
await page.getByLabel('Correo').fill('ana@fruteria.test');
await page.getByLabel('Contraseña').fill('fruta123');
await page.getByRole('button', { name: 'Entrar' }).click();
const manzana = page.getByRole('listitem').filter({ hasText: 'Manzana Fuji' });
await manzana.getByRole('button', { name: 'Agregar' }).click();
await manzana.getByRole('button', { name: 'Agregar' }).click();
await expect(page.getByTestId('carrito-cantidad')).toHaveText('2');
await expect(page.getByTestId('carrito-total')).toHaveText('$2.400');
});
});
test.describe('Misión 6 · No repetirse: beforeEach', () => {
test.beforeEach(async ({ page }) => {
await page.goto('https://www.causprosolutions.cl/fruteria-demo');
await page.getByLabel('Correo').fill('ana@fruteria.test');
await page.getByLabel('Contraseña').fill('fruta123');
await page.getByRole('button', { name: 'Entrar' }).click();
});
test('buscar una fruta que existe', async ({ page }) => {
await page.getByRole('searchbox').fill('Plátano');
await expect(page.getByRole('listitem')).toHaveCount(1);
});
test('buscar una fruta que no existe', async ({ page }) => {
await page.getByRole('searchbox').fill('kiwi');
await expect(page.getByText('No encontramos frutas')).toBeVisible();
});
});
El modo UI muestra cada paso, igual que aquí. Sin --ui corren en segundo plano y después abres el reporte.
npx playwright test --ui npx playwright test npx playwright show-report