Visual validation tools for sandbox applications using Playwright's isolated Chromium.
cd .claude/skills/agent-sandboxes/sandbox_cli
# 1. Initialize (first time only)
uv run sbx browser init
# 2. Start browser
uv run sbx browser start
# 3. Navigate
uv run sbx browser nav https://example.com
# 4. Interact / Validate
uv run sbx browser eval "document.title"
uv run sbx browser screenshot --path screenshot.png
# 5. Close when done
uv run sbx browser closeuv run sbx browser <subcommand> [options]
Subcommands:
init Initialize browser environment (run once per machine)
start Start Playwright Chromium with remote debugging
nav URL Navigate to a URL
screenshot Take a screenshot of the current page
eval CODE Execute JavaScript in the page
click SELECTOR Click an element
type SELECTOR TEXT Type text into an input field
press KEY Press a keyboard key
scroll DIRECTION Scroll the page (up/down/top/bottom)
a11y Get accessibility tree snapshot
dom Get DOM structure (simplified or full)
pick MESSAGE Interactive element picker
cookies Get all cookies as JSON
status Check browser connection status
close Close the browser and terminate processRun once per machine to install Playwright and Chromium:
uv run sbx browser initThis is idempotent - safe to run multiple times.
# Headless (default) - no window, runs in background
uv run sbx browser start
# Headed - shows visible browser window (useful for debugging)
uv run sbx browser start --headedMultiple agents can run browsers simultaneously using different ports:
# Agent 1: uses default port 9222
uv run sbx browser start
uv run sbx browser nav https://app1.example.com
# Agent 2: uses port 9223
uv run sbx browser start --port 9223
uv run sbx browser nav https://app2.example.com --port 9223
# Agent 3: uses port 9224
uv run sbx browser start --port 9224
uv run sbx browser nav https://app3.example.com --port 9224IMPORTANT for parallel agents:
- Generate a unique port (e.g.,
9222 + RANDOM % 778) - Use
--portflag consistently on ALL browser commands - Close your own browser when done:
sbx browser close --port <port>
uv run sbx browser nav <url>
uv run sbx browser eval "document.readyState"uv run sbx browser eval "document.querySelectorAll('button').length"
uv run sbx browser eval "document.querySelector('h1')?.textContent"# Get all link texts
uv run sbx browser eval "Array.from(document.querySelectorAll('a')).map(a => a.textContent)"
# Get structured data
uv run sbx browser eval "Array.from(document.querySelectorAll('.item')).map(el => ({title: el.querySelector('h2')?.textContent, price: el.querySelector('.price')?.textContent}))"uv run sbx browser type "#username" "testuser"
uv run sbx browser type "#password" "testpass"
uv run sbx browser click "#submit-button"uv run sbx browser press Tab
uv run sbx browser press Enter
uv run sbx browser press Escapeuv run sbx browser scroll down
uv run sbx browser scroll down --amount 1000
uv run sbx browser scroll top
uv run sbx browser scroll bottom# Viewport only
uv run sbx browser screenshot --path screenshot.png
# Full page
uv run sbx browser screenshot --full --path full-page.png# Simplified DOM (good for LLMs)
uv run sbx browser dom
# Full HTML
uv run sbx browser dom --full
# Accessibility tree (best for understanding page structure)
uv run sbx browser a11yWhen testing web apps hosted in E2B sandboxes:
# 1. Get the public URL from sandbox
uv run sbx sandbox get-host <sandbox_id> --port 5173
# Returns: https://5173-<sandbox_id>.e2b.app
# 2. Start browser and navigate
uv run sbx browser start
uv run sbx browser nav https://5173-<sandbox_id>.e2b.app
# 3. Validate
uv run sbx browser eval "document.readyState"
uv run sbx browser screenshot --path validation.png
# 4. Close
uv run sbx browser closeuv run sbx browser init# Start the browser first
uv run sbx browser start --port XXXX# Option 1: Use different port
uv run sbx browser start --port 9223
# Option 2: Close existing browser
uv run sbx browser close --port 9222
# Option 3: Check what's using the port
lsof -i :9222# 1. Re-run init
uv run sbx browser init
# 2. Kill stale processes
pkill -f "chromium.*remote-debugging"
# 3. Try different port
uv run sbx browser start --port 9223Each agent MUST use a unique port:
BROWSER_PORT=$((9222 + RANDOM % 778))
uv run sbx browser start --port $BROWSER_PORT
# Use --port $BROWSER_PORT on ALL subsequent commands- Browser commands run on YOUR local machine, not in the sandbox
- Uses Playwright's isolated Chromium - does NOT interfere with your Chrome browser
- Runs in headless mode by default - no browser window appears
- The browser persists across commands until you
closeit - Use
get-hostto get sandbox URLs, then validate with browser commands