| name | bdg |
| description | Use bdg CLI for browser automation via Chrome DevTools Protocol. Provides direct CDP access (60+ domains, 300+ methods) for DOM queries, navigation, screenshots, network control, and JavaScript execution. Use this skill when you need to automate browsers, scrape dynamic content, or interact with web pages programmatically. |
| platform | Linux/macOS (native), Windows (WSL2 only) |
bdg - Browser Automation CLI
Platform Requirements
⚠️ Windows Users: bdg can ONLY be used in WSL2 (Windows Subsystem for Linux). It cannot run on native Windows PowerShell/CMD.
Prerequisites for Windows:
- Install WSL2:
wsl --install
- Install Node.js in WSL2 (recommended: use nvm-cn)
- Install browser-debugger-cli globally in WSL2
- Start Chrome on Windows with remote debugging enabled:
Start-Process chrome.exe -ArgumentList '--remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-profile'
- Connect from WSL2 using WebSocket URL:
wsl -d Ubuntu-22.04 bash -c "source ~/.nvm/nvm.sh && \
bdg --chrome-ws-url 'ws://localhost:9222/devtools/page/<pageId>' https://example.com"
Linux/macOS Users: You can use bdg <url> directly to launch Chrome (no special setup needed).
Session Management
Linux/macOS (Direct Launch)
bdg <url>
bdg <url> --headless
bdg <url> --no-headless
bdg status
bdg peek
bdg stop
bdg cleanup --force
bdg cleanup --aggressive
Windows/WSL2 (Connect to Existing Chrome)
Start-Process chrome.exe --args '--remote-debugging-port=9222','--user-data-dir=C:\temp\chrome-profile'
curl http://localhost:9222/json/list
wsl -d Ubuntu-22.04 bash -c "source ~/.nvm/nvm.sh && \
bdg --chrome-ws-url 'ws://localhost:9222/devtools/page/<pageId>' https://example.com"
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg status'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg dom screenshot /tmp/page.png'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg stop'
Important Notes:
No need to stop/restart - Chrome stays on the page
**Don't stop sessions prematurely** - use `bdg peek` to inspect data. Only call `bdg stop` when completely done with browser automation.
## Screenshots
Always use `bdg dom screenshot` (raw CDP is blocked):
```bash
bdg dom screenshot /tmp/page.png # Full page
bdg dom screenshot /tmp/viewport.png --no-full-page # Viewport only
bdg dom screenshot /tmp/el.png --selector "#main" # Element only
bdg dom screenshot /tmp/scroll.png --scroll "#target" # Scroll to element first
Form Interaction
bdg dom form --brief
bdg dom fill "input[name='user']" "myuser"
bdg dom fill 0 "value"
bdg dom click "button.submit"
bdg dom submit "form" --wait-navigation
bdg dom pressKey "input" Enter
--no-wait
--wait-navigation
--wait-network <ms>
--index <n>
DOM Inspection
bdg dom query "selector"
bdg dom get "selector"
bdg dom get "selector" --raw
bdg dom eval "js expression"
CDP Access
Direct access to Chrome DevTools Protocol:
bdg cdp Runtime.evaluate --params '{"expression": "document.title", "returnByValue": true}'
bdg cdp Page.navigate --params '{"url": "https://example.com"}'
bdg cdp Page.reload --params '{"ignoreCache": true}'
bdg cdp --list
bdg cdp Network --list
bdg cdp Network.getCookies --describe
bdg cdp --search cookie
Important: Always use returnByValue: true for Runtime.evaluate to get serialized values.
Common Patterns
Login Flow (Linux/macOS)
bdg https://example.com/login
bdg dom form --brief
bdg dom fill "input[name='username']" "$USER"
bdg dom fill "input[name='password']" "$PASS"
bdg dom submit "button[type='submit']" --wait-navigation
bdg dom screenshot /tmp/result.png
bdg stop
Login Flow (Windows/WSL2)
Start-Process chrome.exe --args '--remote-debugging-port=9222','--user-data-dir=C:\temp\chrome-profile'
WS_URL=$(curl -s http://localhost:9222/json/list | jq -r '.[0].webSocketDebuggerUrl')
wsl -d Ubuntu-22.04 bash -c "source ~/.nvm/nvm.sh && \
bdg --chrome-ws-url '$WS_URL' https://example.com/login"
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg dom form --brief'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg dom fill "input[name=username]" "user"'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg dom fill "input[name=password]" "pass"'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg dom submit "button[type=submit]" --wait-navigation'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg dom screenshot /tmp/result.png'
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && bdg stop'
Wait for Element
for i in {1..20}; do
EXISTS=$(bdg cdp Runtime.evaluate --params '{
"expression": "document.querySelector(\"#target\") !== null",
"returnByValue": true
}' | jq -r '.result.value')
[ "$EXISTS" = "true" ] && break
sleep 0.5
done
Extract Data
bdg cdp Runtime.evaluate --params '{
"expression": "Array.from(document.querySelectorAll(\"a\")).map(a => ({text: a.textContent, href: a.href}))",
"returnByValue": true
}' | jq '.result.value'
Exit Codes
| Code | Meaning | Action |
|---|
| 0 | Success | - |
| 1 | Blocked command | Read error message, use suggested alternative |
| 81 | Invalid arguments | Check command syntax |
| 83 | Resource not found | Element/session doesn't exist |
| 101 | CDP connection failure | Run bdg cleanup --aggressive and retry |
| 102 | CDP timeout | Increase timeout or check page load |
Troubleshooting
Linux/macOS
bdg status --verbose
bdg cleanup --force
bdg cleanup --aggressive
Chrome won't launch? Run bdg cleanup --aggressive then retry.
Session stuck? Run bdg cleanup --force to reset.
Windows/WSL2
Chrome not starting on Windows:
# Ensure no Chrome instances are running
Get-Process chrome -ErrorAction SilentlyContinue | Stop-Process -Force
# Start Chrome with debugging port
Start-Process chrome.exe --args '--remote-debugging-port=9222','--user-data-dir=C:\temp\chrome-profile'
# Verify it's running
curl http://localhost:9222/json/version
WSL2 cannot connect:
curl http://localhost:9222/json/list
Permission denied errors:
wsl -d Ubuntu-22.04 bash -c 'source ~/.nvm/nvm.sh && which npm'
Custom Chrome Flags (All Platforms)
Use --chrome-flags or BDG_CHROME_FLAGS for self-signed certificates, CORS, etc.:
bdg https://localhost:5173 --chrome-flags="--ignore-certificate-errors"
BDG_CHROME_FLAGS="--ignore-certificate-errors" bdg https://localhost:5173
bdg https://example.com --chrome-flags="--ignore-certificate-errors --disable-web-security"
Common flags for development:
--ignore-certificate-errors - Self-signed SSL certs
--disable-web-security - CORS issues in development
--allow-insecure-localhost - Insecure localhost
--disable-features=IsolateOrigins,site-per-process - Cross-origin iframes
Verification Best Practices
Prefer DOM queries over screenshots for verification:
bdg cdp Runtime.evaluate --params '{
"expression": "document.querySelector(\".error-message\")?.textContent",
"returnByValue": true
}'
bdg dom query ".submit-btn"
bdg cdp Runtime.evaluate --params '{
"expression": "document.body.innerText.includes(\"Success\")",
"returnByValue": true
}'
bdg dom screenshot /tmp/check.png
When to use screenshots:
- Visual regression testing
- Capturing proof for user review
- Debugging layout issues
- When DOM structure is unknown
When to use DOM queries:
- Verifying text content appeared
- Checking element exists/visible
- Validating form state
- Counting elements
- Any programmatic assertion
When NOT to Use bdg
- Static HTML - Use
curl + htmlq/pq
- API calls - Use
curl + jq
- Simple HTTP - Use
wget/curl
Use bdg when you need: JavaScript execution, dynamic content, browser APIs, screenshots, or network manipulation.