Menerjemahkan Post "Jembatan Codex ↔ Playwright": Bagaimana AI Agent Boleh Mengemudikan Browser Lo
← back to articles
~/articles/jembatan-codex-playwright-ai-agent-mengemudikan-browser.md
Article

Menerjemahkan Post "Jembatan Codex ↔ Playwright": Bagaimana AI Agent Boleh Mengemudikan Browser Lo

Galian teknis di balik POC "Codex ↔ Playwright + Chromium custom": arsitektur MCP (25 tool browser, accessibility tree bukan piksel), setup Codex CLI & Claude Code dari nol, 4 mode koneksi browser, 5 use case nyata, pitfalls, dan batas keamanannya.

Menerjemahkan Post "Jembatan Codex ↔ Playwright": Bagaimana AI Agent Boleh Mengemudikan Browser Lo

Catatan: artikel ini terinspirasi dari post @suwito.js di Threads — soal POC "Codex ↔ jembatan bikinan lu ↔ Playwright + customized Chromium". Semua bagian teknis di bawah kutulis ulang, digali, dan diperluas dari dokumentasi resmi serta percobaan langsung.


Beberapa waktu lalu aku baca satu post di Threads yang langsung bikin berhenti scroll. Intinya: orang ini baru selesai bikin proof of concept (POC) yang menghubungkan Codex (AI coding agent dari OpenAI) dengan Playwright + Chromium yang dimodifikasi, dan hasilnya adalah dua arah — agent bisa mengemudikan browser, dan browser bisa "berbicara" balik ke agent. Visinya: jangan cuma bikin web app atau game dengan AI; beri AI agent tangan dan mata di web.

Aku tertarik karena post itu nyebut satu hal yang sering terlewat di dunia AI agent: browser adalah API universal terakhir. Hampir semua aplikasi di internet — yang ada API-nya, yang tidak ada API-nya, yang UI-nya jelek, yang legacy — tetap bisa dioperasikan lewat browser. Momen di mana agent AI bisa mengemudikan browser dengan andal, itulah momen di mana hampir semua aplikasi web di dunia jadi "callable" oleh AI.

Artikel ini bedah topik itu dari nol: apa yang sebenarnya terjadi secara teknis, bagaimana setup-nya sampai jalan, dependensi apa yang dibutuhkan, lima use case nyata, sampai batas-batas di mana ide ini mulai rapuh.

Apa yang Sebenarnya Terjadi di Balik "Jembatan" Itu

Sebelum setup, penting paham arsitekturnya. Tiga komponen, satu protokol:

1. AI Agent (Codex, Claude Code, Cursor, atau apa pun). Agent-nya sendiri tidak "melihat" browser. Agent adalah model bahasa yang bisa memanggil tool — fungsi bernama dengan parameter. Dia tidak punya mouse atau keyboard; dia hanya bisa bilang "panggil tool bernama X dengan argumen Y".

2. MCP Server — di sini Playwright MCP. MCP (Model Context Protocol) adalah protokol standar yang menghubungkan model AI dengan tools eksternal. Playwright MCP adalah server-nya: program yang dijalankan lewat npx, berbicara lewat JSON-RPC di stdio (pipe masuk-keluar standar, bukan jaringan), dan mendaftarkan sekitar 25 tool browser — browser_navigate, browser_click, browser_fill, browser_snapshot, browser_evaluate, browser_take_screenshot, dan seterusnya. Ketika agent berkata "panggil browser_navigate ke URL ini", MCP server menerjemahkannya jadi aksi Playwright di browser sungguhan.

3. Chromium/Chrome yang "customized". Di sinilah bagian "bikinan lu" dari post aslinya. Kustomisasinya bisa beberapa lapis: profil dengan session login yang sudah jalan, extension yang terpasang, flag launch yang diset sendiri, atau bahkan build Chromium khusus. Detailnya nanti di bagian setup.

Alur satu siklusnya begitu:

Diagram alur agent ke MCP ke Chromium beserta empat mode koneksi browser

Diagram 1. Satu siklus kerja: agent memanggil tool MCP, MCP menerjemahkan ke Playwright, Chromium (profil apa pun) dieksekusi, dan hasilnya kembali sebagai snapshot, teks, atau screenshot. Empat mode koneksi (A–D) menentukan browser mana yang dipakai.

Ada satu detail desain yang menurutku paling elegan: agent tidak diajari browser lewat screenshot. Playwright MCP memberi agent accessibility tree halaman — struktur semantis elemen (heading, tombol, input, tautan) yang diekstrak dari DOM — bukan piksel. Artinya model tidak perlu kemampuan vision sama sekali; dia membaca halaman seperti pembaca layar (screen reader) membaca. Ini membuat alurnya deterministik dan murah token dibanding pendekatan "agent lihat screenshot, tebak koordinat klik" yang umum di banyak framework agent.

Potensinya: Sampe Mana?

Seberapa jauh ini bisa dibawa? Aku uraikan jujur, dari yang sudah terbukti sampai yang masih spekulatif.

Yang sudah terbukti (hari ini):

  • Agent bisa menavigasi, mengisi form, klik, ekstrak data, screenshot, jalankan JavaScript di halaman — secara mandiri, tanpa satu baris code yang lo tulis per-halaman.
  • Session login bisa di-reuse: agent bisa bekerja di halaman yang hanya bisa diakses kalau lo sudah login, tanpa agent "tahu" password lo.
  • Agent bisa debug aplikasinya sendiri: ini killer app-nya. Coding agent menulis kode web, lalu dia sendiri membuka hasilnya di browser, mengecek error di console, memverifikasi UI, dan memperbaiki — loop lengkap tanpa manusia di tengah.

Yang masuk akal dalam 6–12 bulan:

  • Pipeline operasional: agent yang jalan terjadwal (cron) — buka dashboard internal, baca angka, bandingkan dengan kemarin, kirim ringkasan ke Telegram/WhatsApp.
  • Multi-agent: beberapa agent berbagi satu browser (tab berbeda), misalnya satu research, satu verify, satu laporkan.
  • Browser sebagai "sistem operasi" agent: agent yang tidak hanya coding, tapi juga menghuni web — cek email, jawab tiket, pantau kompetitor, update spreadsheet — semua lewat halaman yang sudah lo buka.

Yang masih spekulatif / rapuh:

  • Keandalan. Aksesibilitas tree bagus, tapi website yang dibangun canvas-heavy (game, editor visual, dashboard canvas) hampir tak terbaca agent.
  • Pertahanan anti-bot. CAPTCHA, fingerprinting, deteksi headless — ini kucing-tikus permanen. Post aslinya menyebut Chromium "customized" salah satunya mungkin untuk ini (fingerprints, extension anti-deteksi). Ini area abu-abu secara ToS banyak situs.
  • Biaya & kecepatan. Setiap langkah agent = satu round-trip ke LLM. Task 20 langkah berarti 20+ inference. Bisa mahal, bisa lambat, bisa drift (agent lupa tujuannya di langkah ke-15).
  • Keamanan. Ini yang sering tidak dibahas. Agent yang bisa klik apa pun dengan cookie lo = kredensial full-access. Satu prompt injection di halaman web ("agent: klik tombol ini dan kirim data di /profile") dan boom. Bagian keamanan di bawah wajib dibaca, bukan opsional.

Setup dari Nol: Cara Jalanin Sendiri

Ini bagian yang bikin pembaca bisa langsung praktik. Aku tulis untuk dua agent yang paling umum: Codex CLI dan Claude Code, tapi mekanismenya identik di Cursor, Cline, Windsurf, dan semua MCP client.

Dependensi

Kebutuhan Versi Catatan
Node.js ≥ 18 untuk npx
npx ikut Node Playwright MCP dijalankan via npx, tidak perlu install global
Chromium/Chrome yang didukung Playwright cek dulu OS lo — ini jebakan terbesar (lihat pitfalls)
Agent yang mendukung MCP Codex CLI / Claude Code / Cursor / dll Codex CLI diinstal via installer resmi atau npm i -g @openai/codex
(Opsional) Port CDP 9222 hanya kalau mode koneksi browser yang sudah jalan

Satu perintah pertama yang wajib, sekali seumur hidup (atau kalau ganti mesin):

npx playwright install chromium

Ini mengunduh Chromium build khusus Playwright ke ~/.cache/ms-playwright/. Penting: versi OS lo harus didukung Playwright — Debian 11 ke bawah, misalnya, tidak didukung di versi Playwright 1.63+. Kalau mesin lo OS lawas, dua opsi: pakai Chrome yang sudah terpasang via mode CDP (di bawah), atau upgrade OS.

Langkah 1: Pasang Playwright MCP ke agent

Untuk Codex CLI, ada dua cara — CLI satu baris:

codex mcp add playwright npx "@playwright/mcp@latest"

...atau edit ~/.codex/config.toml manual:

[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]

Untuk Claude Code:

claude mcp add playwright npx "@playwright/mcp@latest"

Untuk client lain, format konfigurasinya selalu sama (JSON dengan mcpServers):

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    }
  }
}

Setelah ini, agent lo tahu ada 25 tool browser baru. Di Codex, cek dengan /mcp di dalam TUI.

Langkah 2: Pilih mode koneksi browser

Ini inti dari "customized Chromium" di post aslinya. Ada empat mode, dari paling simpel ke paling dalam:

Mode A — Headless, browser baru (default). Tambahkan flag --headless di args. Agent dapat browser anonim tanpa UI. Cocok untuk scraping publik dan QA. Tapi tidak ada login apa pun — semua halaman yang butuh akun mati di sini.

Mode B — --user-data-dir: profil persisten.

"args": ["@playwright/mcp@latest", "--user-data-dir=/path/ke/profilku"]

Browser-nya memakai profil Chromium tertentu, jadi cookie, localStorage, dan extension bertahan antar sesi. Cara paling praktis untuk "browserku yang sudah login": buka browser manual sekali dengan profil itu (login semua akun yang lo perlukan), lalu biarkan agent-nya yang memakai profil itu selamanya.

Mode C — --storage-state: snapshot login (isolated).

"args": ["@playwright/mcp@latest", "--isolated", "--storage-state=/path/ke/storage.json"]

Cookies + localStorage di-export dari sesi login (Playwright punya utilitasnya) ke satu file JSON, lalu dimuat ke browser isolated. Lebih steril dari Mode B — setiap sesi mulai bersih dari state yang sama — dan file-nya bisa lo commit ke vault, di-backup, atau di-copy ke mesin lain.

Mode D — --cdp-endpoint atau --extension: browser yang sudah hidup.

"args": ["@playwright/mcp@latest", "--cdp-endpoint=http://localhost:9222"]

Buka Chrome normal lo dengan flag remote debugging:

chrome --remote-debugging-port=9222

Maka MCP server tidak launch browser apa pun — dia menempel ke instance Chrome yang sudah jalan, dengan semua tab, extension, dan session lo. Variannya, --extension memakai Playwright Extension (ada di Chrome Web Store) yang dipasang di Chrome/Edge lo, jadi agent bisa menempel ke tab mana pun yang lo tunjuk. Inilah "browser lu bisa interaksi dgn AI agent" dari post aslinya — dan juga arah sebaliknya: karena agent mengendalikan browser sungguhan lo, apa pun yang terjadi di browser itu bisa lo amati secara langsung sambil agent bekerja.

Aturannya praktis: untuk job sekali jalan yang bersih → Mode A/C; untuk kerja harian dengan login → Mode B; untuk kolaborasi manusia+agent di browser yang sama → Mode D.

Langkah 3: "Customized Chromium" — lapisan kustom

Setelah mode koneksi, kustomisasi lebih dalam yang dimaksud post:

  • Extension bawaan profil (Mode B/D): karena yang dipakai profil sungguhan, extension apa pun — password manager, adblock, tool internal — ikut jalan.
  • --init-script: script JS yang dieksekusi di setiap halaman sebelum script halaman — bisa dipakai untuk menyetel environment, memberi tag ke elemen, atau hook ke UI internal.
  • --init-page: file TypeScript untuk setup context (geolocation, permission, viewport) di awal sesi.
  • Config file JSON (--config path.json): semua opsi di atas bisa masuk satu file — inilah "jembatan bikinan lu": config yang lo setel sekali sesuai kebutuhan tim lo, dipakai semua agent.

Langkah 4: Uji minimal

Buka Codex/Claude, lalu minta hal paling sederhana:

"Buka https://example.com, ambil judul halamannya, dan screenshot."

Kalau agent balas dengan judul "Example Domain" + file screenshot, jembatan lo hidup. Dari situ, naikkan kompleksitasnya perlahan.

Lima Use Case yang Layak Dicoba

Berikut lima contoh konkret yang menurutku paling masuk akal untuk developer individu — semuanya bisa dimulai dari setup di atas, tanpa infrastruktur tambahan.

1. QA loop untuk aplikasi lo sendiri. Coding agent menulis fitur web, lalu agent yang sama membuka staging-nya, klik alurnya (register → login → buat data), membaca console messages (browser_console_messages adalah tool bawaan!), dan screenshot tiap langkah. Bug UI yang biasanya ketahuan besok pas lo cek manual, ketahuan di menit yang sama. Untuk tim kecil, ini menggantikan sebagian besar "test manual tiap push".

2. Monitoring terjadwal + lapor ke chat. Cron di jam 7 pagi: agent buka halaman (harga kompetitor, ketersediaan barang, status deploy, feed yang lo follow) dengan profil login Mode B, ekstrak angkanya, bandingkan dengan data kemarin (simpan di SQLite lokal), dan hanya kirim pesan kalau ada perubahan signifikan. Agent-nya menulis narasi laporannya sendiri — "harga A naik 12% dalam 3 hari" — bukan cuma dump angka.

3. Konten ops lintas platform. Draft artikel selesai di markdown. Agent membuka dashboard Threads, menulis, mem-paste, mempublish; lanjut ke platform lain. Dengan Mode B/D, semua session login sudah ada — agent tidak menyentuh kredensial lo sama sekali, dia cuma "mengetik di browser lo". Ini persis pola "satu sumber, banyak kanal" yang selama ini ribet karena platform tidak mau kasih API publik yang murah hati.

4. Data entry ke sistem tanpa API. Ini yang paling underrated: sistem legacy — absensi, input laporan, form internal instansi — yang tidak akan pernah punya API. Agent membaca data dari sumber (file, sheet, email) lalu mengisinya satu per satu ke form web, dengan verifikasi screenshot per baris. Lo tinggal review hasil akhirnya. Untuk pekerjaan yang 1–2 jam sehari, ini ROI-nya paling gila di antara semua use case.

5. Riset & verifikasi kompetitor. Agent membuka N situs kompetitor, membandingkan halaman pricing, menangkap screenshot perubahan, mem-diff dengan kunjungan terakhir (visual diff dari dua screenshot), dan merangkum perubahannya dalam laporan. Ditambah browser_evaluate, agent bisa mengeksekusi JS di halaman — ambil isi JSON tersembunyi, baca meta tag, apa pun yang bisa diambil browser.

Pitfalls yang Akan Lo Temui

Dari percobaan langsung dan pengalaman komunitas, ini yang biasanya mengagetkan:

  1. OS tidak didukung. Playwright 1.63+ menolak install Chromium di Debian 11 (dan turunannya). Kalau mesin lo lawas, solusinya Mode D (pakai Chrome yang sudah terpasang via CDP) atau upgrade OS. Cek dukungannya di npx playwright install chromium — error-nya eksplisit.
  2. npx @playwright/mcp install chromium tidak ada. MCP server tidak mengadopsi perintah install; install browser lewat paket playwright biasa (langkah dependensi di atas).
  3. Login yang "hilang" karena profile dirandom. Kalau agent tiba-tiba tidak login padahal profilnya benar, cek apakah mode --isolated aktif — mode itu sengaja tidak menyimpan apa pun.
  4. Rate limit & deteksi. Browser headless yang ngebut buka halaman akan dikenali. Tambahkan delay antar langkah (agent yang baik akan menunggu elemen, bukan buta klik), dan untuk situs sensitif pakai profil Mode B/D yang fingerprint-nya seperti browser manusia biasa.
  5. Token bengkak. Snapshot aksesibilitas halaman berat (marketplace, dashboard enterprise) bisa belasan ribu token per langkah. Solusinya: minta agent menyaring snapshot (browser_snapshot mendukung filter role), atau beralih ke pendekatan CLI.
  6. Halaman yang berubah = agent buntu. Selector dan struktur bukan jaminan permanen. Agent modern bisa self-heal (mencoba elemen lain kalau yang pertama tidak ada), tapi tetap — task yang bergantung pada satu layout tertentu adalah task yang rapuh.

Satu catatan praktis soal alternatif: Microsoft juga merilis Playwright CLI + Skills (bukan MCP) — pola yang sama, tapi agent memanggil perintah CLI ringkas alih-alih tool MCP. Klaim resminya: lebih hemat token karena tidak ada schema tool besar dan accessibility tree verbose yang masuk context. Untuk agent coding yang bekerja di codebase besar sekaligus mengontrol browser, opsi CLI ini layak dicoba; MCP tetap unggul untuk alur agentik panjang yang butuh state browser persisten dan introspeksi kaya. Di sisi lain, agent-browser (Vercel Labs, CLI Rust) mengambil filosofi serupa dengan referensi elemen @eN yang stabil — ekosistemnya sedang bergerak cepat, jangan kaku pada satu tool.

Ide-Ide Terkait yang Layak Dipantau

Beberapa arah yang menurutku menarik untuk dikembangkan, di luar post aslinya:

  • Browser dua arah yang sesungguhnya. Post aslinya menyebut "browser lu bisa interaksi dgn AI agent" — artinya tidak cuma agent menggerakkan browser, tapi event browser (tab baru, notifikasi, dialog, perubahan halaman) masuk ke agent. Dengan Mode D + browser_console_messages + iniscript, prototipe-nya sudah mungkin: pasang --init-script yang mem-forward event tertentu ke endpoint lokal, dan agent reaktif bisa "terbangun" saat sesuatu terjadi di halaman.
  • Browser sebagai sandbox. Kebalikannya: agent otonom diberi browser terisolasi (profil bersih, network-nya dibatasi, tidak ada cookie pribadi) untuk task publik — riset, verifikasi — sementara browser pribadi lo tetap utuh untuk manusia. Pemisahan ini murah (Mode A + --isolated) dan menjadi pola keamanan default yang benar.
  • Approval gates. Untuk aksi yang berisiko (klik "bayar", "hapus", "publish"), selipkan lapisan approval: agent menyiapkan aksi, berhenti, menunggu manusia konfirmasi. Beberapa MCP client sudah punya approval built-in; sisanya cukup dengan instruksi sistem yang tegas plus daftar domain putih.
  • Prompt injection adalah masalah keamanan utama. Agent yang membaca halaman web = agent yang membaca input tak terbatas dari pihak ketiga. Aturan praktis: jangan pernah beri profil login sensitif ke browser agent; batasi domain; jangan pernah izinkan agent meng-forward isi halaman ke endpoint eksternal tanpa review. Ini bukan paranoia — halaman yang terlihat benign bisa mengandung teks yang persis diperintahkan ke LLM.
  • Kustomisasi Chromium serius. Kalau kebutuhan lo melampaui extension + flag (misalnya fingerprint management untuk riset skala besar), barulah masuk ke "custom Chromium build" — build Chromium dengan flag/patch sendiri. Ini level di mana post aslinya berada, dan ini juga level di mana lo harus benar-benar paham trade-off maintenance-nya.

Penutup

Yang membuat post itu penting bukan tekniknya — tekniknya, seperti yang baru saja kita lihat, adalah 10 menit setup. Yang penting adalah kerangka berpikirnya: jangan membatasi AI agent pada dunia yang lo bisa beri API; beri dia browser, dan seluruh web jadi API-nya. Dari POC seseorang di Threads sampai ke loop QA, monitoring, dan data entry di atas — jaraknya memang tidak jauh, tapi ada satu syarat yang sering dilupakan: agent dengan browser dan cookie lo adalah agent dengan kuasa penuh akun lo. Gunakan Mode A/C untuk yang publik, profil khusus untuk yang pribadi, approval gates untuk yang berisiko — dan baru setelah itu biarkan dia bekerja.


Sumber rujukan:

Share this article
WhatsApp Telegram Facebook
© 2026 Cybits Seven ← all articles