@e2e-test-writerLe journey-tester — Playwright robuste, zero flake
Maifady est un plugin Claude Code 100% gratuit avec 30 agents IA — @e2e-test-writer écrit des tests E2E Playwright qui ne flake pas : locators sémantiques (getByRole, getByLabel), auto-waiting natif, network mocks, cleanup automatique. Tu décris le user journey, il livre le test prêt à committer.
Le problème qu'il résout
Tu viens de finir le flow "signup → vérif email → onboarding". Tu sais qu'il faut un test E2E qui le valide en CI à chaque commit — sinon dans 2 mois quelqu'un cassera un détail et personne ne le verra avant le support client. Mais les tests E2E sont notoirement flaky — ils marchent localement puis pètent aléatoirement en CI à cause d'un setTimeout(500) trop court.
@e2e-test-writer écrit des tests robustes par construction : pas de timeout hardcodé, locators stables, network mocks pour les API externes.
Comment il bosse
- Tu décris le journey étape par étape.
- Il détecte Playwright (ou Cypress legacy) et lit les tests existants pour reprendre les conventions.
- Il choisit des locators sémantiques :
getByRole>getByLabel>getByText>getByTestId. Jamais de sélecteurs CSS sur les classes générées. - Il utilise l'auto-waiting de Playwright (
expect()attend tout seul). AucunsetTimeout. - Il ajoute
beforeEachsetup (login, seed) etafterEachcleanup (delete test user). - Pour les API externes lentes, il propose des mocks via
page.route().
Exemple concret
Tu tapes
›@e2e-test-writer écris un test Playwright pour le journey : 1. /signup → fill email + password → submit 2. Vérifie page de confirmation 3. Simule clic email (API /test/last-email) 4. /onboarding → fill profile → submit 5. Vérifie /dashboard avec "Welcome <name>"
Tu obtiens (extrait)
import { test, expect } from '@playwright/test';
test.describe('Signup to dashboard journey', () => {
let userEmail: string;
test.beforeEach(async () => {
userEmail = `test-${Date.now()}@example.com`;
});
test('user can sign up, verify email, and complete onboarding', async ({ page, request }) => {
await page.goto('/signup');
await page.getByLabel('Email').fill(userEmail);
await page.getByLabel('Password').fill('StrongPass123!');
await page.getByRole('button', { name: 'Sign up' }).click();
await expect(page.getByText('Check your email')).toBeVisible();
const lastEmail = await request.get('/test/last-email');
const verifyUrl = (await lastEmail.json()).links[0];
await page.goto(verifyUrl);
await expect(page).toHaveURL(/\/onboarding/);
await page.getByLabel('Your name').fill('Alice');
await page.getByRole('button', { name: 'Continue' }).click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page.getByText('Welcome Alice')).toBeVisible();
});
test.afterEach(async ({ request }) => {
await request.delete(`/test/users?email=${userEmail}`);
});
});
Pourquoi tu vas l'aimer
Locators sémantiques
getByRole('button', { name: 'Submit' }) survit aux refactors. Pas de #submit-btn-3 qui pète.
Zero setTimeout
Auto-waiting natif de Playwright. Les tests attendent automatiquement le bon état.
Cleanup automatique
afterEach qui delete le test user. Pas de pollution entre tests.
Network mocks
Stripe, SendGrid, Anthropic — mocks via page.route(). Tests rapides, isolés.
Quand l'utiliser
✅ Idéal pour
- User journeys critiques (signup, paiement, onboarding)
- Régression sur un flow qui a déjà cassé une fois
- Sanity check avant chaque release
- Smoke tests en CI
⚠️ Pas adapté quand
- Logique pure sans UI → @test-generator
- Audit accessibilité → @accessibility-auditor
- Test de charge / performance — pas son but
Combine avec ces agents
Questions fréquentes
Pourquoi Playwright et pas Cypress ?
Playwright est le standard de fait pour 2024+ : cross-browser natif, auto-waiting plus fiable, support multi-tab. L'agent supporte aussi Cypress sur les projets legacy.
Que sont les locators sémantiques ?
getByRole('button', { name: 'Sign up' }) au lieu de #signup-btn. Survit aux refactors de classes CSS, fonctionne avec les screen readers, plus stable.
Et pour les emails de test ?
L'agent te demande de préciser ton outil (mailpit, mailcatcher, ou ton propre endpoint /test/last-email). Sans ça, impossible de tester les liens de vérification.