GO

Automates browser tasks and web scraping using the Go-Rod library.

Install

mkdir -p .claude/skills/go-rod-master && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/11039" && unzip -o skill.zip -d .claude/skills/go-rod-master && rm skill.zip

Installs to .claude/skills/go-rod-master

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Comprehensive guide for browser automation and web scraping with go-rod (Chrome DevTools Protocol) including stealth anti-bot-detection patterns.
145 charsno explicit “when” trigger
Intermediate

Key capabilities

  • Scrape dynamic SPA content
  • Automate browser testing
  • Bypass bot detection
  • Intercept network requests
  • Manage browser lifecycle

How it works

It uses the Chrome DevTools Protocol to drive a browser natively, providing thread-safe operations and stealth evasions.

Inputs & outputs

You give it
Target URL and automation logic
You get back
Scraped data or automation result

When to use go-rod-master

  • Scrape dynamic SPA content
  • Automate browser testing
  • Bypass bot detection
  • Intercept network requests

About this skill

Go-Rod Browser Automation Master

Overview

Rod is a high-level Go driver built directly on the Chrome DevTools Protocol for browser automation and web scraping. Unlike wrappers around other tools, Rod communicates with the browser natively via CDP, providing thread-safe operations, chained context design for timeouts/cancellation, auto-wait for elements, correct iframe/shadow DOM handling, and zero zombie browser processes.

The companion library go-rod/stealth injects anti-bot-detection evasions based on puppeteer-extra stealth, hiding headless browser fingerprints from detection systems.

When to Use This Skill

  • Use when the user asks to scrape, automate, or test a website using Go.
  • Use when the user needs a headless browser for dynamic/SPA content (React, Vue, Angular).
  • Use when the user mentions stealth, anti-bot, avoiding detection, Cloudflare, or bot detection bypass.
  • Use when the user wants to work with the Chrome DevTools Protocol (CDP) directly from Go.
  • Use when the user needs to intercept or hijack network requests in a browser context.
  • Use when the user asks about concurrent browser scraping or page pooling in Go.
  • Use when the user is migrating from chromedp or Playwright Go and wants a simpler API.

Safety & Risk

Risk Level: 🔵 Safe

  • Read-Only by Default: Default behavior is navigating and reading page content (scraping/testing).
  • Isolated Contexts: Browser contexts are sandboxed; cookies and storage do not persist unless explicitly saved.
  • Resource Cleanup: Designed around Go's defer pattern — browsers and pages close automatically.
  • No External Mutations: Does not modify external state unless the script explicitly submits forms or POSTs data.

Installation

# Core rod library
go get github.com/go-rod/rod@latest

# Stealth anti-detection plugin (ALWAYS include for production scraping)
go get github.com/go-rod/stealth@latest

Rod auto-downloads a compatible Chromium binary on first run. To pre-download:

go run github.com/nichochar/go-rod.github.io/cmd/launcher@latest

Core Concepts

Browser Lifecycle

Rod manages three layers: Browser → Page → Element.

// Launch and connect to a browser
browser := rod.New().MustConnect()
defer browser.MustClose()

// Create a page (tab)
page := browser.MustPage("https://example.com")

// Find an element
el := page.MustElement("h1")
fmt.Println(el.MustText())

Must vs Error Patterns

Rod provides two API styles for every operation:

StyleMethodUse Case
MustMustElement(), MustClick(), MustText()Scripting, debugging, prototyping. Panics on error.
ErrorElement(), Click(), Text()Production code. Returns error for explicit handling.

Production pattern:

el, err := page.Element("#login-btn")
if err != nil {
    return fmt.Errorf("login button not found: %w", err)
}
if err := el.Click(proto.InputMouseButtonLeft, 1); err != nil {
    return fmt.Errorf("click failed: %w", err)
}

Scripting pattern with Try:

err := rod.Try(func() {
    page.MustElement("#login-btn").MustClick()
})
if errors.Is(err, context.DeadlineExceeded) {
    log.Println("timeout finding login button")
}

Context & Timeout

Rod uses Go's context.Context for cancellation and timeouts. Context propagates recursively to all child operations.

// Set a 5-second timeout for the entire operation chain
page.Timeout(5 * time.Second).
    MustWaitLoad().
    MustElement("title").
    CancelTimeout(). // subsequent calls are not bound by the 5s timeout
    Timeout(30 * time.Second).
    MustText()

Element Selectors

Rod supports multiple selector strategies:

// CSS selector (most common)
page.MustElement("div.content > p.intro")

// CSS selector with text regex matching
page.MustElementR("button", "Submit|Send")

// XPath
page.MustElementX("//div[@class='content']//p")

// Search across iframes and shadow DOM (like DevTools Ctrl+F)
page.MustSearch(".deeply-nested-element")

Auto-Wait

Rod automatically retries element queries until the element appears or the context times out. You do not need manual sleeps:

// This will automatically wait until the element exists
el := page.MustElement("#dynamic-content")

// Wait until the element is stable (position/size not changing)
el.MustWaitStable().MustClick()

// Wait until page has no pending network requests
wait := page.MustWaitRequestIdle()
page.MustElement("#search").MustInput("query")
wait()

Stealth & Anti-Bot Detection (go-rod/stealth)

IMPORTANT: For any production scraping or automation against real websites, ALWAYS use stealth.MustPage() instead of browser.MustPage(). This is the single most important step for avoiding bot detection.

How Stealth Works

The go-rod/stealth package injects JavaScript evasions into every new page that:

  • Remove navigator.webdriver — the primary headless detection signal.
  • Spoof WebGL vendor/renderer — presents real GPU info (e.g., "Intel Inc." / "Intel Iris OpenGL Engine") instead of headless markers like "Google SwiftShader".
  • Fix Chrome plugin array — reports proper PluginArray type with realistic plugin count.
  • Patch permissions API — returns "prompt" instead of bot-revealing values.
  • Set realistic languages — reports en-US,en instead of empty arrays.
  • Fix broken image dimensions — headless browsers report 0x0; stealth fixes this to 16x16.

Usage

Creating a stealth page (recommended for all production use):

import (
    "github.com/go-rod/rod"
    "github.com/go-rod/stealth"
)

browser := rod.New().MustConnect()
defer browser.MustClose()

// Use stealth.MustPage instead of browser.MustPage
page := stealth.MustPage(browser)
page.MustNavigate("https://bot.sannysoft.com")

With error handling:

page, err := stealth.Page(browser)
if err != nil {
    return fmt.Errorf("failed to create stealth page: %w", err)
}
page.MustNavigate("https://example.com")

Using stealth.JS directly (advanced — for custom page creation):

// If you need to create the page yourself (e.g., with specific options),
// inject stealth.JS manually via EvalOnNewDocument
page := browser.MustPage()
page.MustEvalOnNewDocument(stealth.JS)
page.MustNavigate("https://example.com")

Verifying Stealth

Navigate to a bot detection test page to verify evasions:

page := stealth.MustPage(browser)
page.MustNavigate("https://bot.sannysoft.com")
page.MustScreenshot("stealth_test.png")

Expected results for a properly stealth-configured browser:

  • WebDriver: missing (passed)
  • Chrome: present (passed)
  • Plugins Length: 3 (not 0)
  • Languages: en-US,en

Implementation Guidelines

1. Launcher Configuration

Use the launcher package to customize browser launch flags:

import "github.com/go-rod/rod/lib/launcher"

url := launcher.New().
    Headless(true).             // false for debugging
    Proxy("127.0.0.1:8080").    // upstream proxy
    Set("disable-gpu", "").     // custom Chrome flag
    Delete("use-mock-keychain"). // remove a default flag
    MustLaunch()

browser := rod.New().ControlURL(url).MustConnect()
defer browser.MustClose()

Debugging mode (visible browser + slow motion):

l := launcher.New().
    Headless(false).
    Devtools(true)
defer l.Cleanup()

browser := rod.New().
    ControlURL(l.MustLaunch()).
    Trace(true).
    SlowMotion(2 * time.Second).
    MustConnect()

2. Proxy Support

// Set proxy at launch
url := launcher.New().
    Proxy("socks5://127.0.0.1:1080").
    MustLaunch()

browser := rod.New().ControlURL(url).MustConnect()

// Handle proxy authentication
go browser.MustHandleAuth("username", "password")()

// Ignore SSL certificate errors (for MITM proxies)
browser.MustIgnoreCertErrors(true)

3. Input Simulation

import "github.com/go-rod/rod/lib/input"

// Type into an input field (replaces existing value)
page.MustElement("#email").MustInput("[email protected]")

// Simulate keyboard keys
page.Keyboard.MustType(input.Enter)

// Press key combinations
page.Keyboard.MustPress(input.ControlLeft)
page.Keyboard.MustType(input.KeyA)
page.Keyboard.MustRelease(input.ControlLeft)

// Mouse click at coordinates
page.Mouse.MustClick(input.MouseLeft)
page.Mouse.MustMoveTo(100, 200)

4. Network Request Interception (Hijacking)

router := browser.HijackRequests()
defer router.MustStop()

// Block all image requests
router.MustAdd("*.png", func(ctx *rod.Hijack) {
    ctx.Response.Fail(proto.NetworkErrorReasonBlockedByClient)
})

// Modify request headers
router.MustAdd("*api.example.com*", func(ctx *rod.Hijack) {
    ctx.Request.Req().Header.Set("Authorization", "Bearer token123")
    ctx.MustLoadResponse()
})

// Modify response body
router.MustAdd("*.js", func(ctx *rod.Hijack) {
    ctx.MustLoadResponse()
    ctx.Response.SetBody(ctx.Response.Body() + "\n// injected")
})

go router.Run()

5. Waiting Strategies

// Wait for page load event
page.MustWaitLoad()

// Wait for no pending network requests (AJAX idle)
wait := page.MustWaitRequestIdle()
page.MustElement("#search").MustInput("query")
wait()

// Wait for element to be stable (not animating)
page.MustElement(".modal").MustWaitStable().MustClick()

// Wait for element to become invisible
page.MustElement(".loading").MustWaitInvisible()

// Wait for JavaScript condition
page.MustWait(`() => document.title === 'Ready'`)

// Wait for specific navigation/event
wait := page.WaitEvent(&proto.PageLoadEventFired{})
page.MustNavigate("http

---

*Content truncated.*

When not to use it

  • Non-Go automation tasks
  • DRM-protected content interaction

Prerequisites

Go environmentChromium-compatible browser

Limitations

  • Requires Chromium-compatible browser
  • No CAPTCHA solving included

How it compares

It offers a native Go driver with a chained context design, avoiding the overhead of external wrappers.

Compared to similar skills

go-rod-master side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
go-rod-master (this skill)05moReviewIntermediate
dev-browser534moReviewIntermediate
agent-browser303moReviewIntermediate
browser-tools69moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

dev-browser

SawyerHood

Browser automation with persistent page state. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, or automate browser workflows. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "test the website", "log into", or any browser interaction request.

53176

agent-browser

vercel-labs

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction.

3075

browser-tools

Whamp

Lightweight Chrome automation toolkit with shared configuration, JSON-first output, and six focused scripts for starting, navigating, inspecting, capturing, evaluating, and cleaning up browser sessions.

694

browser

cexll

This skill should be used for browser automation tasks using Chrome DevTools Protocol (CDP). Triggers when users need to launch Chrome with remote debugging, navigate pages, execute JavaScript in browser context, capture screenshots, or interactively select DOM elements. No MCP server required.

346

agent-browser-skill

MGdaasLab

基于 agent-browser CLI 的浏览器自动化工具。提供快照获取、元素交互、截图等功能。推荐用于需要页面快照分析、通过 ref 引用交互元素的场景。

439

browserwing-executor

browserwing

Control browser automation through HTTP API. Supports page navigation, element interaction (click, type, select), data extraction, accessibility snapshot analysis, screenshot, JavaScript execution, and batch operations.

27

Search skills

Search the agent skills registry