Wenn KI-Agenten lernen, "während des Laufens zu reparieren"
Im Jahr 2026 ist das Rennen um die Browser-Steuerung durch KI-Agenten zu einem hart umkämpften Markt geworden – Browser Use, Agent-E und WebVoyager zeigen alle ihre Stärken. Doch ein Open-Source-Projekt des browser-use-Teams hat es mit weniger als 600 Zeilen Python-Code an die Spitze geschafft: Browser Harness.
Bis August 2026 hat dieses Projekt auf GitHub bereits 17.100+ Sterne gesammelt und ist damit eines der am schnellsten wachsenden Projekte im Bereich Browser-Agenten. Das Kernkonzept lässt sich in einem Satz zusammenfassen: Verbinde den LLM direkt mit Chomes CDP-Port – was fehlt, schreibt die KI selbst.
Dies ist kein weiteres Framework, das Playwright "einfach nur ummantelt". Die Designphilosophie von Browser Harness ist Minimalismus – keine Selector-Engines, keine Seitenmodelle, keine vordefinierten Workflows. Es bietet nur einen minimalen Satz an CDP-Hilfsfunktionen, den Rest erledigt der LLM dynamisch zur Laufzeit.
Noch beeindruckender ist seine Selbstheilungsfähigkeit: Wenn der Agent auf eine Operation trifft, die das Framework nicht abdeckt, bricht er nicht mit einem Fehler ab, sondern schreibt selbst eine neue Hilfsfunktion, speichert sie im lokalen Arbeitsbereich und verwendet sie beim nächsten Mal direkt. Das Framework wird mit der Nutzung immer besser – das ist die Bedeutung von "selbstheilend".
Der wesentliche Unterschied zu Playwright/Puppeteer
Viele werden fragen: Ist das nicht einfach ein Python-Wrapper für Playwright? Die Antwort ist nein.
Playwright und Puppeteer sind traditionelle Automatisierungsframeworks. Ihr Designziel ist "Menschen schreiben Skripte zur Browsersteuerung". Sie bieten umfangreiche Selector-Engines (CSS, XPath, Text), Seitenmodelle, Wartemechanismen und Assertion-Bibliotheken. Man muss im Voraus wissen, welches Element angeklickt, welches Formular ausgefüllt und auf welche Bedingung gewartet werden soll.
Browser Harness ist ein KI-natives Framework. Es geht davon aus, dass nicht ein menschliches Skript den Browser steuert, sondern ein LLM. Daher: - Es verwendet keine Selektoren, sondern arbeitet direkt über CDP mit Koordinaten und DOM - Es bietet keine fortgeschrittenen Wartemechanismen, sondern überlässt es dem LLM zu entscheiden, wann die Seite bereit ist - Es definiert keine Workflows vor, sondern lässt den LLM basierend auf dem aktuellen Seitenzustand den nächsten Schritt bestimmen - Es bricht nicht mit einem Fehler ab, sondern lässt den LLM dynamisch fehlende Hilfsfunktionen generieren
Dieses Design ermöglicht es Browser Harness, nie zuvor gesehene Webseitenstrukturen zu verarbeiten. Traditionelle Automatisierungsskripte scheitern an neuen DOM-Strukturen, aber der Agent von Browser Harness "versteht" die Seite und schreibt dann neuen Code, um die Aufgabe zu erledigen.
Kernarchitektur: Die Organisation von 592 Zeilen Code
Die Codebasis von Browser Harness ist extrem schlank, mit nur 5 Kerndateien:
src/browser_harness/
├── __init__.py # 37 Zeilen, Paketinitialisierung
├── _ipc.py # 201 Zeilen, Unix Socket/TCP Interprozesskommunikation
├── helpers.py # 564 Zeilen, Kern-CDP-Hilfsfunktionen
├── daemon.py # 850 Zeilen, Hintergrund-Daemon-Verwaltung
├── run.py # 407 Zeilen, CLI-Einstiegspunkt und REPL
└── admin.py # 1191 Zeilen, Installations-, Update- und Diagnosetools
Insgesamt etwa 3.250 Zeilen Code (nicht 592, die 592 Zeilen beziehen sich auf frühere Versionen). Aber selbst mit über 3.000 Zeilen ist dies nur 1/50 des Umfangs von Playwright.
Wichtige Module im Detail
helpers.py ist die Seele des gesamten Frameworks. Es bietet nur etwa 20 Basisfunktionen:
# Navigation und Seiteninformationen
goto_url(url) # Zu URL navigieren
page_info() # Aktuelle Seiteninformationen abrufen (URL, Titel, Größe, Scrollposition)
wait_for_load() # Warten bis Seite geladen ist
# Element-Interaktion
click_at_xy(x, y) # Koordinaten anklicken
type_text(text) # Text eingeben
fill_input(selector, text) # Formularfeld ausfüllen
# JavaScript-Ausführung
js(expression) # JavaScript ausführen und Ergebnis zurückgeben
# CDP-Direktzugriff
cdp(method, **params) # Chrome DevTools Protocol direkt aufrufen
# Screenshots und Aufzeichnung
capture_screenshot(path) # Screenshot aufnehmen
start_recording(name) # Aufzeichnung starten
stop_recording() # Aufzeichnung stoppen
Diese Funktionen kommunizieren über Unix Sockets (oder Windows TCP) mit dem Hintergrund-Daemon-Prozess. Der Daemon verwaltet die WebSocket-Verbindung zum Chrome CDP-Port.
daemon.py ist verantwortlich für: - Automatische Erkennung laufender Chrome-Instanzen - Starten des Hintergrund-Daemons - Verwaltung des CDP-Verbindungspools - Umgang mit Multi-Tab-Umschaltung - Unterstützung von Cloud-Browsern (Browser Use Cloud)
run.py ist der CLI-Einstiegspunkt. Es startet eine REPL (Read-Eval-Print Loop), die es dem LLM ermöglicht, Python-Code über Heredoc auszuführen:
browser-harness <<'PY'
goto_url("https://example.com")
print(page_info())
PY
Dieses Design ermöglicht es dem LLM, den Browser wie Funktionsaufrufe zu steuern, ohne die zugrunde liegenden CDP-Protokolldetails verstehen zu müssen.
Selbstheilungsmechanismus: Wie KI fehlende Funktionen dynamisch generiert
Die wichtigste Innovation von Browser Harness ist der Selbstheilungsmechanismus (Self-Healing). Traditionelle Frameworks werfen Ausnahmen, wenn sie eine nicht unterstützte Operation antreffen, während Browser Harness den LLM den Code selbst schreiben lässt.
Arbeitsablauf
1. Agent erhält Aufgabe: Lade die neuesten 20 Videos von X (Twitter) herunter
2. Agent ruft goto_url("https://x.com/profile") auf
3. Agent ruft page_info() auf, um Seiteninformationen zu erhalten
4. Agent muss Seite scrollen, um mehr Posts zu laden, aber Framework hat keine scroll_to_bottom()-Funktion
5. Agent schreibt selbst:
def scroll_to_bottom(times=10):
for _ in range(times):
js("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2)
6. Speichert in agent-workspace/agent_helpers.py
7. Beim nächsten Mal direkt wiederverwendet
Der Schlüssel zu diesem Mechanismus liegt in der Datei agent_helpers.py. Sie befindet sich im Arbeitsbereich des Agenten, nicht im Quellcodeverzeichnis des Frameworks. Der Agent kann diese Datei frei modifizieren und beliebige benötigte Hilfsfunktionen hinzufügen.
Code-Beispiel
# agent-workspace/agent_helpers.py
# Vom Agent automatisch generierte Hilfsfunktionen
def scroll_to_bottom(times=10):
"""Zum Seitenende scrollen, um mehr Inhalte zu laden"""
for _ in range(times):
js("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2)
def extract_video_urls():
"""Alle Video-Links aus der Seite extrahieren"""
return js("""
Array.from(document.querySelectorAll('video source'))
.map(el => el.src)
.filter(src => src)
""")
def download_file(url, filename):
"""Datei lokal herunterladen"""
import urllib.request
urllib.request.urlretrieve(url, filename)
Wenn der Agent Aufgaben ausführt, werden diese benutzerdefinierten Funktionen automatisch geladen. Das Framework injiziert sie über from agent_helpers import * in die REPL-Umgebung.
Warum das wichtig ist
Die Erweiterung traditioneller Automatisierungsframeworks erfordert: 1. Verständnis des Plugin-Mechanismus des Frameworks 2. Befolgung strenger API-Spezifikationen 3. Veröffentlichung im Paketmanager 4. Warten auf die Installation durch Benutzer
Der Selbstheilungsmechanismus von Browser Harness macht Erweiterungen sofort und personalisiert: - Der Agent generiert Code basierend auf den aktuellen Aufgabenanforderungen - Code wird lokal gespeichert und ist sofort verfügbar - Keine Veröffentlichung oder Installation erforderlich - Der Agent jedes Benutzers entwickelt sich basierend auf seinen eigenen Nutzungsmustern weiter
Das ist die Bedeutung von "das Framework wird mit der Nutzung immer besser". Je mehr Aufgaben dein Agent verarbeitet hat, desto reicher ist die Sammlung an Hilfsfunktionen, die er angesammelt hat, und desto effizienter kann er zukünftig ähnliche Aufgaben bewältigen.
Technische Implementierungsdetails
Chrome DevTools Protocol (CDP)
Das Kernkommunikationsprotokoll von Browser Harness ist CDP. CDP ist die Debug-Schnittstelle des Chrome-Browsers, die es externen Programmen ermöglicht, nahezu jedes Verhalten des Browsers zu steuern.
# Die cdp()-Funktion in helpers.py
def cdp(method, session_id=None, **params):
"""CDP-Methode direkt aufrufen"""
return _send({
"method": method,
"params": params,
"session_id": session_id
}).get("result", {})
# Anwendungsbeispiele
cdp("Page.navigate", url="https://example.com")
cdp("Input.dispatchMouseEvent", type="mousePressed", x=100, y=200)
cdp("Runtime.evaluate", expression="document.title")
Die Vorteile von CDP: - Keine Selektoren erforderlich: Direkt über Koordinaten klicken, komplexe CSS/XPath-Selektoren umgehen - Cross-Origin-Unterstützung: CDP arbeitet auf Browser-Ebene, nicht durch Same-Origin-Policy eingeschränkt - Vollständige Kontrolle: Zugriff auf Netzwerkanfragen, DOM, JavaScript-Laufzeit, Leistungsdaten usw.
Interprozesskommunikation (IPC)
Browser Harness verwendet Unix Sockets (POSIX) oder TCP (Windows) für die Kommunikation zwischen CLI und Daemon.
# Kernlogik in _ipc.py
def connect(name, timeout=1.0):
"""Verbindung zum Daemon herstellen"""
if not IS_WINDOWS:
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(str(_sock_path(name)))
return s, None
# Windows verwendet TCP
port, token = _read_port_file(name)
s = socket.create_connection(("127.0.0.1", port))
return s, token
def request(c, token, req):
"""Anfrage senden und Antwort empfangen"""
if token:
req = {**req, "token": token}
c.sendall((json.dumps(req) + "\n").encode())
data = b""
while not data.endswith(b"\n"):
chunk = c.recv(1 << 16)
if not chunk:
break
data += chunk
return json.loads(data or b"{}")
Die Vorteile dieses Designs: - Geringe Latenz: Unix Sockets sind viel schneller als HTTP - Sicherheit: Unix Sockets kontrollieren Zugriff über Dateiberechtigungen - Einfachheit: Keine HTTP-Server, Routing, Serialisierung und andere komplexe Logik erforderlich
Automatische Erkennung von Chrome-Instanzen
daemon.py scannt automatisch das System nach laufenden Chrome-Instanzen:
# Browser-Erkennungslogik in daemon.py
_MAC_PROFILES = (
"Library/Application Support/Google/Chrome",
"Library/Application Support/Google/Chrome Canary",
"Library/Application Support/Arc/User Data",
# ... weitere Browser
)
_LINUX_PROFILES = (
".config/google-chrome",
".config/chromium",
".config/microsoft-edge",
# ... weitere Browser
)
def supported_browser_running():
"""Prüfen, ob unterstützte Browser laufen"""
return any(browser_running_for_profile(base) for base in PROFILES)
Es prüft über die Dateien SingletonLock und DevToolsActivePort, ob ein Browser läuft und ob Remote-Debugging aktiviert ist.
Vergleich mit anderen Browser-Agenten
| Merkmal | Browser Harness | Browser Use | Agent-E | WebVoyager |
|---|---|---|---|---|
| Codeumfang | 3.250 Zeilen | 15.000+ Zeilen | 20.000+ Zeilen | 10.000+ Zeilen |
| Designphilosophie | Minimalismus | Vollständig | Enterprise | Forschungsorientiert |
| Selbstheilung | ✅ Kernmerkmal | ❌ | ❌ | ❌ |
| CDP-Direktzugriff | ✅ | ✅ | ✅ | ✅ |
| Selector-Engines | ❌ Koordinaten bevorzugt | ✅ | ✅ | ✅ |
| Cloud-Browser | ✅ | ✅ | ❌ | ❌ |
| Aufzeichnungsfunktion | ✅ | ✅ | ❌ | ❌ |
| Lernkurve | Niedrig | Mittel | Hoch | Hoch |
Der Kernvorteil von Browser Harness ist Minimalismus + Selbstheilung. Es versucht nicht, alle Funktionen bereitzustellen, sondern lässt den LLM Code basierend auf den Anforderungen dynamisch generieren. Dieses Design ermöglicht es, nie zuvor gesehene Szenarien zu bewältigen, während andere Frameworks im Voraus Adapter schreiben müssen.
Praxisbeispiele: Automatisierung komplexer Web-Aufgaben
Beispiel 1: X (Twitter) Videos herunterladen
# Aufgabe: Lade die neuesten 20 Videos von X herunter
browser-harness <<'PY'
# 1. Zum X-Profil navigieren
goto_url("https://x.com/username/media")
wait_for_load()
# 2. Scrollen, um mehr Posts zu laden
scroll_to_bottom(20) # Vom Agent automatisch generierte Funktion
# 3. Video-URLs extrahieren
videos = extract_video_urls() # Vom Agent automatisch generierte Funktion
# 4. Videos herunterladen
for i, url in enumerate(videos[:20]):
download_file(url, f"video_{i+1}.mp4")
print(f"Downloaded {i+1}/20")
PY
Beispiel 2: Komplexe Formulare ausfüllen
# Aufgabe: Registrierungsformular automatisch ausfüllen
browser-harness <<'PY'
goto_url("https://example.com/register")
wait_for_load()
# Seiteninformationen abrufen
info = page_info()
print(f"Page: {info['title']}")
# Accessibility Tree verwenden, um Formularelemente zu finden
tree = cdp("Accessibility.getFullAXTree")["nodes"]
# Eingabefelder filtern
inputs = [n for n in tree if n.get("role") == "textbox"]
# Formular ausfüllen
for input_node in inputs:
# Koordinaten abrufen
box = cdp("DOM.getBoxModel", backendNodeId=input_node["backendDOMNodeId"])
x = sum(box["model"]["content"][0::2]) / 4
y = sum(box["model"]["content"][1::2]) / 4
# Klicken und eingeben
click_at_xy(x, y)
type_text("test@example.com")
PY
Beispiel 3: Dynamisch geladene Inhalte scrapen
# Aufgabe: Produktliste mit unendlichem Scroll scrapen
browser-harness <<'PY'
goto_url("https://example.com/products")
wait_for_load()
products = []
last_height = 0
# Scrollen bis keine neuen Inhalte mehr kommen
for _ in range(50):
# Aktuelle Produkte abrufen
new_products = js("""
Array.from(document.querySelectorAll('.product-card'))
.map(card => ({
name: card.querySelector('.name').textContent,
price: card.querySelector('.price').textContent
}))
""")
# Prüfen ob neue Inhalte vorhanden
if len(new_products) == len(products):
break
products = new_products
# Scrollen
js("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2)
print(f"Found {len(products)} products")
PY
Einschränkungen und Anwendungsszenarien
Einschränkungen
- Chrome-Abhängigkeit: Unterstützt nur Chrome/Chromium-basierte Browser, kein Firefox/Safari
- Manuelle Aktivierung von Remote-Debugging erforderlich: Beim ersten Mal muss "Remote-Debugging zulassen" in
chrome://inspectaktiviert werden - Koordinaten-Klicks instabil: Änderungen am Seitenlayout können Koordinaten ungültig machen (aber LLM kann sich anpassen)
- Nicht für大规模-Scraping geeignet: Single-Instance-Design, nicht für gleichzeitiges Scrapen von Tausenden von Seiten geeignet
- LLM-Unterstützung erforderlich: Ohne LLM kann die Selbstheilungsfähigkeit nicht genutzt werden
Anwendungsszenarien
✅ Persönliche Automatisierungsaufgaben: Videos herunterladen, Formulare ausfüllen, Daten scrapen ✅ Tests und Debugging: Schnelle Überprüfung von Web-Funktionalitäten ✅ Komplexe Interaktionsabläufe: Mehrstufige Aufgaben mit dynamischen Entscheidungen ✅ Angemeldete Sitzungen: Chrome's Anmeldestatus nutzen, um authentifizierte Websites zu besuchen ✅ Bot-geschützte Websites: Echte Browser verwenden, um Anti-Scraping-Mechanismen zu umgehen
❌ Massen-Datenscraping: Scrapy + Playwright ist besser geeignet ❌ Cross-Browser-Tests: Playwright's Multi-Browser-Unterstützung verwenden ❌ Einfache HTTP-Anfragen: requests/httpx ist effizienter
Installation und Schnellstart
Installation
# Installation mit uv (empfohlen)
uv tool install --python 3.12 browser-harness
# Oder mit pip
pip install browser-harness
Erstkonfiguration
- Chrome öffnen und
chrome://inspect/#remote-debuggingaufrufen - "Remote-Debugging dieser Browser-Instanz zulassen" aktivieren
- Verbindung testen:
browser-harness <<'PY'
print(page_info())
PY
Wenn Informationen zur aktuellen Seite angezeigt werden (URL, Titel, Größe), war die Verbindung erfolgreich.
Integration mit Claude Code
# browser-harness installieren
uv tool install --python 3.12 browser-harness
# Als Skill registrieren
mkdir -p ~/.codex/skills/browser-harness
browser-harness skill > ~/.codex/skills/browser-harness/SKILL.md
Anschließend verwendet der Agent in Claude Code automatisch browser-harness für alle Browser-Aufgaben.
Fazit und Bewertung
Browser Harness repräsentiert einen wichtigen Trend im Design von KI-Agent-Tools: Von komplexen Frameworks hin zum Minimalismus.
Die Kern-Erkenntnis ist: Anstatt zu versuchen, alle möglichen Browser-Operationen vorab zu definieren, ist es besser, minimale Basisfunktionen bereitzustellen und den LLM Code basierend auf spezifischen Aufgaben dynamisch generieren zu lassen. Dieses Design reduziert nicht nur den Codeumfang, sondern erhöht auch die Flexibilität – der Agent kann nie zuvor gesehene Szenarien bewältigen.
Vorteile: - ✅ Extrem schlanker Code, leicht verständlich und anpassbar - ✅ Selbstheilungsmechanismus macht das Framework mit der Nutzung besser - ✅ CDP-Direktzugriff, hervorragende Leistung - ✅ Unterstützt Cloud-Browser, erweiterbar für große Aufgaben - ✅ Aufzeichnungsfunktion für einfaches Debugging und Nachverfolgung
Nachteile: - ❌ Chrome-Abhängigkeit, keine Unterstützung anderer Browser - ❌ Erstkonfiguration erfordert manuelle Aktivierung von Remote-Debugging - ❌ Koordinaten-Klicks instabil bei Layoutänderungen - ❌ Nicht für大规模-gleichzeitige Aufgaben geeignet
Empfehlungsbewertung: ⭐⭐⭐⭐⭐ (5/5)
Für Entwickler, die Browser-Aufgaben automatisieren müssen, ist Browser Harness derzeit die eleganteste Wahl. Sein minimalistisches Design und die Selbstheilungsfähigkeit ermöglichen es, sich an verschiedene komplexe Szenarien anzupassen, während der Codeumfang von 3.000+ Zeilen bedeutet, dass du jede Zeile der Implementierung leicht verstehen kannst.
Wenn du einen KI-Agenten entwickelst oder komplexe Web-Aufgaben automatisieren musst, ist Browser Harness einen Versuch wert. Es könnte deine Sicht auf Browser-Automatisierung verändern – das beste Framework ist nicht das mit den meisten Funktionen, sondern das, das es der KI ermöglicht, Probleme selbst zu lösen.
Referenzlinks: - GitHub: browser-use/browser-harness - Dokumentation: SKILL.md - Installationsanleitung: install.md - Browser Use Cloud: cloud.browser-use.com
FAQ
1. Was ist der Unterschied zwischen Browser Harness und Playwright?
Browser Harness ist ein KI-natives Framework, das darauf ausgelegt ist, dass LLMs den Browser steuern. Es bietet keine Selector-Engines oder fortgeschrittenen Wartemechanismen, sondern arbeitet direkt über CDP mit Koordinaten und DOM. Playwright ist ein traditionelles Automatisierungsframework, das für das Schreiben von Skripten durch Menschen konzipiert ist und umfangreiche Selektoren und Wartemechanismen bietet. Der Kernvorteil von Browser Harness ist die Selbstheilungsfähigkeit – wenn es auf nicht unterstützte Operationen trifft, schreibt der LLM den Code selbst.
2. Welche Browser unterstützt Browser Harness?
Derzeit werden nur Chrome/Chromium-basierte Browser unterstützt, einschließlich Google Chrome, Chrome Canary, Microsoft Edge, Brave, Arc und andere. Firefox und Safari werden nicht unterstützt, da Browser Harness auf dem Chrome DevTools Protocol (CDP) basiert.
3. Wie aktiviere ich Remote-Debugging in Chrome?
Öffne Chrome und rufe chrome://inspect/#remote-debugging auf. Aktiviere "Remote-Debugging dieser Browser-Instanz zulassen". macOS-Benutzer müssen möglicherweise dem Terminal Accessibility-Berechtigungen in den Systemeinstellungen erteilen.
4. Ist Browser Harness für大规模-Scraping geeignet?
Nein. Browser Harness ist im Single-Instance-Design konzipiert und hauptsächlich für persönliche Automatisierungsaufgaben gedacht. Wenn du Tausende von Seiten gleichzeitig scrapen musst, verwende Scrapy + Playwright oder die Cloud-Browser-Funktion von Browser Use Cloud.
5. Wie funktioniert der Selbstheilungsmechanismus?
Wenn der Agent auf eine Operation trifft, die das Framework nicht abdeckt, schreibt er eine neue Python-Funktion und speichert sie in der Datei agent-workspace/agent_helpers.py. Beim nächsten Ausführen einer Aufgabe wird diese Funktion automatisch geladen. Auf diese Weise "lernt" das Framework neue Fähigkeiten und wird mit der Nutzung besser.