{"id":"275cec9b-7113-49c6-a10f-5ce907dfba2f","shortId":"SYYDCx","kind":"skill","title":"go-rod-master","tagline":"Comprehensive guide for browser automation and web scraping with go-rod (Chrome DevTools Protocol) including stealth anti-bot-detection patterns.","description":"# Go-Rod Browser Automation Master\n\n## Overview\n\n[Rod](https://github.com/go-rod/rod) is a high-level Go driver built directly on the [Chrome DevTools Protocol](https://chromedevtools.github.io/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.\n\nThe companion library [go-rod/stealth](https://github.com/go-rod/stealth) injects anti-bot-detection evasions based on [puppeteer-extra stealth](https://github.com/nichochar/puppeteer-extra/tree/master/packages/extract-stealth-evasions), hiding headless browser fingerprints from detection systems.\n\n## When to Use This Skill\n\n- Use when the user asks to **scrape**, **automate**, or **test** a website using Go.\n- Use when the user needs a **headless browser** for dynamic/SPA content (React, Vue, Angular).\n- Use when the user mentions **stealth**, **anti-bot**, **avoiding detection**, **Cloudflare**, or **bot detection bypass**.\n- Use when the user wants to work with the **Chrome DevTools Protocol (CDP)** directly from Go.\n- Use when the user needs to **intercept** or **hijack** network requests in a browser context.\n- Use when the user asks about **concurrent browser scraping** or **page pooling** in Go.\n- Use when the user is migrating from **chromedp** or **Playwright Go** and wants a simpler API.\n\n## Safety & Risk\n\n**Risk Level: 🔵 Safe**\n\n- **Read-Only by Default:** Default behavior is navigating and reading page content (scraping/testing).\n- **Isolated Contexts:** Browser contexts are sandboxed; cookies and storage do not persist unless explicitly saved.\n- **Resource Cleanup:** Designed around Go's `defer` pattern — browsers and pages close automatically.\n- **No External Mutations:** Does not modify external state unless the script explicitly submits forms or POSTs data.\n\n## Installation\n\n```bash\n# Core rod library\ngo get github.com/go-rod/rod@latest\n\n# Stealth anti-detection plugin (ALWAYS include for production scraping)\ngo get github.com/go-rod/stealth@latest\n```\n\nRod auto-downloads a compatible Chromium binary on first run. To pre-download:\n\n```bash\ngo run github.com/nichochar/go-rod.github.io/cmd/launcher@latest\n```\n\n## Core Concepts\n\n### Browser Lifecycle\n\nRod manages three layers: **Browser → Page → Element**.\n\n```go\n// Launch and connect to a browser\nbrowser := rod.New().MustConnect()\ndefer browser.MustClose()\n\n// Create a page (tab)\npage := browser.MustPage(\"https://example.com\")\n\n// Find an element\nel := page.MustElement(\"h1\")\nfmt.Println(el.MustText())\n```\n\n### Must vs Error Patterns\n\nRod provides two API styles for every operation:\n\n| Style | Method | Use Case |\n|:------|:-------|:---------|\n| **Must** | `MustElement()`, `MustClick()`, `MustText()` | Scripting, debugging, prototyping. Panics on error. |\n| **Error** | `Element()`, `Click()`, `Text()` | Production code. Returns `error` for explicit handling. |\n\n**Production pattern:**\n\n```go\nel, err := page.Element(\"#login-btn\")\nif err != nil {\n    return fmt.Errorf(\"login button not found: %w\", err)\n}\nif err := el.Click(proto.InputMouseButtonLeft, 1); err != nil {\n    return fmt.Errorf(\"click failed: %w\", err)\n}\n```\n\n**Scripting pattern with Try:**\n\n```go\nerr := rod.Try(func() {\n    page.MustElement(\"#login-btn\").MustClick()\n})\nif errors.Is(err, context.DeadlineExceeded) {\n    log.Println(\"timeout finding login button\")\n}\n```\n\n### Context & Timeout\n\nRod uses Go's `context.Context` for cancellation and timeouts. Context propagates recursively to all child operations.\n\n```go\n// Set a 5-second timeout for the entire operation chain\npage.Timeout(5 * time.Second).\n    MustWaitLoad().\n    MustElement(\"title\").\n    CancelTimeout(). // subsequent calls are not bound by the 5s timeout\n    Timeout(30 * time.Second).\n    MustText()\n```\n\n### Element Selectors\n\nRod supports multiple selector strategies:\n\n```go\n// CSS selector (most common)\npage.MustElement(\"div.content > p.intro\")\n\n// CSS selector with text regex matching\npage.MustElementR(\"button\", \"Submit|Send\")\n\n// XPath\npage.MustElementX(\"//div[@class='content']//p\")\n\n// Search across iframes and shadow DOM (like DevTools Ctrl+F)\npage.MustSearch(\".deeply-nested-element\")\n```\n\n### Auto-Wait\n\nRod automatically retries element queries until the element appears or the context times out. You do not need manual sleeps:\n\n```go\n// This will automatically wait until the element exists\nel := page.MustElement(\"#dynamic-content\")\n\n// Wait until the element is stable (position/size not changing)\nel.MustWaitStable().MustClick()\n\n// Wait until page has no pending network requests\nwait := page.MustWaitRequestIdle()\npage.MustElement(\"#search\").MustInput(\"query\")\nwait()\n```\n\n---\n\n## Stealth & Anti-Bot Detection (go-rod/stealth)\n\n> **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.\n\n### How Stealth Works\n\nThe `go-rod/stealth` package injects JavaScript evasions into every new page that:\n\n- **Remove `navigator.webdriver`** — the primary headless detection signal.\n- **Spoof WebGL vendor/renderer** — presents real GPU info (e.g., \"Intel Inc.\" / \"Intel Iris OpenGL Engine\") instead of headless markers like \"Google SwiftShader\".\n- **Fix Chrome plugin array** — reports proper `PluginArray` type with realistic plugin count.\n- **Patch permissions API** — returns `\"prompt\"` instead of bot-revealing values.\n- **Set realistic languages** — reports `en-US,en` instead of empty arrays.\n- **Fix broken image dimensions** — headless browsers report 0x0; stealth fixes this to 16x16.\n\n### Usage\n\n**Creating a stealth page (recommended for all production use):**\n\n```go\nimport (\n    \"github.com/go-rod/rod\"\n    \"github.com/go-rod/stealth\"\n)\n\nbrowser := rod.New().MustConnect()\ndefer browser.MustClose()\n\n// Use stealth.MustPage instead of browser.MustPage\npage := stealth.MustPage(browser)\npage.MustNavigate(\"https://bot.sannysoft.com\")\n```\n\n**With error handling:**\n\n```go\npage, err := stealth.Page(browser)\nif err != nil {\n    return fmt.Errorf(\"failed to create stealth page: %w\", err)\n}\npage.MustNavigate(\"https://example.com\")\n```\n\n**Using stealth.JS directly (advanced — for custom page creation):**\n\n```go\n// If you need to create the page yourself (e.g., with specific options),\n// inject stealth.JS manually via EvalOnNewDocument\npage := browser.MustPage()\npage.MustEvalOnNewDocument(stealth.JS)\npage.MustNavigate(\"https://example.com\")\n```\n\n### Verifying Stealth\n\nNavigate to a bot detection test page to verify evasions:\n\n```go\npage := stealth.MustPage(browser)\npage.MustNavigate(\"https://bot.sannysoft.com\")\npage.MustScreenshot(\"stealth_test.png\")\n```\n\nExpected results for a properly stealth-configured browser:\n- **WebDriver**: `missing (passed)`\n- **Chrome**: `present (passed)`\n- **Plugins Length**: `3` (not `0`)\n- **Languages**: `en-US,en`\n\n---\n\n## Implementation Guidelines\n\n### 1. Launcher Configuration\n\nUse the `launcher` package to customize browser launch flags:\n\n```go\nimport \"github.com/go-rod/rod/lib/launcher\"\n\nurl := launcher.New().\n    Headless(true).             // false for debugging\n    Proxy(\"127.0.0.1:8080\").    // upstream proxy\n    Set(\"disable-gpu\", \"\").     // custom Chrome flag\n    Delete(\"use-mock-keychain\"). // remove a default flag\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(url).MustConnect()\ndefer browser.MustClose()\n```\n\n**Debugging mode (visible browser + slow motion):**\n\n```go\nl := launcher.New().\n    Headless(false).\n    Devtools(true)\ndefer l.Cleanup()\n\nbrowser := rod.New().\n    ControlURL(l.MustLaunch()).\n    Trace(true).\n    SlowMotion(2 * time.Second).\n    MustConnect()\n```\n\n### 2. Proxy Support\n\n```go\n// Set proxy at launch\nurl := launcher.New().\n    Proxy(\"socks5://127.0.0.1:1080\").\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(url).MustConnect()\n\n// Handle proxy authentication\ngo browser.MustHandleAuth(\"username\", \"password\")()\n\n// Ignore SSL certificate errors (for MITM proxies)\nbrowser.MustIgnoreCertErrors(true)\n```\n\n### 3. Input Simulation\n\n```go\nimport \"github.com/go-rod/rod/lib/input\"\n\n// Type into an input field (replaces existing value)\npage.MustElement(\"#email\").MustInput(\"user@example.com\")\n\n// Simulate keyboard keys\npage.Keyboard.MustType(input.Enter)\n\n// Press key combinations\npage.Keyboard.MustPress(input.ControlLeft)\npage.Keyboard.MustType(input.KeyA)\npage.Keyboard.MustRelease(input.ControlLeft)\n\n// Mouse click at coordinates\npage.Mouse.MustClick(input.MouseLeft)\npage.Mouse.MustMoveTo(100, 200)\n```\n\n### 4. Network Request Interception (Hijacking)\n\n```go\nrouter := browser.HijackRequests()\ndefer router.MustStop()\n\n// Block all image requests\nrouter.MustAdd(\"*.png\", func(ctx *rod.Hijack) {\n    ctx.Response.Fail(proto.NetworkErrorReasonBlockedByClient)\n})\n\n// Modify request headers\nrouter.MustAdd(\"*api.example.com*\", func(ctx *rod.Hijack) {\n    ctx.Request.Req().Header.Set(\"Authorization\", \"Bearer token123\")\n    ctx.MustLoadResponse()\n})\n\n// Modify response body\nrouter.MustAdd(\"*.js\", func(ctx *rod.Hijack) {\n    ctx.MustLoadResponse()\n    ctx.Response.SetBody(ctx.Response.Body() + \"\\n// injected\")\n})\n\ngo router.Run()\n```\n\n### 5. Waiting Strategies\n\n```go\n// Wait for page load event\npage.MustWaitLoad()\n\n// Wait for no pending network requests (AJAX idle)\nwait := page.MustWaitRequestIdle()\npage.MustElement(\"#search\").MustInput(\"query\")\nwait()\n\n// Wait for element to be stable (not animating)\npage.MustElement(\".modal\").MustWaitStable().MustClick()\n\n// Wait for element to become invisible\npage.MustElement(\".loading\").MustWaitInvisible()\n\n// Wait for JavaScript condition\npage.MustWait(`() => document.title === 'Ready'`)\n\n// Wait for specific navigation/event\nwait := page.WaitEvent(&proto.PageLoadEventFired{})\npage.MustNavigate(\"https://example.com\")\nwait()\n```\n\n### 6. Race Selectors (Multiple Outcomes)\n\nHandle pages where the result can be one of several outcomes (e.g., login success vs error):\n\n```go\npage.MustElement(\"#username\").MustInput(\"user\")\npage.MustElement(\"#password\").MustInput(\"pass\").MustType(input.Enter)\n\n// Race between success and error selectors\nelm := page.Race().\n    Element(\".dashboard\").MustHandle(func(e *rod.Element) {\n        fmt.Println(\"Login successful:\", e.MustText())\n    }).\n    Element(\".error-message\").MustDo()\n\nif elm.MustMatches(\".error-message\") {\n    log.Fatal(\"Login failed:\", elm.MustText())\n}\n```\n\n### 7. Screenshots & PDF\n\n```go\n// Full-page screenshot\npage.MustScreenshot(\"page.png\")\n\n// Custom screenshot (JPEG, specific region)\nimg, _ := page.Screenshot(true, &proto.PageCaptureScreenshot{\n    Format:  proto.PageCaptureScreenshotFormatJpeg,\n    Quality: gson.Int(90),\n    Clip: &proto.PageViewport{\n        X: 0, Y: 0, Width: 1280, Height: 800, Scale: 1,\n    },\n})\nutils.OutputFile(\"screenshot.jpg\", img)\n\n// Scroll screenshot (captures full scrollable page)\nimg, _ := page.MustWaitStable().ScrollScreenshot(nil)\nutils.OutputFile(\"full_page.jpg\", img)\n\n// PDF export\npage.MustPDF(\"output.pdf\")\n```\n\n### 8. Concurrent Page Pool\n\n```go\npool := rod.NewPagePool(5) // max 5 concurrent pages\n\ncreate := func() *rod.Page {\n    return browser.MustIncognito().MustPage()\n}\n\nvar wg sync.WaitGroup\nfor _, url := range urls {\n    wg.Add(1)\n    go func(u string) {\n        defer wg.Done()\n\n        page := pool.MustGet(create)\n        defer pool.Put(page)\n\n        page.MustNavigate(u).MustWaitLoad()\n        fmt.Println(page.MustInfo().Title)\n    }(url)\n}\nwg.Wait()\n\npool.Cleanup(func(p *rod.Page) { p.MustClose() })\n```\n\n### 9. Event Handling\n\n```go\n// Listen for console.log output\ngo page.EachEvent(func(e *proto.RuntimeConsoleAPICalled) {\n    if e.Type == proto.RuntimeConsoleAPICalledTypeLog {\n        fmt.Println(page.MustObjectsToJSON(e.Args))\n    }\n})()\n\n// Wait for a specific event before proceeding\nwait := page.WaitEvent(&proto.PageLoadEventFired{})\npage.MustNavigate(\"https://example.com\")\nwait()\n```\n\n### 10. File Download\n\n```go\nwait := browser.MustWaitDownload()\n\npage.MustElementR(\"a\", \"Download PDF\").MustClick()\n\ndata := wait()\nutils.OutputFile(\"downloaded.pdf\", data)\n```\n\n### 11. JavaScript Evaluation\n\n```go\n// Execute JS on the page\npage.MustEval(`() => console.log(\"hello\")`)\n\n// Pass parameters and get return value\nresult := page.MustEval(`(a, b) => a + b`, 1, 2)\nfmt.Println(result.Int()) // 3\n\n// Eval on a specific element (\"this\" = the DOM element)\ntitle := page.MustElement(\"title\").MustEval(`() => this.innerText`).String()\n\n// Direct CDP calls for features Rod doesn't wrap\nproto.PageSetAdBlockingEnabled{Enabled: true}.Call(page)\n```\n\n### 12. Loading Chrome Extensions\n\n```go\nextPath, _ := filepath.Abs(\"./my-extension\")\n\nu := launcher.New().\n    Set(\"load-extension\", extPath).\n    Headless(false). // extensions require headed mode\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(u).MustConnect()\n```\n\n---\n\n## Examples\n\nSee the `examples/` directory for complete, runnable Go files:\n- `examples/basic_scrape.go` — Minimal scraping example\n- `examples/stealth_page.go` — Anti-detection with go-rod/stealth\n- `examples/request_hijacking.go` — Intercepting and modifying network requests\n- `examples/concurrent_pages.go` — Page pool for concurrent scraping\n\n---\n\n## Best Practices\n\n- ✅ **ALWAYS use `stealth.MustPage(browser)`** instead of `browser.MustPage()` for real-world sites.\n- ✅ **ALWAYS `defer browser.MustClose()`** immediately after connecting.\n- ✅ Use the error-returning API (not `Must*`) in production code.\n- ✅ Set explicit timeouts with `.Timeout()` — never rely on defaults for production.\n- ✅ Use `browser.MustIncognito().MustPage()` for isolated sessions.\n- ✅ Use `PagePool` for concurrent scraping instead of spawning unlimited pages.\n- ✅ Use `MustWaitStable()` before clicking elements that might be animating.\n- ✅ Use `MustWaitRequestIdle()` after actions that trigger AJAX calls.\n- ✅ Use `launcher.New().Headless(false).Devtools(true)` for debugging.\n- ❌ **NEVER** use `time.Sleep()` for waiting — use Rod's built-in wait methods.\n- ❌ **NEVER** create a new `Browser` per task — create one Browser, use multiple `Page` instances.\n- ❌ **NEVER** use `browser.MustPage()` for production scraping — use `stealth.MustPage()`.\n- ❌ **NEVER** ignore errors in production — always handle them explicitly.\n- ❌ **NEVER** forget to defer-close browsers, pages, and hijack routers.\n\n## Common Pitfalls\n\n- **Problem:** Element not found even though it exists on the page.\n  **Solution:** The element may be inside an iframe or shadow DOM. Use `page.MustSearch()` instead of `page.MustElement()` — it searches across all iframes and shadow DOMs.\n\n- **Problem:** Click doesn't work because the element is animating.\n  **Solution:** Call `el.MustWaitStable()` before `el.MustClick()`.\n\n- **Problem:** Bot detection despite using stealth.\n  **Solution:** Combine `stealth.MustPage()` with: randomized viewport sizes, realistic User-Agent strings, human-like input delays between keystrokes, and random idle behaviors (scroll, hover).\n\n- **Problem:** Browser process leaks (zombie processes).\n  **Solution:** Always `defer browser.MustClose()`. Rod uses [leakless](https://github.com/ysmood/leakless) to kill zombies after main process crash, but explicit cleanup is preferred.\n\n- **Problem:** Timeout errors on slow pages.\n  **Solution:** Use chained context: `page.Timeout(30 * time.Second).MustWaitLoad()`. For AJAX-heavy pages, use `MustWaitRequestIdle()` instead of `MustWaitLoad()`.\n\n- **Problem:** HijackRequests router not intercepting requests.\n  **Solution:** You must call `go router.Run()` after setting up routes, and `defer router.MustStop()` for cleanup.\n\n## Limitations\n\n- **CAPTCHAs:** Rod does not include CAPTCHA solving. External services (2captcha, etc.) must be integrated separately.\n- **Extreme Anti-Bot:** While `go-rod/stealth` handles common detection (WebDriver, plugin fingerprints, WebGL), extremely strict systems (some Cloudflare configurations, Akamai Bot Manager) may still detect automation. Additional measures (residential proxies, human-like behavioral patterns) may be needed.\n- **DRM Content:** Cannot interact with DRM-protected media (e.g., Widevine).\n- **Resource Usage:** Each browser instance consumes significant RAM (~100-300MB+). Use `PagePool` and limit concurrency on memory-constrained systems.\n- **Extensions in Headless:** Chrome extensions do not work in headless mode. Use `Headless(false)` with XVFB for server environments.\n- **Platform:** Requires a Chromium-compatible browser. Does not support Firefox or Safari.\n\n## Documentation References\n\n- [Official Documentation](https://go-rod.github.io/) — Guides, tutorials, FAQ\n- [Go API Reference](https://pkg.go.dev/github.com/go-rod/rod) — Complete type and method documentation\n- [go-rod/stealth](https://github.com/go-rod/stealth) — Anti-bot detection plugin\n- [Examples (source)](https://github.com/go-rod/rod/blob/main/examples_test.go) — Official example tests\n- [Rod vs Chromedp Comparison](https://github.com/nichochar/go-rod.github.io/blob/main/lib/examples/compare-chromedp) — Migration reference\n- [Chrome DevTools Protocol Docs](https://chromedevtools.github.io/devtools-protocol/) — Underlying protocol reference\n- [Chrome CLI Flags Reference](https://peter.sh/experiments/chromium-command-line-switches) — Launcher flag documentation\n- `references/api-reference.md` — Quick-reference cheat sheet","tags":["rod","master","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-go-rod-master","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/go-rod-master","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34768 github stars · SKILL.md body (17,562 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T18:51:24.070Z","embedding":null,"createdAt":"2026-04-18T21:38:06.616Z","updatedAt":"2026-04-23T18:51:24.070Z","lastSeenAt":"2026-04-23T18:51:24.070Z","tsv":"'-300':1882 '/)':1932 '/127.0.0.1':991 '/devtools-protocol/)':54,1982 '/div':556 '/experiments/chromium-command-line-switches)':1992 '/github.com/go-rod/rod)':1941 '/go-rod/rod':781 '/go-rod/rod)':37 '/go-rod/rod/blob/main/examples_test.go)':1963 '/go-rod/rod/lib/input':1022 '/go-rod/rod/lib/launcher':917 '/go-rod/rod@latest':313 '/go-rod/stealth':784 '/go-rod/stealth)':107,1953 '/go-rod/stealth@latest':328 '/my-extension':1456 '/nichochar/go-rod.github.io/blob/main/lib/examples/compare-chromedp)':1973 '/nichochar/go-rod.github.io/cmd/launcher@latest':349 '/nichochar/puppeteer-extra/tree/master/packages/extract-stealth-evasions),':122 '/p':559 '/stealth':104,646,681,1498,1829,1950 '/ysmood/leakless)':1747 '0':893,1262,1264 '0x0':761 '1':449,901,1270,1317,1415 '10':1375 '100':1056,1881 '1080':992 '11':1391 '12':1449 '127.0.0.1':926 '1280':1266 '16x16':766 '2':976,979,1416 '200':1057 '2captcha':1815 '3':891,1015,1419 '30':526,1771 '4':1058 '5':501,510,1108,1298,1300 '5s':523 '6':1171 '7':1235 '8':1291 '800':1268 '8080':927 '9':1343 '90':1258 'across':561,1680 'action':1581 'addit':1850 'advanc':825 'agent':1717 'ajax':1124,1584,1776 'ajax-heavi':1775 'akamai':1843 'alway':319,657,1513,1525,1634,1739 'angular':162 'anim':1140,1577,1695 'anti':23,110,170,316,640,1492,1823,1955 'anti-bot':169,639,1822,1954 'anti-bot-detect':22,109 'anti-detect':315,1491 'api':239,395,733,1536,1937 'api.example.com':1083 'appear':586 'around':63,277 'array':722,753 'ask':139,214 'authent':1001 'author':1089 'auto':85,331,576 'auto-download':330 'auto-wait':84,575 'autom':9,31,57,142,653,1849 'automat':286,579,601 'avoid':172,671 'b':1412,1414 'base':114 'bash':305,344 'bearer':1090 'becom':1149 'behavior':251,1729,1857 'best':1511 'binari':336 'block':1068 'bodi':1095 'bot':24,111,171,176,641,672,739,859,1702,1824,1844,1956 'bot-rev':738 'bot.sannysoft.com':799,871 'bound':520 'broken':755 'browser':8,30,56,70,96,125,156,208,217,261,282,352,358,367,368,759,785,797,807,869,882,910,947,957,969,994,1471,1516,1611,1616,1644,1733,1876,1919 'browser.hijackrequests':1065 'browser.mustclose':372,789,953,1527,1741 'browser.musthandleauth':1003 'browser.mustignorecerterrors':1013 'browser.mustincognito':1307,1554 'browser.mustpage':378,662,794,849,1519,1623 'browser.mustwaitdownload':1380 'btn':433,469 'built':45,1603 'built-in':1602 'button':440,479,551 'bypass':178 'call':517,1437,1447,1585,1697,1793 'cancel':488 'canceltimeout':515 'cannot':1864 'captcha':1806,1811 'captur':1276 'case':403 'cdp':73,191,1436 'certif':1008 'chain':79,508,1768 'chang':620 'cheat':2000 'child':496 'chrome':17,49,188,720,886,935,1451,1897,1976,1986 'chromedevtools.github.io':53,1981 'chromedevtools.github.io/devtools-protocol/)':52,1980 'chromedp':231,1969 'chromium':335,1917 'chromium-compat':1916 'class':557 'cleanup':275,1757,1804 'cli':1987 'click':416,454,1050,1572,1687 'clip':1259 'close':285,1643 'cloudflar':174,1841 'code':419,1541 'combin':1042,1708 'common':540,1649,1831 'communic':67 'companion':99 'comparison':1970 'compat':334,1918 'complet':1482,1942 'comprehens':5 'concept':351 'concurr':216,1292,1301,1509,1562,1888 'condit':1157 'configur':881,903,1842 'connect':364,1530 'console.log':1349,1401 'constrain':1892 'consum':1878 'content':159,257,558,611,1863 'context':80,209,260,262,480,491,589,1769 'context.context':486 'context.deadlineexceeded':474 'controlurl':949,971,996,1473 'cooki':265 'coordin':1052 'core':306,350 'correct':89 'count':730 'crash':1754 'creat':373,768,815,835,1303,1326,1608,1614 'creation':829 'css':537,544 'ctrl':568 'ctx':1075,1085,1099 'ctx.mustloadresponse':1092,1101 'ctx.request.req':1087 'ctx.response.body':1103 'ctx.response.fail':1077 'ctx.response.setbody':1102 'custom':827,909,934,1245 'dashboard':1212 'data':303,1386,1390 'debug':409,924,954,1593 'deepli':572 'deeply-nested-el':571 'default':249,250,944,1550 'defer':280,371,788,952,967,1066,1322,1327,1526,1642,1740,1801 'defer-clos':1641 'delay':1723 'delet':937 'design':81,276 'despit':1704 'detect':25,112,128,173,177,317,642,673,696,860,1493,1703,1832,1848,1957 'devtool':18,50,189,567,965,1590,1977 'dimens':757 'direct':46,192,824,1435 'directori':1480 'disabl':932 'disable-gpu':931 'div.content':542 'doc':1979 'document':1926,1929,1946,1995 'document.title':1159 'doesn':1441,1688 'dom':91,565,1427,1672,1685 'download':332,343,1377,1383 'downloaded.pdf':1389 'driver':44 'drm':1862,1868 'drm-protect':1867 'dynam':610 'dynamic-cont':609 'dynamic/spa':158 'e':1215,1354 'e.args':1361 'e.g':705,839,1187,1871 'e.musttext':1220 'e.type':1357 'el':383,428,607 'el.click':447 'el.mustclick':1700 'el.musttext':387 'el.mustwaitstable':621,1698 'element':88,360,382,415,529,574,581,585,605,615,1135,1147,1211,1221,1424,1428,1573,1652,1664,1693 'elm':1209 'elm.mustmatches':1227 'elm.musttext':1234 'email':1032 'empti':752 'en':747,749,896,898 'en-us':746,895 'enabl':1445 'engin':711 'entir':506 'environ':1912 'err':429,435,444,446,450,457,463,473,805,809,819 'error':390,413,414,421,801,1009,1191,1207,1223,1229,1534,1631,1762 'error-messag':1222,1228 'error-return':1533 'errors.is':472 'etc':1816 'eval':1420 'evalonnewdocu':847 'evalu':1393 'evas':113,685,865 'even':1655 'event':1116,1344,1366 'everi':398,687 'exampl':1476,1479,1489,1959,1965 'example.com':379,821,853,1169,1373 'examples/basic_scrape.go':1486 'examples/concurrent_pages.go':1505 'examples/request_hijacking.go':1499 'examples/stealth_page.go':1490 'execut':1395 'exist':606,1029,1658 'expect':874 'explicit':272,298,423,1543,1637,1756 'export':1288 'extens':1452,1462,1466,1894,1898 'extern':288,293,1813 'extpath':1454,1463 'extra':118 'extrem':1821,1837 'f':569 'fail':455,813,1233 'fals':922,964,1465,1589,1907 'faq':1935 'featur':1439 'field':1027 'file':1376,1485 'filepath.abs':1455 'find':380,477 'fingerprint':126,1835 'firefox':1923 'first':338 'fix':719,754,763 'flag':912,936,945,1988,1994 'fmt.errorf':438,453,812 'fmt.println':386,1217,1333,1359,1417 'forget':1639 'form':300 'format':1254 'found':442,1654 'full':1240,1277 'full-pag':1239 'full_page.jpg':1285 'func':465,1074,1084,1098,1214,1304,1319,1339,1353 'get':310,325,1406 'github.com':36,106,121,312,327,348,780,783,916,1021,1746,1952,1962,1972 'github.com/go-rod/rod':779 'github.com/go-rod/rod)':35 'github.com/go-rod/rod/blob/main/examples_test.go)':1961 'github.com/go-rod/rod/lib/input':1020 'github.com/go-rod/rod/lib/launcher':915 'github.com/go-rod/rod@latest':311 'github.com/go-rod/stealth':782 'github.com/go-rod/stealth)':105,1951 'github.com/go-rod/stealth@latest':326 'github.com/nichochar/go-rod.github.io/blob/main/lib/examples/compare-chromedp)':1971 'github.com/nichochar/go-rod.github.io/cmd/launcher@latest':347 'github.com/nichochar/puppeteer-extra/tree/master/packages/extract-stealth-evasions),':120 'github.com/ysmood/leakless)':1745 'go':2,15,28,43,102,148,194,223,234,278,309,324,345,361,427,462,484,498,536,598,644,679,777,803,830,866,913,960,982,1002,1018,1063,1106,1111,1192,1238,1295,1318,1346,1351,1378,1394,1453,1484,1496,1794,1827,1936,1948 'go-rod':14,27,101,643,678,1495,1826,1947 'go-rod-mast':1 'go-rod.github.io':1931 'go-rod.github.io/)':1930 'googl':717 'gpu':703,933 'gson.int':1257 'guid':6,1933 'guidelin':900 'h1':385 'handl':92,424,802,999,1176,1345,1635,1830 'head':1468 'header':1081 'header.set':1088 'headless':124,155,695,714,758,920,963,1464,1588,1896,1903,1906 'heavi':1777 'height':1267 'hello':1402 'hide':123 'high':41 'high-level':40 'hijack':203,1062,1647 'hijackrequest':1785 'hover':1731 'human':1720,1855 'human-lik':1719,1854 'idl':1125,1728 'ifram':562,1669,1682 'iframe/shadow':90 'ignor':1006,1630 'imag':756,1070 'img':1250,1273,1280,1286 'immedi':1528 'implement':899 'import':647,668,778,914,1019 'inc':707 'includ':20,320,1810 'info':704 'inject':108,683,843,1105 'input':1016,1026,1722 'input.controlleft':1044,1048 'input.enter':1039,1202 'input.keya':1046 'input.mouseleft':1054 'insid':1667 'instal':304 'instanc':1620,1877 'instead':660,712,736,750,792,1517,1564,1675,1781 'integr':1819 'intel':706,708 'interact':1865 'intercept':201,1061,1500,1788 'invis':1150 'iri':709 'isol':259,1557 'javascript':684,1156,1392 'jpeg':1247 'js':1097,1396 'key':1037,1041 'keyboard':1036 'keychain':941 'keystrok':1725 'kill':1749 'l':961 'l.cleanup':968 'l.mustlaunch':972 'languag':744,894 'launch':362,911,986 'launcher':902,906,1993 'launcher.new':919,962,988,1458,1587 'layer':357 'leak':1735 'leakless':1744 'length':890 'level':42,243 'librari':100,308 'lifecycl':353 'like':566,716,1721,1856 'limit':1805,1887 'listen':1347 'load':1115,1152,1450,1461 'load-extens':1460 'log.fatal':1231 'log.println':475 'login':432,439,468,478,1188,1218,1232 'login-btn':431,467 'main':1752 'manag':355,1845 'manual':596,845 'marker':715 'master':4,32 'match':549 'max':1299 'may':1665,1846,1859 'mb':1883 'measur':1851 'media':1870 'memori':1891 'memory-constrain':1890 'mention':167 'messag':1224,1230 'method':401,1606,1945 'might':1575 'migrat':229,1974 'minim':1487 'miss':884 'mitm':1011 'mock':940 'modal':1142 'mode':955,1469,1904 'modifi':292,1079,1093,1502 'motion':959 'mous':1049 'multipl':533,1174,1618 'must':388,404,1538,1792,1817 'mustclick':406,470,622,1144,1385 'mustconnect':370,787,951,978,998,1475 'mustdo':1225 'mustel':405,513 'mustev':1432 'musthandl':1213 'mustinput':635,1033,1130,1195,1199 'mustlaunch':946,993,1470 'mustpag':1308,1555 'musttext':407,528 'musttyp':1201 'mustwaitinvis':1153 'mustwaitload':512,1332,1773,1783 'mustwaitrequestidl':1579,1780 'mustwaitst':1143,1570 'mutat':289 'n':1104 'nativ':71 'navig':253,856 'navigation/event':1164 'navigator.webdriver':692 'need':153,199,595,833,1861 'nest':573 'network':204,629,1059,1122,1503 'never':1547,1594,1607,1621,1629,1638 'new':688,1610 'nil':436,451,810,1283 'offici':1928,1964 'one':1183,1615 'opengl':710 'oper':78,399,497,507 'option':842 'outcom':1175,1186 'output':1350 'output.pdf':1290 'overview':33 'p':1340 'p.intro':543 'p.mustclose':1342 'packag':682,907 'page':220,256,284,359,375,377,625,689,771,795,804,817,828,837,848,862,867,1114,1177,1241,1279,1293,1302,1324,1329,1399,1448,1506,1568,1619,1645,1661,1765,1778 'page.eachevent':1352 'page.element':430 'page.keyboard.mustpress':1043 'page.keyboard.mustrelease':1047 'page.keyboard.musttype':1038,1045 'page.mouse.mustclick':1053 'page.mouse.mustmoveto':1055 'page.mustelement':384,466,541,608,633,1031,1128,1141,1151,1193,1197,1430,1677 'page.mustelementr':550,1381 'page.mustelementx':555 'page.musteval':1400,1410 'page.mustevalonnewdocument':850 'page.mustinfo':1334 'page.mustnavigate':798,820,852,870,1168,1330,1372 'page.mustobjectstojson':1360 'page.mustpdf':1289 'page.mustscreenshot':872,1243 'page.mustsearch':570,1674 'page.mustwait':1158 'page.mustwaitload':1117 'page.mustwaitrequestidle':632,1127 'page.mustwaitstable':1281 'page.png':1244 'page.race':1210 'page.screenshot':1251 'page.timeout':509,1770 'page.waitevent':1166,1370 'pagepool':1560,1885 'panic':411 'paramet':1404 'pass':885,888,1200,1403 'password':1005,1198 'patch':731 'pattern':26,281,391,426,459,1858 'pdf':1237,1287,1384 'pend':628,1121 'per':1612 'permiss':732 'persist':270 'peter.sh':1991 'peter.sh/experiments/chromium-command-line-switches)':1990 'pitfal':1650 'pkg.go.dev':1940 'pkg.go.dev/github.com/go-rod/rod)':1939 'platform':1913 'playwright':233 'plugin':318,721,729,889,1834,1958 'pluginarray':725 'png':1073 'pool':221,1294,1296,1507 'pool.cleanup':1338 'pool.mustget':1325 'pool.put':1328 'position/size':618 'post':302 'practic':1512 'pre':342 'pre-download':341 'prefer':1759 'present':701,887 'press':1040 'primari':694 'problem':1651,1686,1701,1732,1760,1784 'proceed':1368 'process':97,1734,1737,1753 'product':322,418,425,650,775,1540,1552,1625,1633 'prompt':735 'propag':492 'proper':724,878 'protect':1869 'proto.inputmousebuttonleft':448 'proto.networkerrorreasonblockedbyclient':1078 'proto.pagecapturescreenshot':1253 'proto.pagecapturescreenshotformatjpeg':1255 'proto.pageloadeventfired':1167,1371 'proto.pagesetadblockingenabled':1444 'proto.pageviewport':1260 'proto.runtimeconsoleapicalled':1355 'proto.runtimeconsoleapicalledtypelog':1358 'protocol':19,51,190,1978,1984 'prototyp':410 'provid':74,393 'proxi':925,929,980,984,989,1000,1012,1853 'puppet':117 'puppeteer-extra':116 'qualiti':1256 'queri':582,636,1131 'quick':1998 'quick-refer':1997 'race':1172,1203 'ram':1880 'random':1711,1727 'rang':1314 'react':160 'read':246,255 'read-on':245 'readi':1160 'real':655,702,1522 'real-world':1521 'realist':728,743,1714 'recommend':772 'recurs':493 'refer':1927,1938,1975,1985,1989,1999 'references/api-reference.md':1996 'regex':548 'region':1249 'reli':1548 'remov':691,942 'replac':1028 'report':723,745,760 'request':205,630,1060,1071,1080,1123,1504,1789 'requir':1467,1914 'residenti':1852 'resourc':274,1873 'respons':1094 'result':875,1180,1409 'result.int':1418 'retri':580 'return':420,437,452,734,811,1306,1407,1535 'reveal':740 'risk':241,242 'rod':3,16,29,34,66,103,307,329,354,392,482,531,578,645,680,1440,1497,1600,1742,1807,1828,1949,1967 'rod.element':1216 'rod.hijack':1076,1086,1100 'rod.new':369,786,948,970,995,1472 'rod.newpagepool':1297 'rod.page':1305,1341 'rod.try':464 'rout':1799 'router':1064,1648,1786 'router.mustadd':1072,1082,1096 'router.muststop':1067,1802 'router.run':1107,1795 'run':339,346 'runnabl':1483 'safari':1925 'safe':77,244 'safeti':240 'sandbox':264 'save':273 'scale':1269 'scrape':12,60,141,218,323,651,1488,1510,1563,1626 'scraping/testing':258 'screenshot':1236,1242,1246,1275 'screenshot.jpg':1272 'script':297,408,458 'scroll':1274,1730 'scrollabl':1278 'scrollscreenshot':1282 'search':560,634,1129,1679 'second':502 'see':1477 'selector':530,534,538,545,1173,1208 'send':553 'separ':1820 'server':1911 'servic':1814 'session':1558 'set':499,742,930,983,1459,1542,1797 'sever':1185 'shadow':564,1671,1684 'sheet':2001 'signal':697 'signific':1879 'simpler':238 'simul':1017,1035 'singl':666 'site':1524 'size':1713 'skill':134 'skill-go-rod-master' 'sleep':597 'slow':958,1764 'slowmot':975 'socks5':990 'solut':1662,1696,1707,1738,1766,1790 'solv':1812 'sourc':1960 'source-sickn33' 'spawn':1566 'specif':841,1163,1248,1365,1423 'spoof':698 'ssl':1007 'stabl':617,1138 'state':294 'stealth':21,119,168,314,638,675,762,770,816,855,880,1706 'stealth-configur':879 'stealth.js':823,844,851 'stealth.mustpage':659,791,796,868,1515,1628,1709 'stealth.page':806 'stealth_test.png':873 'step':669 'still':1847 'storag':267 'strategi':535,1110 'strict':1838 'string':1321,1434,1718 'style':396,400 'submit':299,552 'subsequ':516 'success':1189,1205,1219 'support':532,981,1922 'swiftshad':718 'sync.waitgroup':1311 'system':129,1839,1893 'tab':376 'task':1613 'test':144,861,1966 'text':417,547 'this.innertext':1433 'though':1656 'thread':76 'thread-saf':75 'three':356 'time':590 'time.second':511,527,977,1772 'time.sleep':1596 'timeout':476,481,490,503,524,525,1544,1546,1761 'timeouts/cancellation':83 'titl':514,1335,1429,1431 'token123':1091 'tool':65 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'trace':973 'tri':461 'trigger':1583 'true':921,966,974,1014,1252,1446,1591 'tutori':1934 'two':394 'type':726,1023,1943 'u':1320,1331,1457,1474 'under':1983 'unless':271,295 'unlik':61 'unlimit':1567 'upstream':928 'url':918,950,987,997,1313,1315,1336 'us':748,897 'usag':767,1874 'use':132,135,147,149,163,179,195,210,224,402,483,658,776,790,822,904,939,1514,1531,1553,1559,1569,1578,1586,1595,1599,1617,1622,1627,1673,1705,1743,1767,1779,1884,1905 'use-mock-keychain':938 'user':138,152,166,182,198,213,227,1196,1716 'user-ag':1715 'user@example.com':1034 'usernam':1004,1194 'utils.outputfile':1271,1284,1388 'valu':741,1030,1408 'var':1309 'vendor/renderer':700 'verifi':854,864 'via':72,846 'viewport':1712 'visibl':956 'vs':389,1190,1968 'vue':161 'w':443,456,818 'wait':86,577,602,612,623,631,637,1109,1112,1118,1126,1132,1133,1145,1154,1161,1165,1170,1362,1369,1374,1379,1387,1598,1605 'want':183,236 'web':11,59 'webdriv':883,1833 'webgl':699,1836 'websit':146,656 'wg':1310 'wg.add':1316 'wg.done':1323 'wg.wait':1337 'widevin':1872 'width':1265 'work':185,676,1690,1901 'world':1523 'wrap':1443 'wrapper':62 'x':1261 'xpath':554 'xvfb':1909 'y':1263 'zero':94 'zombi':95,1736,1750","prices":[{"id":"3d8ea12a-88ee-4fe6-8a2a-b4da25767da3","listingId":"275cec9b-7113-49c6-a10f-5ce907dfba2f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:38:06.616Z"}],"sources":[{"listingId":"275cec9b-7113-49c6-a10f-5ce907dfba2f","source":"github","sourceId":"sickn33/antigravity-awesome-skills/go-rod-master","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/go-rod-master","isPrimary":false,"firstSeenAt":"2026-04-18T21:38:06.616Z","lastSeenAt":"2026-04-23T18:51:24.070Z"}],"details":{"listingId":"275cec9b-7113-49c6-a10f-5ce907dfba2f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"go-rod-master","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34768,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"01f5ae300a0e42ab2c54cc0d09a2053294178273","skill_md_path":"skills/go-rod-master/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/go-rod-master"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"go-rod-master","description":"Comprehensive guide for browser automation and web scraping with go-rod (Chrome DevTools Protocol) including stealth anti-bot-detection patterns."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/go-rod-master"},"updatedAt":"2026-04-23T18:51:24.070Z"}}