Browser Automation in Go: Selenium, chromedp, Playwright, ZenRows
Selenium, chromedp, Playwright, ZenRows – in Go.
Die Wahl des richtigen Browser-Automatisierungs-Stacks und Web-Scraping in Go beeinflusst Geschwindigkeit, Wartung und den Ort, an dem Ihr Code läuft.
Dieser Überblick vergleicht chromedp, Playwright for Go, Selenium (Go-Client) und ZenRows mit Codebeispielen für jedes Tool, damit Sie die beste Wahl für Scraping, E2E-Tests oder geplante Automatisierung treffen können.

TL;DR - Schnellvergleich
| Tool | Browser-Bereich | Laufzeit | Bestens geeignet |
|---|---|---|---|
| chromedp | Chrome/Chromium | Reiner Go, kein Server | Scraping, leichte Automatisierung |
| Playwright Go | Chromium, Firefox, WebKit | Playwright-Binärdateien | E2E-Tests, Kreuzbrowser, Scraping |
| Selenium (Go) | Jeder WebDriver | Driver oder Grid | Legacy-Suiten, breites Ökosystem |
| ZenRows | Cloud (API/Browser) | HTTP von Go | Scraping mit Proxys/anti-Bot |
Wann welches Tool verwenden
chromedp - Idiomatisches Go-Modul, das Chrome/Chromium über das Chrome DevTools Protocol (CDP) steuert. Kein WebDriver oder Selenium-Server; kein externer Laufzeitumgebung. Ideal für Scraping und leichte Automatisierung, wenn nur Chrome akzeptabel ist. Der Hauptunterschied zu Playwright for Go besteht darin, dass chromedp reiner Go ist und Chrome-only ist, während Playwright mehrere Browser unterstützt und die Installation von Browser-Binärdateien erfordert.
Playwright for Go - Community-gemainte Go-Bindungen für Microsoft Playwright. Eine API für Chromium, Firefox und WebKit; automatisches Warten auf Elemente; moderne Selektoren und Features. Verwenden Sie es, wenn Sie E2E-Tests mit Kreuzbrowser oder eine testorientierte API benötigen und mit einem zusätzlichen Installations-Schritt für Browser einverstanden sind.
Selenium (Go) - Der klassische WebDriver-Ansatz: ein Go-Client kommuniziert mit einem Browser-Drive (ChromeDriver, GeckoDriver usw.). Selenium unterstützt Go; Sie laufen einen Driver-Prozess oder verbinden sich mit einem Grid. Verwenden Sie es für Legacy-Suiten oder wenn Sie das breiteste Ökosystem benötigen; für neue Go-Projekte vereinfachen chromedp oder Playwright for Go oft die Einrichtung.
ZenRows - Kein Drive-Modul, sondern eine Scraper-API (und optionaler Scraping Browser), den Sie von Go über HTTP aufrufen. ZenRows verarbeitet headless Browser, JS-Rendern, Wohnungsproxys, anti-Bot-Überwindung und CAPTCHA. Verwenden Sie es, wenn Ihr Ziel das Scraping ist und Sie auf Blocks oder Rate-Limits stoßen; für lokale E2E-Tests sind chromedp oder Playwright in der Regel ausreichend.
Für einen schnellen Referenzpunkt zu Go-Tools und Struktur siehe Go Projektstruktur: Praktiken & Muster; die Aufbewahrung von Automatisierung in einem dedizierten Paket passt gut zu internal/ oder pkg/.
chromedp: reiner Go, Chrome-only
chromedp benötigt keine dritten Binärdateien: es implementiert die CDP in Go und startet (oder verbindet sich mit) Chrome/Chromium. Installieren Sie:
go get -u github.com/chromedp/chromedp
Beispiel: navigieren, Titel lesen und Text über Selektor extrahieren. Alle Aktionen laufen innerhalb von chromedp.Run; verwenden Sie chromedp.ByQuery für CSS-Selektoren.
package main
import (
"context"
"fmt"
"log"
"github.com/chromedp/chromedp"
)
func main() {
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var title string
var bodyText string
err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com"),
chromedp.Title(&title),
chromedp.Text("h1", &bodyText, chromedp.ByQuery),
)
if err != nil {
log.Fatal(err)
}
fmt.Println("Titel:", title)
fmt.Println("Überschrift:", bodyText)
}
Beispiel: klicken und aktualisierten HTML lesen. Verwenden Sie chromedp.Click und chromedp.OuterHTML (oder chromedp.InnerHTML) mit chromedp.ByQuery. Ersetzen Sie targetURL mit Ihrer Seite (z. B. ein Testserver oder jede URL):
targetURL := "https://example.com"
var outerBefore, outerAfter string
err := chromedp.Run(ctx,
chromedp.Navigate(targetURL),
chromedp.OuterHTML("#content", &outerBefore, chromedp.ByQuery),
chromedp.Click("#content", chromedp.ByQuery),
chromedp.OuterHTML("#content", &outerAfter, chromedp.ByQuery),
)
Standardmäßig läuft Chrome headless. Um ein Fenster anzuzeigen oder Flags zu ändern, verwenden Sie einen benutzerdefinierten Allocator (siehe das chromedp ExecAllocator Beispiel). Für Docker oder CI bietet das chromedp/headless-shell Bild eine kleinere headless Chrome-Buildversion, die chromedp ohne Installation von Chrome auf dem Host verwenden kann.
Weitere Beispiele (Screenshots, PDFs, Formulare, Cookies) finden Sie im chromedp/examples Repository.
Playwright for Go: Kreuzbrowser, automatisches Warten
Playwright for Go bietet die gleichen multibrowser- und automatischen Wartezeiten-Features wie Playwright in anderen Sprachen. Installieren Sie die Bibliothek und dann die Browser-Binärdateien:
go get -u github.com/playwright-community/playwright-go
go run github.com/playwright-community/playwright-go/cmd/playwright@latest install --with-deps
Beispiel: Chromium starten, eine Seite öffnen, einen Screenshot machen. Sie können pw.Firefox oder pw.WebKit für andere Motoren verwenden.
package main
import (
"log"
"github.com/playwright-community/playwright-go"
)
func main() {
pw, err := playwright.Run()
if err != nil {
log.Fatalf("konnte Playwright nicht starten: %v", err)
}
defer pw.Stop()
browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{Headless: playwright.Bool(true)})
if err != nil {
log.Fatalf("konnte Chromium nicht starten: %v", err)
}
defer browser.Close()
page, err := browser.NewPage()
if err != nil {
log.Fatalf("konnte keine Seite erstellen: %v", err)
}
_, err = page.Goto("https://example.com")
if err != nil {
log.Fatalf("konnte nicht navigieren: %v", err)
}
_, err = page.Screenshot(playwright.PageScreenshotOptions{Path: playwright.String("example.png")})
if err != nil {
log.Fatalf("konnte keinen Screenshot machen: %v", err)
}
}
Beispiel: ein Formular füllen und Text erhalten. Playwright wartet automatisch auf Elemente, die handlbar sind, was im Vergleich zu roher CDP oder Selenium ohne explizite Wartezeiten die Stabilität reduziert.
page.Goto("https://example.com/login")
page.Locator("#username").Fill("user")
page.Locator("#password").Fill("secret")
page.Locator("button[type=submit]").Click()
content, _ := page.Locator("h1").TextContent()
fmt.Println(content)
Sie können Playwright for Go sowohl für Web-Scraping als auch für Tests verwenden: navigieren, klicken, HTML- oder Text extrahieren und optional den ZenRows Scraping Browser über dessen CDP/Playwright-kompatiblen Endpunkt steuern, wenn Sie anti-Bot oder Proxys benötigen.
Selenium (Go-Client)
Die WebDriver-API von Selenium ist in Go über Community-Clients (z. B. tebeka/selenium) verfügbar. Sie laufen einen Browser-Drive (ChromeDriver, GeckoDriver) oder verbinden sich mit einem Grid; der Go-Code sendet WebDriver-Befehle. Ja, Selenium unterstützt Go – Sie müssen nur den Drive-Prozess verwalten oder ein Cloud-Grid verwenden.
Beispiel: Verbindung zu ChromeDriver, Navigieren, Titel erhalten. Der Drive muss laufen (z. B. chromedriver --port=4444 oder Selenium Manager in Selenium 4).
package main
import (
"fmt"
"log"
"github.com/tebeka/selenium"
)
func main() {
caps := selenium.Capabilities{"browserName": "chrome"}
wd, err := selenium.NewRemote(caps, "http://localhost:4444/wd/hub")
if err != nil {
log.Fatal(err)
}
defer wd.Quit()
err = wd.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
title, err := wd.Title()
if err != nil {
log.Fatal(err)
}
fmt.Println("Titel:", title)
}
Für neue Go-Projekte sind chromedp (kein Drive) oder Playwright for Go (multibrowser, automatisches Warten) oft einfacher; verwenden Sie Selenium, wenn Sie bestehende WebDriver-Suiten verwalten oder ein bestimmtes Grid benötigen.
ZenRows: Scraper API von Go
ZenRows bietet eine Scraper API (HTTP) und einen optionalen Scraping Browser (CDP/Playwright-kompatibel). Von Go aus verwenden Sie in der Regel die Scraper API: senden Sie eine GET- (oder POST-)Anfrage mit dem Ziel-URL und Optionen; ZenRows gibt das gerenderte HTML oder andere Formate zurück. Kein lokaler Browser zu verwalten. Verwenden Sie ZenRows, wenn das Scraping das Ziel ist und Sie Proxys, anti-Bot-Überwindung oder CAPTCHA-Verarbeitung benötigen; für einfache lokale Automatisierung sind chromedp oder Playwright ausreichend.
Installieren Sie die offizielle Go-SDK:
go get github.com/zenrows/zenrows-go-sdk/service/api
Beispiel: einfache GET-Anfrage mit der ZenRows Scraper API. Legen Sie Ihren API-Schlüssel über den Client oder die Umgebungsvariable ZENROWS_API_KEY fest.
package main
import (
"context"
"fmt"
"log"
scraperapi "github.com/zenrows/zenrows-go-sdk/service/api"
)
func main() {
client := scraperapi.NewClient(
scraperapi.WithAPIKey("YOUR_API_KEY"),
)
response, err := client.Get(context.Background(), "https://example.com", nil)
if err != nil {
log.Fatal(err)
}
if err := response.Error(); err != nil {
log.Fatal(err)
}
fmt.Println("Body-Länge:", len(response.Body()))
fmt.Println("Status:", response.Status())
}
Beispiel: JS-Rendern und Premium-Proxys. Passen Sie das Verhalten mit RequestParameters an:
params := &scraperapi.RequestParameters{
JSRender: true,
UsePremiumProxies: true,
ProxyCountry: "US",
}
response, err := client.Get(context.Background(), "https://example.com", params)
if err != nil {
log.Fatal(err)
}
if err := response.Error(); err != nil {
log.Fatal(err)
}
html := response.String()
Das SDK unterstützt Konkurrenzbeschränkungen (WithMaxConcurrentRequests), Wiederholungen (WithMaxRetryCount, WithRetryWaitTime) und andere Optionen; siehe die ZenRows Scraper API Go SDK Dokumentation.
Zusammenfassung
- chromedp: Reiner Go, CDP, Chrome-only; kein Drive. Verwenden Sie es für schnelle, geringe Overhead-Automatisierung und Scraping. Führen Sie es bei Bedarf in Docker mit chromedp/headless-shell aus.
- Playwright for Go: Multibrowser, automatisches Warten, testfreundlich. Verwenden Sie es für E2E-Tests oder wenn Sie eine API für Chromium, Firefox und WebKit benötigen; auch gut für Scraping.
- Selenium (Go): WebDriver von Go; Drive oder Grid erforderlich. Verwenden Sie es, wenn Sie bestehende Selenium-Suiten verwalten oder ein bestimmtes Grid benötigen.
- ZenRows: Scraper API (und Scraping Browser) von Go. Verwenden Sie es, wenn das Scraping das Ziel ist und Sie Resilienz gegenüber Blocks, Rate-Limits und anti-Bot benötigen.
Für weitere Go-Praktiken – Linter, Projektlayout und Abhängigkeitsinjektion – siehe Go Linters: Essential Tools for Code Quality, Dependency Injection in Go: Patterns & Best Practices, und den Go Cheatsheet. Wenn Sie Browser-Automatisierung mit LLM-Pipelines in Go kombinieren, sind die Go SDKs for Ollama und Reranking with Ollama and Qwen3 Embedding in Go nützliche Referenzen.
Verwandte Beiträge
- Go Cheatsheet
- Go Linters: Essential Tools for Code Quality
- Go Projektstruktur: Praktiken & Muster
- Dependency Injection in Go: Patterns & Best Practices
- Go SDKs for Ollama - Vergleich mit Beispielen
- Reranking von Textdokumenten mit Ollama und Qwen3 Embedding-Modell - in Go
- chromedp - Go-Paket
- chromedp Beispiele
- Playwright for Go
- playwright-go GitHub
- ZenRows Scraper API Go SDK
- ZenRows Dokumentation
- Chrome DevTools Protocol