Idenya
Setiap script Playwright, dari test 5 baris sampai scraper yang berjalan setiap malam, dimulai dengan cara yang sama: jalankan Playwright, luncurkan browser, buka halaman. Modul ini membahas kerangka itu dengan tuntas, supaya sisa track ini bisa fokus pada bagian-bagian yang menarik.
Memasang (di komputermu sendiri)
Playwright terdiri dari dua hal: package Python, dan browser yang dikendalikannya. Di proyek uv:
uv add playwright
uv run playwright install chromium
Perintah pertama menambahkan package-nya ke pyproject.toml; yang kedua mengunduh build Chromium yang sesuai (sekitar 150 MB, sekali saja). Di kursus ini, browser latihan sudah disiapkan, jadi kode di bawah bisa langsung berjalan di sini.
Kerangkanya
Setiap script Playwright dimulai dengan cara yang sama: jalankan browser, buka sebuah tab, pergi ke sebuah halaman, kerjakan pekerjaanmu, lalu tutup. Ini versi terkecilnya, yang mengunjungi toko latihan dan mencetak judul halamannya:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://nusantara-gadget.test/")
print(page.title())
browser.close()
Nusantara Gadget — Official Gadget Store
Baris demi baris:
sync_playwright()menjalankan Playwright. Blokwithmenjamin ia dimatikan dengan benar, bahkan kalau kodemu crash di tengah jalan.p.chromium.launch()meluncurkan browser.p.firefoxdanp.webkit(engine Safari) bekerja dengan cara yang sama.browser.new_page()membuka sebuah tab.page.goto(url)memuat URL dan menunggu eventloadmilik halaman.browser.close()menutup browser. Melupakannya membuat proses browser tetap berjalan di mesinmu.
Kata sync di sync_playwright berarti setiap baris menunggu aksinya selesai sebelum lanjut, persis seperti yang kamu inginkan untuk script. Playwright juga punya async_api untuk menjalankan banyak halaman secara bersamaan; kamu belum akan membutuhkannya sampai kamu men-scrape dalam skala besar.
Headless atau headed?
Secara default browser berjalan headless: tanpa jendela yang terlihat. Itu lebih cepat dan itulah yang kamu inginkan di server. Saat development, sering kali berguna untuk melihat apa yang terjadi:
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=500)
page = browser.new_page()
page.goto("https://nusantara-gadget.test/products")
print(page.title())
browser.close()
Products — page 1 — Nusantara Gadget
headless=False membuka jendela sungguhan; slow_mo=500 berhenti 500 ms di antara aksi supaya kamu bisa mengikutinya. Kembali ke headless begitu script-nya berfungsi.
Browser, context, page
Playwright punya tiga level:
| Objek | Mirip dengan | Menyimpan |
|---|---|---|
Browser | aplikasi browser | satu atau lebih context |
BrowserContext | profil browser baru yang privat | cookie, storage, pengaturan (viewport, user agent) |
Page | sebuah tab | satu URL dalam satu waktu |
browser.new_page() adalah jalan pintas yang membuat context dengan satu page. Buat context sendiri saat kamu butuh pengaturan, atau beberapa session yang independen:
with sync_playwright() as p:
browser = p.chromium.launch()
phone = browser.new_context(viewport={"width": 390, "height": 844})
laptop = browser.new_context(viewport={"width": 1440, "height": 900})
phone_page = phone.new_page()
laptop_page = laptop.new_page()
phone_page.goto("https://nusantara-gadget.test/deals")
laptop_page.goto("https://nusantara-gadget.test/products")
print(phone_page.viewport_size, phone_page.title())
print(laptop_page.viewport_size, laptop_page.title())
browser.close()
{'width': 390, 'height': 844} Flash deals — Nusantara Gadget
{'width': 1440, 'height': 900} Products — page 1 — Nusantara Gadget
Context itu murah dan terisolasi: login di satu context tidak membuat context lain ikut login. Begitulah cara kamu men-scrape sebagai dua pengguna berbeda, atau memulai setiap proses dari kondisi bersih.
sync_playwright() → launch() browser → new_context() untuk profil bersih → new_page() untuk tab → goto(url). Selalu tutup browser, dan biarkan blok with yang membersihkan Playwright.
Di luar blok with
Di notebook atau session interaktif kamu mungkin ingin browser tetap terbuka di antara cell. Gunakan start() dan stop() alih-alih with:
p = sync_playwright().start()
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://nusantara-gadget.test/catalog")
print(page.url)
browser.close()
p.stop()
https://nusantara-gadget.test/catalog
Sekarang kamu sendiri yang bertanggung jawab memanggil close() dan stop(); di script, utamakan bentuk with.
Mengapa ini penting untuk kode yang bersih
Pembersihan resource adalah pembeda antara script yang berjalan berbulan-bulan dan script yang pelan-pelan memenuhi server dengan proses browser zombie. Context manager (with) membuat pembersihan otomatis, dan membungkus kerangka itu dalam sebuah fungsi (seperti di latihan) berarti kamu menulisnya sekali dan setiap scraper memakainya ulang.
Rangkuman
- Pasang dengan
uv add playwrightdanuv run playwright install chromium. with sync_playwright() as p:menjalankan dan menghentikan Playwright dengan aman.p.chromium.launch()(headless secara default);headless=False, slow_mo=...untuk debugging.- Browser → context (profil dan pengaturan yang terisolasi) → page (sebuah tab).
- Tutup browser; gunakan
start()/stop()hanya untuk session interaktif.