Loading...
Loading...
Chrome DevTools Protocol CLI that auto-connects to existing Chrome for browser automation without heavyweight runtime overhead
npx skill4agent add aradotso/devtools-skills chrome-devtools-cliSkill by ara.so — Devtools Skills collection.
[target:red-snake]# macOS (recommended)
brew install aeroxy/tap/chrome-devtools
# Or via Cargo
cargo install chrome-devtools-clichrome-devtoolschrome://inspect/#remote-debuggingDevToolsActivePort~/Library/Application Support/Google/Chrome/~/.config/google-chrome/%LOCALAPPDATA%\Google\Chrome\User Data\# Environment variables
export CHROME_WS_ENDPOINT=ws://localhost:9222/devtools/browser/abc123
export CHROME_USER_DATA_DIR=~/custom-chrome-profile
export CHROME_CHANNEL=beta # stable, beta, canary, dev
# Or flags
chrome-devtools --ws-endpoint ws://localhost:9222/... navigate https://example.com
chrome-devtools --user-data-dir ~/custom-profile navigate https://example.com
chrome-devtools --channel canary navigate https://example.com/tmp/chrome-devtools-daemon.sockpkill -f __daemon__[target:name]# Step 1: Navigate and capture target name
chrome-devtools navigate https://github.com
# Output: Navigated to https://github.com
# [target:green-dog]
# Step 2: Pin all subsequent commands to this target
chrome-devtools --target green-dog screenshot --output /tmp/gh.png
chrome-devtools --target green-dog evaluate "document.title"
chrome-devtools --target green-dog click "a[href='/login']"--targetchrome-devtools list-pages
# Output:
# [0] (green-dog) GitHub — https://github.com
# [1] (red-snake) Example Domain — https://example.com
# [2] (bold-stag) Local Dev — https://localhost:3000--page <index>chrome-devtools --page 1 evaluate "window.location.href"# Navigate to URL (waits for load event)
chrome-devtools navigate https://example.com
# History navigation
chrome-devtools --target red-snake navigate --back
chrome-devtools --target red-snake navigate --forward
chrome-devtools --target red-snake navigate --reload
# Tab management
chrome-devtools new-page https://github.com
chrome-devtools close-page 2
chrome-devtools select-page 0 # Bring tab to front# Screenshot (viewport only)
chrome-devtools --target green-dog screenshot --output /tmp/page.png
# Full-page screenshot (scrollable area)
chrome-devtools --target green-dog screenshot --full-page --output /tmp/full.png
# JavaScript evaluation
chrome-devtools --target green-dog evaluate "document.title"
chrome-devtools --target green-dog evaluate "Array.from(document.querySelectorAll('h1')).map(h => h.textContent)"
# Handle JavaScript dialogs (alert/confirm/prompt)
chrome-devtools --target green-dog evaluate "confirm('Proceed?')" --dialog-action accept
chrome-devtools --target green-dog evaluate "prompt('Name?')" --dialog-action "John Doe"
# Accessibility tree snapshot
chrome-devtools --target green-dog snapshot# Click by CSS selector
chrome-devtools --target green-dog click "#submit-button"
chrome-devtools --target green-dog click "a[href='/login']"
# Click at coordinates
chrome-devtools --target green-dog click-at 100 200
# Fill input fields
chrome-devtools --target green-dog fill "#email" "user@example.com"
chrome-devtools --target green-dog fill "#password" "secret123"
# Fill dropdown (select element)
chrome-devtools --target green-dog fill "#country" "United States"
# Toggle checkbox/radio
chrome-devtools --target green-dog fill "#terms" "true"
chrome-devtools --target green-dog fill "#newsletter" "false"
# Type text into focused element
chrome-devtools --target green-dog type-text "Hello World"
chrome-devtools --target green-dog type-text "Search query" --submit-key Enter
# Press keys
chrome-devtools --target green-dog press-key Enter
chrome-devtools --target green-dog press-key "Control+A"
chrome-devtools --target green-dog press-key Escape
# Hover over element
chrome-devtools --target green-dog hover ".dropdown-menu"# Resize viewport
chrome-devtools --target green-dog resize 1920 1080
# Wait for text to appear (default 30s timeout)
chrome-devtools --target green-dog wait-for "Login successful"
chrome-devtools --target green-dog wait-for "Dashboard" --timeout 60000window.__dtmcp# List available custom tools
chrome-devtools --target green-dog list-3p-tools
# Execute custom tool
chrome-devtools --target green-dog execute-3p-tool "myTool" '{"param": "value"}'--jsonchrome-devtools --json --target green-dog evaluate "document.title"
# {"success": true, "result": "Example Domain"}
chrome-devtools --json list-pages
# {"success": true, "pages": [{"index": 0, "friendlyName": "green-dog", ...}]}#!/bin/bash
set -e
# Navigate and capture target
TARGET=$(chrome-devtools navigate https://example.com/form | grep -oP '(?<=target:)[a-z-]+')
# Fill form fields
chrome-devtools --target "$TARGET" fill "#name" "Alice Smith"
chrome-devtools --target "$TARGET" fill "#email" "alice@example.com"
chrome-devtools --target "$TARGET" fill "#country" "Canada"
chrome-devtools --target "$TARGET" fill "#terms" "true"
# Submit and wait for confirmation
chrome-devtools --target "$TARGET" click "#submit"
chrome-devtools --target "$TARGET" wait-for "Thank you" --timeout 10000
# Capture confirmation screenshot
chrome-devtools --target "$TARGET" screenshot --output /tmp/confirmation.png#!/bin/bash
TARGET=$(chrome-devtools navigate https://news.ycombinator.com | grep -oP '(?<=target:)[a-z-]+')
# Extract top stories
chrome-devtools --target "$TARGET" evaluate "
Array.from(document.querySelectorAll('.athing')).slice(0, 5).map(item => ({
title: item.querySelector('.titleline > a').textContent,
url: item.querySelector('.titleline > a').href
}))
" --json > /tmp/hn-stories.json
cat /tmp/hn-stories.json#!/bin/bash
# Open multiple pages
TARGET_HOME=$(chrome-devtools navigate https://github.com | grep -oP '(?<=target:)[a-z-]+')
TARGET_REPO=$(chrome-devtools new-page https://github.com/torvalds/linux | grep -oP '(?<=target:)[a-z-]+')
# Interact with different pages
chrome-devtools --target "$TARGET_HOME" click "a[href='/login']"
chrome-devtools --target "$TARGET_REPO" evaluate "document.querySelector('.repository-content').textContent.includes('Linux kernel')"
# Screenshot both
chrome-devtools --target "$TARGET_HOME" screenshot --output /tmp/home.png
chrome-devtools --target "$TARGET_REPO" screenshot --output /tmp/repo.png#!/bin/bash
TARGET=$(chrome-devtools navigate https://example.com | grep -oP '(?<=target:)[a-z-]+')
# Get full accessibility tree
chrome-devtools --target "$TARGET" snapshot > /tmp/a11y-tree.txt
# Check for specific roles
chrome-devtools --target "$TARGET" evaluate "
document.querySelectorAll('[role=\"button\"]').length
"
# Find missing alt text
chrome-devtools --target "$TARGET" evaluate "
Array.from(document.querySelectorAll('img:not([alt])')).map(img => img.src)
"# ❌ BAD: Target may change
chrome-devtools navigate https://example.com
chrome-devtools screenshot --output /tmp/page.png # Might screenshot wrong page!
# ✅ GOOD: Explicit target
TARGET=$(chrome-devtools navigate https://example.com | grep -oP '(?<=target:)[a-z-]+')
chrome-devtools --target "$TARGET" screenshot --output /tmp/page.png# Get context before interacting
chrome-devtools --target "$TARGET" snapshot # See accessible structure
chrome-devtools --target "$TARGET" screenshot --output /tmp/context.png
chrome-devtools --target "$TARGET" evaluate "document.body.innerText" # Read visible text# Don't assume instant rendering
chrome-devtools --target "$TARGET" click "#load-more"
chrome-devtools --target "$TARGET" wait-for "Showing 20 results" --timeout 5000
chrome-devtools --target "$TARGET" evaluate "document.querySelectorAll('.result-item').length"# Check page state before interaction
HAS_BUTTON=$(chrome-devtools --target "$TARGET" evaluate "!!document.querySelector('#submit')" --json | jq -r '.result')
if [ "$HAS_BUTTON" = "true" ]; then
chrome-devtools --target "$TARGET" click "#submit"
else
echo "Submit button not found"
fichrome://inspect/#remote-debuggingDevToolsActivePortchrome-devtools --ws-endpoint ws://localhost:9222/... navigate https://example.com# Kill stale daemon
pkill -f __daemon__
rm /tmp/chrome-devtools-daemon.sock
# Retry command (will spawn fresh daemon)
chrome-devtools navigate https://example.com# Verify element exists
chrome-devtools --target "$TARGET" evaluate "!!document.querySelector('#my-button')"
# Get all matching elements
chrome-devtools --target "$TARGET" evaluate "document.querySelectorAll('#my-button').length"
# Wait for element to appear
chrome-devtools --target "$TARGET" wait-for "Submit" --timeout 10000
chrome-devtools --target "$TARGET" click "#submit"# List all pages with friendly names
chrome-devtools list-pages
# Use explicit page index if needed
chrome-devtools --page 0 evaluate "document.title"
# Or use raw target ID (from list-pages output)
chrome-devtools --target "E4F5A6B7C8D9" evaluate "document.title"--targetsnapshot--jsonlist-pageschrome-devtools-clinavigatesnapshotscreenshot--targetevaluate--jsonclose-page# User: "Login to example.com with my credentials"
# 1. Navigate
TARGET=$(chrome-devtools navigate https://example.com/login | grep -oP '(?<=target:)[a-z-]+')
# 2. Understand page
chrome-devtools --target "$TARGET" snapshot | head -50
# 3. Fill credentials (from env vars)
chrome-devtools --target "$TARGET" fill "#username" "$EXAMPLE_USERNAME"
chrome-devtools --target "$TARGET" fill "#password" "$EXAMPLE_PASSWORD"
# 4. Submit
chrome-devtools --target "$TARGET" click "#login-button"
# 5. Verify success
chrome-devtools --target "$TARGET" wait-for "Dashboard" --timeout 10000
chrome-devtools --target "$TARGET" screenshot --output /tmp/logged-in.png