Agen Otomasi Web: Kontrol Browser dengan Claude dan Computer Use
Agen Otomasi Web: Kontrol Browser dengan Claude dan Computer Use
Perusahaan Anda membutuhkan data dari portal pemasok yang tidak memiliki API. Itu adalah aplikasi web dengan konten dinamis, formulir multi-langkah, dan tata letak yang berubah setiap beberapa bulan. Skrip Selenium Anda rusak setiap kali mereka memperbarui CSS. Anda memeliharanya seperti kode lawas — rapuh, mahal, dan tidak ada yang mau menyentuhnya.
Agen berbasis penglihatan tidak peduli dengan CSS selector. Ia melihat halaman, menemukan tombol “Search” secara visual, mengkliknya, membaca tabel hasil, dan mengekstrak data. Ketika tata letak berubah, agen beradaptasi karena ia membaca halaman seperti manusia — bukan mem-parsing DOM.
Artikel ini mengajarkan Anda cara membangun agen otomasi web menggunakan kemampuan computer use Claude. Anda akan mempelajari mekanisme inti otomasi visual, pola navigasi yang andal, teknik ekstraksi data, alur kerja pengisian formulir, dan strategi pemulihan kesalahan. Di akhir artikel, Anda akan memiliki pola-pola yang diperlukan untuk membangun agen yang berinteraksi dengan antarmuka web apa pun — dari pembacaan halaman sederhana hingga alur kerja multi-langkah yang kompleks.
Visual vs. Otomasi Tradisional
Sebelum membangun agen berbasis penglihatan, Anda perlu memahami kapan pendekatan ini masuk akal — dan kapan tidak. Alat otomasi tradisional seperti Selenium dan Playwright tidak akan hilang. Mereka cepat, deterministik, dan sudah dipahami dengan baik. Pertanyaannya adalah di mana masing-masing pendekatan unggul dan di mana ia gagal.
Otomasi Tradisional (Selenium/Playwright)
Otomasi browser tradisional bekerja dengan berinteraksi dengan DOM. Anda menemukan elemen menggunakan CSS selector atau ekspresi XPath, kemudian melakukan aksi padanya secara programatis:
# Pendekatan tradisional — cepat tapi rapuhsearch_input = driver.find_element(By.CSS_SELECTOR, "#search-box-v3 > input.query")search_input.send_keys("industrial bearings")driver.find_element(By.CSS_SELECTOR, "button.search-submit-2024").click()Ini cepat. Deterministik. Dan rusak begitu seseorang mengganti nama search-box-v3 menjadi search-box-v4 atau merestrukturisasi tata letak formulir. Anda akhirnya memelihara pemetaan selector yang mencerminkan struktur internal situs — struktur yang tidak Anda kendalikan.
Otomasi tradisional juga tidak bisa menangani konten yang hanya visual. Jika data yang Anda butuhkan dirender dalam elemen <canvas>, tertanam dalam gambar, atau ditampilkan sebagai PDF di dalam browser, CSS selector tidak bisa menjangkaunya.
Otomasi Berbasis Penglihatan (Computer Use)
Otomasi berbasis penglihatan bekerja seperti cara manusia bekerja. Agen menerima tangkapan layar, mengidentifikasi elemen yang dibutuhkan secara visual, dan mengeluarkan aksi mouse/keyboard pada koordinat tertentu:
# Pendekatan berbasis penglihatan — tangguh tapi lebih lambat# Agen melihat halaman, menemukan kotak pencarian secara visual, dan mengetik ke dalamnya# Tidak perlu selector — beradaptasi dengan perubahan tata letak secara otomatisTrade-off-nya: lebih lambat (setiap aksi membutuhkan panggilan API dengan gambar), lebih mahal (token untuk tangkapan layar), dan non-deterministik (agen mungkin menginterpretasikan tangkapan layar secara berbeda antar eksekusi). Tapi ia tangguh terhadap perubahan tata letak, bekerja pada antarmuka visual apa pun, dan bisa memahami konten halaman secara semantik.
Pendekatan Hybrid
Strategi paling praktis menggabungkan keduanya:
- Gunakan otomasi tradisional untuk halaman yang stabil dan terstruktur dengan baik di mana Anda mengontrol antarmuka atau jarang berubah.
- Gunakan otomasi berbasis penglihatan untuk halaman dinamis, antarmuka yang tidak familiar, konten visual, atau tugas sekali jalan yang tidak layak dipelihara skripnya.
- Gunakan penglihatan sebagai fallback — coba selector terlebih dahulu; jika gagal, gunakan identifikasi visual.
Kapan Memilih Penglihatan
Otomasi berbasis penglihatan adalah pilihan yang tepat ketika:
- Tidak ada API yang tersedia dan antarmuka web adalah satu-satunya pilihan Anda
- Tata letak halaman sering berubah dan pemeliharaan selector terlalu mahal
- Konten bersifat visual — grafik, gambar, elemen canvas, PDF tertanam
- Alur kerja multi-langkah membutuhkan konteks — memahami apa yang ada di layar untuk memutuskan aksi selanjutnya
- Otomasi sekali pakai yang tidak membenarkan biaya rekayasa dari skrip Selenium yang dipelihara
- Antarmuka yang tidak familiar di mana Anda bisa mendeskripsikan tugas dalam bahasa natural daripada memetakan selector
Dasar-Dasar Claude Computer Use
Kemampuan computer use Claude memungkinkan model berinteraksi dengan layar komputer dengan cara yang sama seperti manusia — dengan melihat tangkapan layar dan mengeluarkan aksi mouse dan keyboard. Memahami mekanismenya sangat penting sebelum membangun agen yang andal.
Cara Kerjanya
Loop computer use sangat sederhana:
- Tangkap tangkapan layar dari layar saat ini (atau jendela browser)
- Kirim tangkapan layar ke Claude beserta deskripsi tugas
- Terima panggilan tool — Claude memberitahu Anda aksi apa yang harus dilakukan (klik, ketik, scroll)
- Jalankan aksi tersebut di browser
- Tangkap tangkapan layar baru
- Ulangi sampai tugas selesai atau agen memberi sinyal selesai
Claude tidak pernah mengontrol browser secara langsung. Kode Anda bertindak sebagai perantara — menerima instruksi dari model dan mengeksekusinya di lingkungan nyata.
Definisi Tool
Computer use bergantung pada definisi tool spesifik — computer_20241022 — yang mendeskripsikan aksi yang tersedia:
computer_tool = { "type": "computer_20241022", "name": "computer", "display_width_px": 1280, "display_height_px": 800, "display_number": 1,}Aksi yang tersedia meliputi:
screenshot— Menangkap keadaan layar saat inimouse_move— Memindahkan kursor ke koordinat tertentuleft_click/right_click/double_click— Mengklik di posisi kursor saat inileft_click_drag— Mengklik dan menyeret ke posisi targettype— Mengetik string tekskey— Menekan tombol atau kombinasi tombol tertentu (misalnya,Return,ctrl+a)scroll— Menggulir ke atas atau ke bawah di posisi kursor saat ini
Loop Aksi
Berikut implementasi lengkap dari loop inti computer use:
import anthropicimport base64import subprocessimport time
client = anthropic.Anthropic()
def capture_screenshot() -> str: """Capture screen and return base64-encoded PNG.""" # Using scrot for X11; adapt for your environment subprocess.run(["scrot", "/tmp/screenshot.png"], check=True) with open("/tmp/screenshot.png", "rb") as f: return base64.standard_b64encode(f.read()).decode("utf-8")
def execute_action(action: dict): """Execute a computer use action using xdotool.""" action_type = action.get("action")
if action_type == "screenshot": return # Screenshot will be taken in the main loop
elif action_type == "mouse_move": x, y = action["coordinate"] subprocess.run(["xdotool", "mousemove", str(x), str(y)])
elif action_type == "left_click": x, y = action["coordinate"] subprocess.run(["xdotool", "mousemove", str(x), str(y)]) subprocess.run(["xdotool", "click", "1"])
elif action_type == "type": text = action["text"] subprocess.run(["xdotool", "type", "--clearmodifiers", text])
elif action_type == "key": key = action["key"] subprocess.run(["xdotool", "key", key])
elif action_type == "scroll": x, y = action["coordinate"] direction = action["direction"] amount = action["amount"] subprocess.run(["xdotool", "mousemove", str(x), str(y)]) button = "5" if direction == "down" else "4" for _ in range(amount): subprocess.run(["xdotool", "click", button])
time.sleep(0.5) # Brief pause after each action
def run_computer_use_agent(task: str, max_steps: int = 50): """Run a computer use agent loop.""" messages = [{"role": "user", "content": task}]
for step in range(max_steps): # Capture current screen state screenshot_b64 = capture_screenshot()
# Add screenshot to the conversation if step > 0: messages.append({ "role": "user", "content": [{ "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": screenshot_b64, }, }], })
# Call Claude with computer use tool response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=4096, tools=[computer_tool], messages=messages, )
# Process response messages.append({"role": "assistant", "content": response.content})
# Check if the agent is done if response.stop_reason == "end_turn": # Extract final text response for block in response.content: if hasattr(block, "text"): return block.text return "Task completed."
# Execute tool calls tool_results = [] for block in response.content: if block.type == "tool_use": print(f"Step {step}: {block.input.get('action')} " f"{block.input.get('coordinate', '')}") execute_action(block.input) tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": "Action executed successfully.", })
messages.append({"role": "user", "content": tool_results})
return "Max steps reached."Resolusi dan Sistem Koordinat
Claude memetakan konten visual ke koordinat piksel x,y berdasarkan dimensi tangkapan layar yang Anda tentukan dalam definisi tool. Beberapa detail penting:
- Sesuaikan resolusi tampilan Anda dengan
display_width_pxdandisplay_height_pxdalam definisi tool. Ketidakcocokan menyebabkan klik mendarat di tempat yang salah. - Resolusi lebih rendah lebih baik. Tangkapan layar 1280×800 memberikan Claude detail yang cukup untuk membaca teks dan mengidentifikasi elemen UI sambil menjaga biaya token tetap terkendali. Jangan kirim tangkapan layar 4K.
- Koordinat bersifat absolut — (0, 0) adalah sudut kiri atas layar.
Pola Navigasi yang Andal
Situs web dunia nyata itu berantakan. Halaman dimuat secara asinkron, popup muncul tak terduga, dan konten dinamis mengubah tata letak di tengah interaksi. Agen otomasi yang andal membutuhkan pola untuk menangani semua ini.
Menunggu Pemuatan
Kesalahan paling umum dalam otomasi web — tradisional maupun visual — adalah bertindak sebelum halaman siap. Jangan gunakan panggilan time.sleep() yang tetap. Sebagai gantinya, verifikasi keadaan halaman secara visual:
def wait_for_page_load( client: anthropic.Anthropic, expected_content: str, max_retries: int = 5, delay: float = 2.0,) -> bool: """Wait for a page to load by checking for expected visual content.""" for attempt in range(max_retries): screenshot_b64 = capture_screenshot()
response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=256, messages=[{ "role": "user", "content": [ { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": screenshot_b64, }, }, { "type": "text", "text": ( f"Is this page fully loaded and showing: " f"'{expected_content}'? " f"Reply with only 'yes' or 'no'." ), }, ], }], )
answer = response.content[0].text.strip().lower() if "yes" in answer: return True
print(f"Page not ready (attempt {attempt + 1}/{max_retries}). Waiting...") time.sleep(delay)
return FalsePenanganan Popup
Banner cookie, dialog notifikasi, dan widget chat adalah musuh otomasi web. Agen berbasis penglihatan menanganinya secara alami:
def dismiss_popups(client: anthropic.Anthropic) -> bool: """Check for and dismiss any popup overlays.""" screenshot_b64 = capture_screenshot()
response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=Artikel Terkait
- Pemulihan Error Agen: 5 Pola untuk Keandalan Produksi
- Streaming Respons Agen: Output Real-Time untuk Alur Kerja Multi-Langkah
- Pola Penggunaan Alat: Membangun Antarmuka Agen-Alat yang Andal
- Mengenal Pengembangan Agentik