plugins/rodney/skills/browser-automation/SKILL.md
This skill should be used when working on frontend code, debugging UI issues, verifying visual changes, scraping web pages, testing web features, or inspecting page state. Also triggers on "open browser", "take screenshot", "navigate to URL", "scrape website", "extract page content", "check accessibility", or any web automation task. Use proactively during frontend development to verify changes visually.
npx skillsauth add tavva/ben-claude-plugins browser-automationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Rodney is a CLI tool that drives a persistent headless Chrome instance. Each command connects to the same long-running browser process, making it natural to script multi-step browser interactions via Bash.
Use without being asked when:
rodney start # headless (default for agents)
rodney start --show # visible window (for debugging with user)
Check if already running first:
rodney status || rodney start
rodney open "https://example.com"
rodney waitstable # wait for DOM to settle
Always wait after navigation. Prefer waitstable for general use, waitidle when network requests matter, waitload for simple pages.
rodney title # page title
rodney url # current URL
rodney text "h1" # text content of element
rodney html ".main-content" # HTML of element
rodney attr "a.logo" "href" # attribute value
rodney js "document.querySelectorAll('.item').length" # run JS
rodney screenshot /tmp/page.png # full viewport
rodney screenshot -w 1280 -h 720 /tmp/page.png # specific size
rodney screenshot-el ".hero-section" /tmp/hero.png # element only
Use the Read tool to view screenshot files after capturing them.
rodney click "button.submit"
rodney input "#email" "[email protected]"
rodney select "#country" "GB"
rodney submit "form#login"
rodney hover ".tooltip-trigger"
rodney exists ".error-message" # exit 0 if exists, 1 if not
rodney visible ".modal" # exit 0 if visible, 1 if not
rodney count ".list-item" # prints count
rodney assert "document.title" "Expected Title" # assert equality
Use exit codes for conditional logic:
if rodney exists ".error-message"; then
rodney text ".error-message"
fi
rodney ax-tree --depth 3 # dump a11y tree (truncated)
rodney ax-tree --json # full tree as JSON
rodney ax-find --role button # find all buttons
rodney ax-find --role link --name "Sign in" # find specific link
rodney ax-node "#main-nav" --json # a11y info for element
The accessibility tree is often more useful than screenshots for understanding page structure, especially for forms and navigation.
rodney stop
The SessionEnd hook automatically runs rodney stop, so explicit cleanup is not required but is good practice when switching contexts.
Rodney keeps a single Chrome process alive between commands. State (cookies, localStorage, current page) persists across commands until rodney stop.
Directory-scoped sessions isolate browser state per project:
rodney start --local # state in ./.rodney/state.json
rodney open "..." # auto-detects local session
rodney stop # cleans up local session
Tab management for multi-page workflows:
rodney newpage "https://docs.example.com"
rodney pages # list all tabs
rodney page 0 # switch back to first tab
rodney closepage 1 # close second tab
rodney status || rodney start
rodney open "http://localhost:3000"
rodney waitstable
rodney screenshot /tmp/after-change.png
rodney open "http://localhost:3000/login"
rodney waitstable
rodney input "#email" "[email protected]"
rodney input "#password" "password123"
rodney click "button[type=submit]"
rodney waitstable
rodney screenshot /tmp/after-login.png
rodney open "https://example.com/data"
rodney waitstable
rodney js "JSON.stringify([...document.querySelectorAll('tr')].map(r => r.textContent))"
rodney open "https://example.com/dashboard"
rodney wait ".data-loaded" # wait for specific element
rodney text ".metric-value" # then extract content
rodney js wraps expressions as () => { return (expr); } — return complex values as JSON strings./tmp/ and use the Read tool to view them.rodney exists and rodney visible return exit code 1 on failure, not stderr — use if statements, not ||.rodney start --show to make the browser visible when debugging visual issues with the user.For the complete CLI command reference, consult references/commands.md.
tools
This skill should be used when the user asks to "create a sprite", "run in sprite", "execute in sprite", "sprite exec", "open sprite console", "list sprites", "destroy sprite", "create checkpoint", "restore checkpoint", "proxy through sprite", or mentions Sprite, isolated environments, or persistent microVMs. Also triggers on requests to manage sprite authentication, checkpoints, or port forwarding.
tools
This skill should be used when the user asks to "send an email", "send email via Resend", "list emails", "check email status", "cancel scheduled email", "manage domains", "add domain", "verify domain DNS", "create API key", "list API keys", "manage templates", "create email template", or mentions Resend, transactional email, or email delivery. Also triggers on requests to configure Resend, check domain verification, or manage email infrastructure.
documentation
This skill should be used when the user asks to "create a README", "write a README", "generate a README", "improve my README", "make my README better", "README best practices", or mentions needing project documentation. Provides guidance for creating excellent READMEs following patterns from awesome-readme.
tools
This skill should be used when working on Obsidian plugins, testing plugin changes, verifying plugin UI, debugging plugin behaviour, or running automated tests against Obsidian. Also triggers on "start Obsidian", "take Obsidian screenshot", "test plugin", "run plugin command", "execute in Obsidian", or any Obsidian automation task. Use proactively during plugin development to verify changes visually.