L'automatisation du navigateur en Go : Selenium, chromedp, Playwright, ZenRows
Selenium, chromedp, Playwright, ZenRows - en Go.
Le choix de la bonne stack d’automatisation du navigateur et webscraping en Go affecte la vitesse, la maintenance et l’endroit où votre code s’exécute.
Ce résumé compare chromedp, Playwright for Go, Selenium (client Go) et ZenRows avec des exemples de code pour chacun afin que vous puissiez choisir l’option la plus adaptée au webscraping, aux tests E2E ou à l’automatisation planifiée.

TL;DR - Comparaison rapide
| Outil | Portée du navigateur | Exécution | Meilleur pour |
|---|---|---|---|
| chromedp | Chrome/Chromium | Pure Go, aucun serveur | Scraping, automatisation légère |
| Playwright Go | Chromium, Firefox, WebKit | Binaires Playwright | Tests E2E, multinavigateur, scraping |
| Selenium (Go) | Tout WebDriver | Driver ou grille | Suites héritées, écosystème large |
| ZenRows | Cloud (API/Navigateur) | HTTP depuis Go | Scraping avec proxys/anti-bot |
Quand utiliser lequel
chromedp - Bibliothèque idiomatique Go qui pilote Chrome/Chromium via le Chrome DevTools Protocol (CDP). Aucun WebDriver ou serveur Selenium ; aucun runtime externe. Idéal pour le scraping et l’automatisation légère lorsque l’utilisation de Chrome uniquement est acceptable. La principale différence avec Playwright for Go est que chromedp est pure Go et Chrome uniquement, tandis que Playwright prend en charge plusieurs navigateurs et nécessite l’installation des binaires de navigateur.
Playwright for Go - Liens Go communautaires pour Microsoft Playwright. Une seule API pour Chromium, Firefox et WebKit ; attente automatique des éléments ; sélecteurs et fonctionnalités modernes. Utilisez-le lorsque vous avez besoin de tests E2E multinavigateur ou d’une API orientée test et que vous êtes d’accord avec une étape supplémentaire d’installation des navigateurs.
Selenium (Go) - L’approche classique WebDriver : un client Go communique avec un pilote de navigateur (ChromeDriver, GeckoDriver, etc.). Selenium prend en charge Go ; vous exécutez un processus de pilote ou vous vous connectez à une grille. Utilisez-le pour les suites héritées ou lorsque vous avez besoin de l’écosystème le plus large ; pour de nouveaux projets Go, chromedp ou Playwright for Go simplifient souvent l’installation.
ZenRows - Ce n’est pas une bibliothèque de pilote mais un Scraper API (et un navigateur de scraping optionnel) que vous appelez depuis Go via HTTP. ZenRows gère les navigateurs headless, le rendu JS, les proxys résidentiels, le contournement anti-bot et les CAPTCHA. Utilisez-le lorsque votre objectif est le scraping et que vous rencontrez des blocages ou des limites de taux ; pour les tests E2E locaux, chromedp ou Playwright sont généralement suffisants.
Pour un référentiel rapide des outils Go et de la structure, consultez Go Project Structure: Practices & Patterns; placer l’automatisation dans un package dédié s’intègre bien avec internal/ ou pkg/.
chromedp : pure Go, Chrome uniquement
chromedp n’exige aucun binaires tiers : il implémente le CDP en Go et lance (ou se connecte à) Chrome/Chromium. Installation :
go get -u github.com/chromedp/chromedp
Exemple : naviguer, lire le titre et extraire le texte par sélecteur. Toutes les actions s’exécutent à l’intérieur de chromedp.Run ; utilisez chromedp.ByQuery pour les sélecteurs CSS.
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("Titre :", title)
fmt.Println("En-tête :", bodyText)
}
Exemple : cliquer et lire le HTML mis à jour. Utilisez chromedp.Click et chromedp.OuterHTML (ou chromedp.InnerHTML) avec chromedp.ByQuery. Remplacez targetURL par votre page (par exemple, un serveur de test ou tout 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),
)
Par défaut, Chrome s’exécute en headless. Pour afficher une fenêtre ou changer les paramètres, utilisez un allocateur personnalisé (voir l’exemple chromedp ExecAllocator). Pour Docker ou CI, l’image chromedp/headless-shell fournit une version headless de Chrome plus petite que chromedp peut utiliser directement – vous pouvez ainsi exécuter chromedp dans des environnements headless sans installer Chrome sur l’hôte.
D’autres exemples (captures d’écran, PDF, formulaires, cookies) sont disponibles dans le dépôt chromedp/examples.
Playwright for Go : multinavigateur, attente automatique
Playwright for Go vous offre les mêmes fonctionnalités de multinavigateur et d’attente automatique que Playwright dans d’autres langages. Installez la bibliothèque puis les binaires de navigateur :
go get -u github.com/playwright-community/playwright-go
go run github.com/playwright-community/playwright-go/cmd/playwright@latest install --with-deps
Exemple : lancer Chromium, ouvrir une page, prendre une capture d’écran. Vous pouvez utiliser pw.Firefox ou pw.WebKit pour d’autres moteurs.
package main
import (
"log"
"github.com/playwright-community/playwright-go"
)
func main() {
pw, err := playwright.Run()
if err != nil {
log.Fatalf("could not launch playwright: %v", err)
}
defer pw.Stop()
browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{Headless: playwright.Bool(true)})
if err != nil {
log.Fatalf("could not launch Chromium: %v", err)
}
defer browser.Close()
page, err := browser.NewPage()
if err != nil {
log.Fatalf("could not create page: %v", err)
}
_, err = page.Goto("https://example.com")
if err != nil {
log.Fatalf("could not goto: %v", err)
}
_, err = page.Screenshot(playwright.PageScreenshotOptions{Path: playwright.String("example.png")})
if err != nil {
log.Fatalf("could not screenshot: %v", err)
}
}
Exemple : remplir un formulaire et obtenir du texte. Playwright attend automatiquement les éléments pour être actionnables, ce qui réduit la fragilité par rapport à CDP brute ou à Selenium sans attentes explicites.
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)
Vous pouvez utiliser Playwright for Go pour le webscraping ainsi que pour les tests : naviguer, cliquer, extraire du HTML ou du texte, et éventuellement piloter le navigateur de scraping de ZenRows via son point d’accès CDP/Playwright compatible lorsqu’il vous faut des proxys ou un contournement anti-bot.
Selenium (client Go)
L’API WebDriver de Selenium est disponible en Go via des clients communautaires (ex. tebeka/selenium). Vous exécutez un pilote de navigateur (ChromeDriver, GeckoDriver) ou vous vous connectez à une grille ; le code Go envoie des commandes WebDriver. Oui, Selenium prend en charge Go – vous avez juste besoin de gérer le processus du pilote ou d’utiliser une grille cloud.
Exemple : se connecter à ChromeDriver, naviguer, obtenir le titre. Le pilote doit être en cours d’exécution (ex. chromedriver --port=4444 ou Selenium Manager en 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("Titre :", title)
}
Pour de nouveaux projets Go, chromedp (sans pilote) ou Playwright for Go (multinavigateur, attente automatique) sont souvent plus simples ; utilisez Selenium lorsque vous avez déjà des suites WebDriver ou que vous avez besoin d’une grille spécifique.
ZenRows : Scraper API depuis Go
ZenRows expose un Scraper API (HTTP) et un navigateur de scraping optionnel (compatible CDP/Playwright). Depuis Go, vous utilisez généralement le Scraper API : envoyez une requête GET (ou POST) avec l’URL cible et les options ; ZenRows renvoie le HTML rendu ou d’autres formats. Aucun navigateur local à gérer. Utilisez ZenRows lorsque le scraping est l’objectif et que vous avez besoin de proxys, de contournement anti-bot ou de gestion des CAPTCHA ; pour une automatisation locale simple, chromedp ou Playwright sont suffisants.
Installez le SDK Go officiel :
go get github.com/zenrows/zenrows-go-sdk/service/api
Exemple : requête GET simple avec l’API Scraper de ZenRows. Définissez votre clé API via le client ou la variable d’environnement ZENROWS_API_KEY.
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("Longueur du corps :", len(response.Body()))
fmt.Println("Statut :", response.Status())
}
Exemple : rendu JS et proxys premium. Personnalisez le comportement avec 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()
Le SDK prend en charge les limites de concurrence (WithMaxConcurrentRequests), les réessais (WithMaxRetryCount, WithRetryWaitTime) et d’autres options ; consultez les docs du SDK ZenRows Scraper API Go.
Résumé
- chromedp : Pure Go, CDP, Chrome uniquement ; aucun pilote. Utilisez-le pour une automatisation et un scraping rapides et à faible surcharge. Exécutez-le en Docker avec chromedp/headless-shell si nécessaire.
- Playwright for Go : Multinavigateur, attente automatique, test-friendly. Utilisez-le pour les tests E2E ou lorsque vous souhaitez une seule API pour Chromium, Firefox et WebKit ; également adapté au scraping.
- Selenium (Go) : WebDriver depuis Go ; pilote ou grille requis. Utilisez-le lors de la maintenance de suites Selenium existantes ou lorsque vous avez besoin d’une grille spécifique.
- ZenRows : Scraper API (et navigateur de scraping) depuis Go. Utilisez-le lorsque le scraping est l’objectif et que vous avez besoin de résilience face aux blocages, limites de taux et anti-bot.
Pour plus de pratiques Go – linters, dispositions de projet et injection de dépendances – consultez Go Linters: Essential Tools for Code Quality, Dependency Injection in Go: Patterns & Best Practices, et le Go Cheatsheet. Si vous combinez l’automatisation des navigateurs avec des pipelines LLM en Go, les SDKs Go pour Ollama et Reranking avec Ollama et Qwen3 Embedding en Go sont des références utiles.
Articles connexes
- 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