Playwright Academy
0 dari 17
Fase 2 · Jurus IntiModul 8 dari 17

Codegen

Merekam gerakanmu jadi kode, lalu merapikannya jadi test yang layak, termasuk memanfaatkan data-testid.

Codegen merekam klik dan ketikanmu menjadi kode. Hasilnya bahan mentah: buang gerakan yang tidak perlu, tambahkan assertion, lalu rapikan menjadi test.

Di dunia QA

Codegen seperti merekam layar saat testing manual. Rekamannya membantu, tapi belum bisa langsung jadi test case: kamu masih perlu memotong langkah yang tidak perlu dan menulis expected result-nya.

Menjalankan codegen

Di terminal folder project-mu:

uv run playwright codegen --target python-pytest https://playground.aminhamzah.com/login-toko.html  # rekam aksi, kodenya dalam format pytest
npx playwright codegen https://playground.aminhamzah.com/login-toko.html  # rekam aksi, kodenya dalam format Playwright Test

Akan muncul dua jendela:

  1. Browser: tempat kamu mengklik dan mengetik seperti biasa.
  2. Playwright Inspector: kodenya langsung muncul di sini, mengikuti setiap gerakanmu.

Seperti apa di layar

Empat screenshot ini diambil dari codegen sungguhan di TokoQA. Tooltip-nya memakai gaya Python karena target rekamannya python-pytest. Kalau kamu memilih TypeScript, isinya getByRole(...).

Halaman login TokoQA dengan toolbar perekam codegen di tengah atas
1. Toolbar perekam munculDi tengah atas halaman ada tombol Record (merah), Pick locator, Assert visibility, Assert text, Assert value, dan Assert snapshot. Selama Record aktif, setiap klik dan ketikan dicatat.
Kolom Username diberi kotak merah dengan tooltip get_by_role textbox name Username
2. Arahkan kursor sebelum klikElemen di bawah kursor diberi kotak, dan tooltip-nya menunjukkan locator yang akan ditulis. Di sini codegen memilih role dan nama, locator yang paling dianjurkan.
Dialog Assert that element contains text berisi Halo, Rina Wulandari
3. Tambah assertion dengan Assert textKlik ikon "ab", lalu klik sapaan. Codegen bertanya teks apa yang harus ada. Tekan tanda centang, dan baris expect masuk ke kode.
Tombol tambah ke keranjang Mouse Wireless dengan tooltip locator yang memuat teks rating
4. Periksa locator sebelum dipakaiPick locator di tombol tambah Mouse Wireless menghasilkan locator yang ikut menyimpan teks rating "★4,". Begitu ada ulasan baru, locator ini rusak. Saat merapikan, ganti dengan filter(has_text="Mouse Wireless").

Tombol penting di Inspector

TombolGunanya
RecordMulai atau berhenti merekam
Pick locatorArahkan kursor ke elemen, Inspector menunjukkan locator terbaiknya
Assert visibilityKlik elemen untuk menambah assertion "elemen ini terlihat"
Assert textKlik elemen untuk menambah assertion teks
Assert valueKlik kolom isian untuk menambah assertion isinya
CopySalin semua kodenya
TargetPilih bahasa hasil rekaman (Python pytest, TypeScript, dan lainnya)

Hasil rekaman yang masih mentah

Contoh rekaman login lalu menambahkan Mouse Wireless ke keranjang:

import re  # alat pencocok teks (diimpor codegen, belum tentu dipakai)
from playwright.sync_api import Page, expect  # Page dan expect


def test_example(page: Page) -> None:  # nama test bawaan codegen, sebaiknya diganti
    page.goto("https://playground.aminhamzah.com/login-toko.html")  # URL lengkap: ganti dengan path supaya memakai base URL
    page.get_by_role("textbox", name="Username").click()  # klik ini tidak perlu, fill sudah memfokuskan kolom
    page.get_by_role("textbox", name="Username").fill("customer")  # isi Username
    page.get_by_role("textbox", name="Username").press("Tab")  # tekan Tab: juga tidak perlu
    page.get_by_label("Password").fill("rahasia123")  # isi Password
    page.get_by_test_id("login-button").click()  # klik Masuk lewat test id
    page.get_by_test_id("product-card").filter(has_text="Mouse Wireless").get_by_role("button").click()  # tambah Mouse Wireless ke keranjang
    page.get_by_test_id("cart-link").click()  # buka keranjang (belum ada assertion!)
import { test, expect } from '@playwright/test'; // test dan expect

test('test', async ({ page }) => { // nama test bawaan codegen, sebaiknya diganti
  await page.goto('https://playground.aminhamzah.com/login-toko.html');
  await page.getByRole('textbox', { name: 'Username' }).click(); // klik ini tidak perlu, fill sudah memfokuskan kolom
  await page.getByRole('textbox', { name: 'Username' }).fill('customer'); // isi Username
  await page.getByRole('textbox', { name: 'Username' }).press('Tab'); // tekan Tab: juga tidak perlu
  await page.getByLabel('Password').fill('rahasia123'); // isi Password
  await page.getByTestId('login-button').click(); // klik Masuk lewat test id
  await page.getByTestId('product-card').filter({ hasText: 'Mouse Wireless' }).getByRole('button').click(); // tambah Mouse Wireless ke keranjang
  await page.getByTestId('cart-link').click(); // buka keranjang (belum ada assertion!)
});

Apa yang kurang dari rekaman mentah?

MasalahKenapa jadi masalahCara memperbaiki
Tidak ada assertionTest tidak memeriksa apa pun, jadi selalu hijauTambahkan expect untuk hasil yang penting
Ada klik dan Tab yang tidak perluBikin ramai dan lebih lambatHapus saja, karena fill sudah cukup
URL lengkap https://playground.aminhamzah.comGagal kalau dipindah ke server lainTulis path-nya saja, base URL-nya dari base_url/baseURL
Nama test test_example / 'test'Tidak menjelaskan apa-apaBeri nama sesuai perilaku yang diuji
Username dan password ditulis langsungRahasia ikut tersimpan di GitPindahkan ke .env (Modul 11)
Locator kadang kurang tepatMisalnya getByRole('button') tanpa namaPerjelas dengan name
Semuanya dalam satu test panjangSusah dibaca dan dirawatPecah sesuai tujuan, pakai Page Object (Modul 10)

Setelah dirapikan

tests/academy/test_m08_codegen.pytests/academy/m08-codegen.spec.tsLulus test
Memuat tests/academy/test_m08_codegen.py…
uv run pytest tests/academy/test_m08_codegen.py
Memuat tests/academy/m08-codegen.spec.ts…
npx playwright test m08-codegen --project=chromium

Lebih pendek, ikut pola AAA, punya assertion, dan tidak bergantung pada URL server.

Codegen paling berguna untuk menemukan locator dengan cepat (Pick locator), mempelajari perintah Playwright, dan membuat kerangka test panjang. Rekaman yang dipakai tanpa dirapikan biasanya merepotkan di kemudian hari.

Pilihan codegen yang berguna

# Emulasi HP
uv run playwright codegen --device "iPhone 13" https://playground.aminhamzah.com/login-toko.html

# Ukuran layar tertentu & mode gelap
uv run playwright codegen --viewport-size "1280,720" --color-scheme dark https://playground.aminhamzah.com

# Simpan status login, lalu pakai lagi di rekaman berikutnya
uv run playwright codegen --save-storage auth.json https://playground.aminhamzah.com/login-toko.html
uv run playwright codegen --load-storage auth.json https://playground.aminhamzah.com/shop.html  # rekam dalam keadaan sudah login (memakai storage state)
# Emulasi HP
npx playwright codegen --device "iPhone 13" https://playground.aminhamzah.com/login-toko.html

# Ukuran layar tertentu & mode gelap
npx playwright codegen --viewport-size "1280,720" --color-scheme dark https://playground.aminhamzah.com

# Simpan status login, lalu pakai lagi di rekaman berikutnya
npx playwright codegen --save-storage auth.json https://playground.aminhamzah.com/login-toko.html
npx playwright codegen --load-storage auth.json https://playground.aminhamzah.com/shop.html  # rekam dalam keadaan sudah login (memakai storage state)

Lewat VS Code: buka panel Testing, lalu pilih Record new. Rekamannya langsung masuk ke file test baru. Ada juga Record at cursor untuk menyisipkan rekaman di tengah test yang sudah ada.

Merekam di tengah test: tambahkan page.pause() di test-mu, lalu jalankan dengan --headed. Inspector akan terbuka tepat di baris itu, dan kamu bisa menekan Record untuk melanjutkan rekaman dari situ.

Lebih jauh (opsional)Trik komunitas
  • Sejak v1.55, codegen bisa menambahkan assertion toBeVisible() otomatis untuk interaksi yang umum. Fitur ini perlu dinyalakan dulu di pengaturan codegen. Tetap tambahkan assertion yang benar-benar membuktikan hasilnya.
  • Tim memakai nama atribut test sendiri? Pakai --test-id-attribute=data-qa supaya codegen memilih atribut itu.
  • Lihat efek data-testid: rekam halaman toko TokoQA. Codegen selalu mengutamakan data-testid kalau elemen punya atribut itu (lihat tombol login-button di rekaman mentah di atas). Tanpa test id, ia memilih role, lalu label, placeholder, atau teks.
  • Generator agent (Modul 16) itu ibarat "codegen versi AI": ia membaca rencana test, menjelajah halaman sendiri, lalu menulis test sambil memastikan locator-nya benar.
# Kalau timmu memakai data-qa. TokoQA memakai data-testid (bawaan), jadi di sini codegen beralih ke role dan label.
uv run playwright codegen --target python-pytest --test-id-attribute=data-qa https://playground.aminhamzah.com/login-toko.html
# Kalau timmu memakai data-qa. TokoQA memakai data-testid (bawaan), jadi di sini codegen beralih ke role dan label.
npx playwright codegen --test-id-attribute=data-qa https://playground.aminhamzah.com/login-toko.html

Latihan

Latihan 1

Rekam alur belanja lengkap

Jalankan codegen ke halaman login TokoQA. Rekam: login sebagai customer, pilih Elektronik, tambah Keyboard Mekanik dan Headset Gaming, checkout, isi form, pilih E-Wallet, centang persetujuan, lalu bayar. Salin hasilnya ke file baru.

Hasilsatu test mentah hasil rekaman

Latihan 2

Rapikan hasil rekaman

Buang klik dan Tab yang tidak perlu, ganti URL lengkap dengan path (/login-toko.html), beri nama test yang jelas, lalu tambahkan assertion untuk jumlah keranjang, judul "Pesanan berhasil!", dan total yang dibayar.

Hasiltest lulus dengan total Rp 1.170.000

Latihan 3

Pakai Pick locator

Pakai Pick locator untuk mencari locator angka di ikon keranjang dan nomor pesanan di halaman sukses.

HasilInspector menampilkan locator berbasis test id untuk keduanya