AI & MCP
Playwright MCP dan Test Agents (planner, generator, healer) untuk menjelajah, membuat test, dan memperbaikinya.
Dengan Playwright MCP, AI agent bisa membaca isi halaman dan mengklik, mengetik, atau pindah halaman sendiri, sehingga bisa menjelajah aplikasi sebelum menulis test.
AI agent dengan Playwright MCP seperti rekan tester baru yang cepat menjelajah aplikasi dan menulis draf test case. Kamu tetap reviewer-nya: cek apakah skenario dan expected result-nya benar.
Apa itu MCP?
Model Context Protocol adalah standar terbuka (dirintis Anthropic) yang menyamakan cara aplikasi AI tersambung ke tool dan data. Satu server MCP bisa dipakai banyak aplikasi AI.
memberi instruksi
Claude Code
navigate, click, snapshot
Playwright MCP membaca halaman lewat accessibility snapshot, bukan screenshot: daftar role dan nama setiap elemen, sama seperti yang dipakai get_by_role. Hasilnya lebih cepat, hemat, dan tepat.
Menginstall Playwright MCP
Kalau kamu memakai Claude Code, daftarkan Playwright MCP sekali di level user, supaya bisa dipakai di semua project:
# Windows: npx dibungkus `cmd /c` karena npx adalah script
claude mcp add playwright --scope user -- cmd /c npx -y @playwright/mcp@latest
# macOS dan Linux
claude mcp add playwright --scope user -- npx -y @playwright/mcp@latest
# Mengecek status
claude mcp list
claude mcp get playwright # cek Playwright MCP sudah terdaftarDi sesi Claude Code yang baru, AI otomatis punya tool seperti browser_navigate, browser_snapshot, browser_click, browser_type, browser_fill_form, browser_take_screenshot, dan browser_network_requests.
Server yang sama juga bisa dipakai di VS Code (GitHub Copilot), Cursor, Claude Desktop, dan lainnya, biasanya dengan pengaturan JSON seperti ini:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}Workflow 1: Eksplorasi aplikasi
Sebelum menulis test, minta AI berkeliling dulu dan membuat daftar skenario. Contoh prompt-nya:
Pakai Playwright MCP. Buka https://playground.aminhamzah.com/login-toko.html,
login sebagai customer / rahasia123, lalu jelajahi halaman toko.
Buat daftar skenario test yang penting (positif dan negatif) untuk fitur
pencarian, filter kategori, keranjang, dan checkout. Untuk setiap skenario
tulis: judul, langkah singkat, hasil yang diharapkan, dan prioritas (P1/P2/P3).
Jangan menulis kode dulu.Workflow 2: Membuat test yang berkualitas
Prompt yang bagus menyebut kondisi project dan aturan mainnya, termasuk perintah untuk mengecek hasilnya.
Pakai Playwright MCP untuk menjelajahi bagian "5. Konten dinamis" di
https://playground.aminhamzah.com/arena.html, lalu tulis test pytest baru di
tests/academy/test_m16_ai_generated.py.
Aturan:
- Ikuti gaya test yang sudah ada di tests/academy (baca dulu 2 contoh).
- Locator prioritas get_by_role / get_by_label; hindari CSS dan XPath.
- Pola Arrange, Act, Assert; nama test menjelaskan perilaku.
- Pakai expect(), DILARANG time.sleep / wait_for_timeout.
- Setelah menulis, jalankan `uv run pytest tests/academy/test_m16_ai_generated.py`
dan perbaiki sampai hijau. Tunjukkan hasil akhirnya.Pakai Playwright MCP untuk menjelajahi bagian "5. Konten dinamis" di
https://playground.aminhamzah.com/arena.html, lalu tulis test baru di
tests/academy/m16-ai-generated.spec.ts.
Aturan:
- Ikuti gaya test yang sudah ada di tests/academy (baca dulu 2 contoh).
- Locator prioritas getByRole / getByLabel; hindari CSS dan XPath.
- Pola Arrange, Act, Assert; nama test menjelaskan perilaku.
- Pakai web-first assertion, DILARANG waitForTimeout.
- Setelah menulis, jalankan `npx playwright test m16-ai-generated --project=chromium`
dan perbaiki sampai hijau. Tunjukkan hasil akhirnya.Contoh hasil yang pantas diterima setelah kamu periksa:
from playwright.sync_api import Page, expect # Page dan expect
ARENA = "/arena.html" # halaman latihan interaksi
def test_muat_data_menampilkan_tiga_laporan(page: Page) -> None: # nama test menjelaskan perilakunya
page.goto(ARENA) # buka Arena
page.get_by_role("button", name="Muat data").click() # data muncul 1,5 detik kemudian
expect(page.get_by_role("status").filter(has_text="Data berhasil dimuat")).to_be_visible() # pesan sukses terlihat
expect(page.get_by_test_id("loaded-list").get_by_role("listitem")).to_have_text( # isi daftar sesuai urutan
["Laporan Januari", "Laporan Februari", "Laporan Maret"]
)import { test, expect } from '@playwright/test'; // test dan expect
const ARENA = '/arena.html'; // halaman latihan interaksi
test('muat data menampilkan tiga laporan', async ({ page }) => { // nama test menjelaskan perilakunya
await page.goto(ARENA);
await page.getByRole('button', { name: 'Muat data' }).click(); // data muncul 1,5 detik kemudian
await expect(page.getByRole('status').filter({ hasText: 'Data berhasil dimuat' })).toBeVisible(); // pesan sukses terlihat
await expect(page.getByTestId('loaded-list').getByRole('listitem')).toHaveText([ // isi daftar sesuai urutan
'Laporan Januari', 'Laporan Februari', 'Laporan Maret',
]);
});Workflow 3: Self-healing (memperbaiki test yang rusak)
Saat tampilan berubah dan test jadi gagal, AI bisa membantu mencari penyebabnya:
Test `test_login_berhasil` di tests/academy/test_m10_pom.py gagal
setelah redesign. Ini pesan error-nya: <tempel error>.
Pakai Playwright MCP untuk membuka halaman login dan periksa struktur
terbarunya. Jelaskan PENYEBABNYA dulu, apakah bug aplikasi atau locator usang?
Kalau locator usang, perbaiki di page object (pages/login_page.py), BUKAN di test.
Jalankan ulang test dan tunjukkan diff-nya.Playwright Test Agents: planner, generator, healer
Sejak versi 1.56, Playwright punya tiga agent resmi: merencanakan, menulis, dan memperbaiki test. Masing-masing memakai MCP khusus Playwright Test, jadi bisa membuka browser, menjalankan test, dan membaca hasilnya.
| Agent | Tugasnya | Hasilnya |
|---|---|---|
| planner | Menjelajah aplikasi dan menyusun skenario test | Rencana test (Markdown) di specs/ |
| generator | Mengubah rencana jadi kode, sambil mengecek locator dan assertion langsung di browser | File test di tests/ |
| healer | Menjalankan test yang gagal, memeriksa halaman, lalu memperbaiki test | Perubahan kode test beserta penjelasannya |
Menginstall agent
cd playwright-typescript # masuk ke folder project
npx playwright init-agents --loop=claude # pasang agent planner, generator, dan healer untuk Claude CodePilihan --loop lainnya: codex, copilot, opencode, dan vscode. Perintah di atas membuat file-file berikut:
playwright-typescript/
├─ .claude/agents/
│ ├─ playwright-test-planner.md ← definisi agent untuk Claude Code
│ ├─ playwright-test-generator.md
│ └─ playwright-test-healer.md
├─ .mcp.json ← server MCP "playwright-test" (npx playwright run-test-mcp-server)
├─ specs/README.md ← tempat rencana test dalam Markdown
└─ tests/seed.spec.ts ← "seed test": kondisi awal yang dipakai agentSeed test memberi tahu agent harus mulai dari mana. Bawaannya kosong. Isi seperti contoh ini supaya agent mulai dari halaman login TokoQA:
Memuat tests/seed.spec.ts…
npx playwright test seed --project=chromiumAlur kerjanya di Claude Code
Buka sesi Claude Code di folder project-mu (supaya .claude/agents dan .mcp.json terbaca), lalu panggil agent satu per satu:
1. Pakai agent playwright-test-planner. Buat rencana test untuk fitur kupon di halaman
checkout TokoQA: kupon valid, kupon kedaluwarsa, kupon tidak ada, dan kupon yang belum
memenuhi minimal belanja. Simpan di specs/kupon.md.
2. Pakai agent playwright-test-generator. Ubah specs/kupon.md menjadi test di
tests/academy/kupon.spec.ts. Ikuti gaya test yang sudah ada dan pakai page object di pages/.
3. Pakai agent playwright-test-healer. Jalankan tests/academy/kupon.spec.ts dan perbaiki
test yang gagal. Jelaskan dulu penyebabnya sebelum mengubah kode.Untuk Python: Test Agents menghasilkan test TypeScript (Playwright Test). Tapi rencana dari planner berupa Markdown biasa, jadi tetap bisa dipakai. Minta planner menulis specs/kupon.md, lalu minta Claude Code (dengan Playwright MCP) menulis versi pytest-nya di folder tests/, mengikuti cara di Workflow 2 di atas.
Koreksi rencana di specs/ sebelum menjalankan generator. Satu baris skenario yang salah jauh lebih mudah diperbaiki daripada sepuluh test yang terlanjur dibuat darinya.
Aturan main saat dibantu AI
| Lakukan | Jangan |
|---|---|
| Periksa setiap baris kode yang dihasilkan | Langsung menerima kode apa adanya |
| Jalankan test, lalu pastikan test bisa gagal saat aplikasinya rusak | Percaya test hijau tanpa bukti |
| Berikan konteks: contoh test, aturan penulisan, struktur folder | Prompt satu kalimat "buatkan test" |
| Minta AI menjelaskan alasan perubahannya | Membiarkan AI "memperbaiki" dengan melonggarkan assertion |
| Pakai data dan akun latihan | Memberikan password produksi atau data pelanggan ke AI |
| Test akhirnya selalu memberi hasil yang sama, tanpa AI saat dijalankan | Test yang memanggil AI setiap kali dijalankan |
Kalau tombol "Bayar" hilang karena bug, AI bisa "memperbaiki" test dengan mengklik tombol lain, dan bug-nya lolos. Setiap perbaikan dari AI harus dicek: perubahan tampilan yang disengaja, atau bug?
Lebih jauh (opsional)Trik komunitas
- CLAUDE.md di root repository berisi aturan test timmu: struktur folder, aturan locator, dan perintah menjalankan test. Agent membacanya di setiap sesi, jadi kamu tidak perlu mengulang aturan yang sama di setiap prompt.
- Pilihan Playwright MCP:
--headlessuntuk jalan tanpa jendela,--isolatedsupaya profil browser tidak disimpan,--browseruntuk memilih browser. - "Copy prompt" di HTML report (Modul 12) adalah cara cepat menceritakan kegagalan test ke agent.
- Satu agent, satu tugas: pisahkan tahap menjelajah, menulis test, dan memperbaiki. Itulah ide di balik agent planner, generator, dan healer.
Latihan
Pastikan Playwright MCP tersedia
Di terminal folder project-mu (playwright-python atau playwright-typescript), tampilkan daftar MCP yang terdaftar di Claude Code.
Hasilplaywright muncul di daftar dengan status terhubung
claude mcp list # daftar MCP yang terdaftarKalau playwright belum ada, daftarkan dengan perintah di bagian "Menginstall Playwright MCP" di atas, lalu buka sesi Claude Code yang baru.
Minta AI menjelajah TokoQA
Jalankan prompt Workflow 1 untuk TokoQA, simpan daftar skenarionya, lalu tandai mana yang sudah ada di project-mu dan mana yang baru.
Hasilminimal 8 skenario, termasuk untuk peran customer dan admin
Daftar yang bagus biasanya mencakup: login berhasil dan gagal, akun terkunci, pencarian dan filter, produk stok habis, keranjang, kupon (valid, kedaluwarsa, tidak memenuhi syarat), checkout dan validasinya, status pesanan di Pesanan saya, admin mengubah status pesanan, dan customer ditolak di dashboard admin.
Kalau daftar dari AI tidak menyebut perbedaan customer dan admin, minta ia menjelajah lagi dengan kedua akun.
Minta AI menulis test dengan network mocking
Jalankan prompt Workflow 2 untuk jurus "14. Data dari API" di Arena, termasuk satu test dengan network mocking. Periksa hasilnya dengan tabel aturan main di atas.
Hasiltest memakai page.route, tanpa sleep, dan lulus
Salah satu contoh test yang benar (sama dengan latihan Modul 13):
Memuat tests/latihan/test_m13_latihan.py…
Memuat tests/latihan/m13-latihan.spec.ts…
Tolak hasil AI yang memakai wait_for_timeout, locator CSS panjang, atau tidak punya assertion untuk hasilnya.
Buktikan test buatan AI bisa gagal
Ubah sementara data mock menjadi {"total": 1, "data": [{"id": 1, "name": "Keyboard Mekanik", "price": 750000}]}, jalankan test-nya, lalu kembalikan.
Hasiltest gagal saat data mock diubah, lalu lulus lagi setelah dikembalikan
Kalau test tetap lulus walaupun data mock diubah, berarti assertion-nya terlalu longgar (misalnya hanya mengecek elemennya terlihat). Perketat dengan to_have_text("0 produk") / toHaveText('0 produk').