Browser Automatisering in Go: Selenium, chromedp, Playwright, ZenRows
Selenium, chromedp, Playwright, ZenRows - in Go.
Het kiezen van de juiste browser automatisering stack en webscraping in Go heeft invloed op snelheid, onderhoud en waar je code draait.
Deze overzicht vergelijkt chromedp, Playwright for Go, Selenium (Go client) en ZenRows vanuit Go met codevoorbeelden voor elk, zodat je de beste keuze kunt maken voor scraping, E2E tests of geplande automatisering.

TL;DR - Snelle vergelijking
| Tool | Browser scope | Runtime | Best for |
|---|---|---|---|
| chromedp | Chrome/Chromium | Pure Go, geen server | Scraping, lichte automatisering |
| Playwright Go | Chromium, Firefox, WebKit | Playwright binaries | E2E tests, cross-browser, scraping |
| Selenium (Go) | Elke WebDriver | Driver of grid | Oudere suites, breed ecosysteem |
| ZenRows | Cloud (API/Browser) | HTTP vanaf Go | Scraping met proxies/anti-bot |
Wanneer welke te gebruiken
chromedp - Idiomatische Go bibliotheek die Chrome/Chromium aandrijft via de Chrome DevTools Protocol (CDP). Geen WebDriver of Selenium server; geen externe runtime. Ideaal voor scraping en lichte automatisering wanneer alleen Chrome toegestaan is. De belangrijkste verschil met Playwright for Go is dat chromedp puur Go is en alleen Chrome ondersteunt, terwijl Playwright meerdere browsers ondersteunt en het installeren van browser binaries vereist.
Playwright for Go - Community onderhouden Go bindings voor Microsoft Playwright. Een API voor Chromium, Firefox en WebKit; automatisch wachten op elementen; moderne selectors en functies. Gebruik het wanneer je cross-browser E2E tests nodig hebt of een testgerichte API en het extra installatiestap voor browsers acceptabel is.
Selenium (Go) - De klassieke WebDriver aanpak: een Go client communiceert met een browser driver (ChromeDriver, GeckoDriver, enz.). Selenium ondersteunt Go; je draait een driver proces of verbindt met een grid. Gebruik het voor oude suites of wanneer je het breedste ecosysteem nodig hebt; voor nieuwe Go projecten vereenvoudigt chromedp of Playwright for Go vaak de setup.
ZenRows - Niet een driver bibliotheek maar een Scraper API (en optionele Scraping Browser) die je vanaf Go over HTTP kunt aanroepen. ZenRows verwerkt headless browsers, JS rendering, woonwijk proxies, anti-bot omzeiling en CAPTCHA. Gebruik het wanneer je doel scraping is en je blokkeringen of rate limits tegenkomt; voor lokale E2E tests zijn chromedp of Playwright meestal voldoende.
Voor een snelle referentie van Go tools en structuur, zie Go Project Structure: Practices & Patterns; het houden van automatisering in een aparte package past goed bij internal/ of pkg/.
chromedp: puur Go, alleen Chrome
chromedp vereist geen derde partij binaries: het implementeert de CDP in Go en start (of verbindt met) Chrome/Chromium. Installeer:
go get -u github.com/chromedp/chromedp
Voorbeeld: navigeer, lees titel en extraheer tekst via selector. Alle acties worden uitgevoerd binnen chromedp.Run; gebruik chromedp.ByQuery voor CSS selectors.
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("Title:", title)
fmt.Println("Heading:", bodyText)
}
Voorbeeld: klik en lees bijgewerkte HTML. Gebruik chromedp.Click en chromedp.OuterHTML (of chromedp.InnerHTML) met chromedp.ByQuery. Vervang targetURL met je pagina (bijvoorbeeld een testserver of enige 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),
)
Standaard draait Chrome headless. Om een venster te tonen of flags te wijzigen, gebruik een aangepaste allocator (zie het chromedp ExecAllocator voorbeeld). Voor Docker of CI, biedt de chromedp/headless-shell image een kleinere headless Chrome build die chromedp direct kan gebruiken - dus je kunt chromedp in headless omgevingen uitvoeren zonder Chrome op de host te installeren.
Meer voorbeelden (schermafdrukken, PDFs, formulieren, cookies) zijn in de chromedp/examples repository.
Playwright for Go: cross-browser, auto-wait
Playwright for Go biedt dezelfde multi-browser en auto-wait functies als Playwright in andere talen. Installeer de bibliotheek en vervolgens de browser binaries:
go get -u github.com/playwright-community/playwright-go
go run github.com/playwright-community/playwright-go/cmd/playwright@latest install --with-deps
Voorbeeld: start Chromium, open een pagina, neem een schermafdruk. Je kunt pw.Firefox of pw.WebKit gebruiken voor andere engines.
package main
import (
"log"
"github.com/playwright-community/playwright-go"
)
func main() {
pw, err := playwright.Run()
if err != nil {
log.Fatalf("kon Playwright niet starten: %v", err)
}
defer pw.Stop()
browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{Headless: playwright.Bool(true)})
if err != nil {
log.Fatalf("kon Chromium niet starten: %v", err)
}
defer browser.Close()
page, err := browser.NewPage()
if err != nil {
log.Fatalf("kon pagina niet maken: %v", err)
}
_, err = page.Goto("https://example.com")
if err != nil {
log.Fatalf("kon niet navigeren: %v", err)
}
_, err = page.Screenshot(playwright.PageScreenshotOptions{Path: playwright.String("example.png")})
if err != nil {
log.Fatalf("kon geen schermafdruk maken: %v", err)
}
}
Voorbeeld: vul een formulier en haal tekst op. Playwright wacht automatisch op elementen om actiebaar te zijn, wat flakker verminderd vergeleken met ruwe CDP of Selenium zonder expliciete wachten.
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)
Je kunt Playwright for Go gebruiken voor web scraping alsook testen: navigeer, klik, extraheer HTML of tekst, en optioneel stuur ZenRows’ Scraping Browser via zijn CDP/Playwright-compatibele endpoint wanneer je anti-bot of proxies nodig hebt.
Selenium (Go client)
Selenium’s WebDriver API is beschikbaar in Go via community clients (bijvoorbeeld tebeka/selenium). Je draait een browser driver (ChromeDriver, GeckoDriver) of verbindt met een grid; de Go code stuurt WebDriver opdrachten. Dus ja, Selenium ondersteunt Go - je moet alleen het driver proces beheren of een cloud grid gebruiken.
Voorbeeld: verbind met ChromeDriver, navigeer, haal titel op. Het driver moet draaien (bijvoorbeeld chromedriver --port=4444 of 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("Title:", title)
}
Voor nieuwe Go projecten zijn chromedp (geen driver) of Playwright for Go (multi-browser, auto-wait) vaak eenvoudiger; gebruik Selenium wanneer je al WebDriver suites onderhoudt of een specifieke grid nodig hebt.
ZenRows: Scraper API vanaf Go
ZenRows biedt een Scraper API (HTTP) en een optionele Scraping Browser (CDP/Playwright-compatibel). Vanaf Go gebruik je meestal de Scraper API: stuur een GET (of POST) met de doel URL en opties; ZenRows geeft de gerenderde HTML of andere formaten terug. Geen lokale browser om te beheren. Gebruik ZenRows wanneer scraping het doel is en je proxies, anti-bot omzeiling of CAPTCHA verwerking nodig hebt; voor eenvoudige lokale automatisering zijn chromedp of Playwright voldoende.
Installeer de officiële Go SDK:
go get github.com/zenrows/zenrows-go-sdk/service/api
Voorbeeld: eenvoudige GET met de ZenRows Scraper API. Stel je API sleutel in via de client of ZENROWS_API_KEY omgevingsvariabele.
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 length:", len(response.Body()))
fmt.Println("Status:", response.Status())
}
Voorbeeld: JS rendering en premium proxies. Pas gedrag aan met RequestParameters:
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()
De SDK ondersteunt concurrentie limieten (WithMaxConcurrentRequests), herproeven (WithMaxRetryCount, WithRetryWaitTime) en andere opties; zie de ZenRows Scraper API Go SDK documentatie.
Samenvatting
- chromedp: Puur Go, CDP, alleen Chrome; geen driver. Gebruik voor snelle, lage overhead automatisering en scraping. Voer uit in Docker met chromedp/headless-shell indien nodig.
- Playwright for Go: Multi-browser, auto-wait, testvriendelijk. Gebruik voor E2E tests of wanneer je één API voor Chromium, Firefox en WebKit wilt; ook geschikt voor scraping.
- Selenium (Go): WebDriver vanaf Go; driver of grid vereist. Gebruik wanneer je bestaande Selenium suites onderhoudt of een specifieke grid nodig hebt.
- ZenRows: Scraper API (en Scraping Browser) vanaf Go. Gebruik wanneer scraping het doel is en je resistentie tegen blokkeringen, rate limits en anti-bot nodig hebt.
Voor meer Go praktijken-linters, projectlayout en afhankelijkheid injectie, zie Go Linters: Essential Tools for Code Quality, Dependency Injection in Go: Patterns & Best Practices, en de Go Cheatsheet. Als je browser automatisering combineert met LLM pipelines in Go, zijn de Go SDKs for Ollama en Reranking with Ollama and Qwen3 Embedding in Go nuttige referenties.
Gerelateerde berichten
- Go Cheatsheet
- Go Linters: Essential Tools for Code Quality
- Go Project Structure: Practices & Patterns
- Dependency Injection in Go: Patterns & Best Practices
- Go SDKs for Ollama - comparison with examples
- Reranking text documents with Ollama and Qwen3 Embedding model - in Go
- chromedp - Go package
- chromedp examples
- Playwright for Go
- playwright-go GitHub
- ZenRows Scraper API Go SDK
- ZenRows documentation
- Chrome DevTools Protocol