by vibiumdev
Automate Chrome browser interactions via CLI with persistent daemon mode. Navigate pages, extract content, click elements, type text, manage tabs, and take screenshots.
npx @qaskills/cli add vibe-checkAuto-detects your AI agent and installs the skill. Works with Claude Code, Cursor, Copilot, and more.
The vibium CLI automates Chrome via the command line. The browser auto-launches on first use (daemon mode keeps it running between commands).
vibium go <url> && vibium map && vibium click @e1 && vibium map
Every browser automation follows this pattern:
vibium go <url>vibium map (get element refs like @e1, @e2)vibium click @e1vibium mapBefore running any commands, resolve the vibium binary path once:
vibium directly (works if globally installed via npm install -g vibium)./clicker/bin/vibium (dev environment, in project root)./node_modules/.bin/vibium (local npm install)Run vibium --help (or the resolved path) to confirm. Use the resolved path for all subsequent commands.
Windows note: Use forward slashes in paths (e.g. ./clicker/bin/vibium.exe) and quote paths containing spaces.
Chain commands with && to run them sequentially. The chain stops on first error:
vibium go https://example.com && vibium map && vibium click @e3 && vibium diff map
When to chain: Use && for sequences that should happen back-to-back (navigate → interact → verify). Run commands separately when you need to inspect output between steps.
When NOT to chain: Don't chain commands that depend on parsing the previous output (e.g. reading map output to decide what to click). Run those separately so you can analyze the result first.
vibium map — map interactive elements with @refs (recommended before interacting)vibium map --selector "nav" — scope map to elements within a CSS subtreevibium diff map — compare current vs last map (see what changed)vibium go <url> — go to a pagevibium back — go back in historyvibium forward — go forward in historyvibium reload — reload the current pagevibium url — print current URLvibium title — print page titlevibium text — get all page textvibium text "<selector>" — get text of a specific elementvibium html — get page HTML (use --outer for outerHTML)vibium find "<selector>" — find element, return @e1 ref (clickable with vibium click @e1)vibium find --text "Sign In" — find element by text content → @e1vibium find --label "Email" — find input by label → @e1vibium find --placeholder "Search" — find by placeholder → @e1vibium find --testid "submit-btn" — find by data-testid → @e1vibium find --xpath "//div[@class]" — find by XPath → @e1vibium find --alt "Logo" — find by alt attribute → @e1vibium find --title "Settings" — find by title attribute → @e1vibium find-all "<selector>" — find all matching elements → @e1, @e2, ... (--limit N)vibium find --role <role> — find element by ARIA role → @e1 (combine with --text, --label, etc.)vibium eval "<js>" — run JavaScript and print result (--stdin to read from stdin)vibium count "<selector>" — count matching elementsvibium screenshot -o file.png — capture screenshot (--full-page, --annotate)vibium a11y-tree — accessibility tree (--everything for all nodes)vibium click "<selector>" — click an element (also accepts @ref from map)vibium dblclick "<selector>" — double-click an elementvibium type "<selector>" "<text>" — type into an input (appends to existing value)vibium fill "<selector>" "<text>" — clear field and type new text (replaces value)vibium press <key> [selector] — press a key on element or focused elementvibium focus "<selector>" — focus an elementvibium hover "<selector>" — hover over an elementvibium scroll [direction] — scroll page (--amount N, --selector)vibium scroll-into-view "<selector>" — scroll element into view (centered)vibium keys "<combo>" — press keys (Enter, Control+a, Shift+Tab)vibium select "<selector>" "<value>" — pick a dropdown optionvibium check "<selector>" — check a checkbox/radio (idempotent)vibium uncheck "<selector>" — uncheck a checkbox (idempotent)vibium mouse-click [x] [y] — click at coordinates or current position (--button 0|1|2)vibium mouse-move <x> <y> — move mouse to coordinatesvibium mouse-down — press mouse button (--button 0|1|2)vibium mouse-up — release mouse button (--button 0|1|2)vibium drag "<source>" "<target>" — drag from one element to anothervibium value "<selector>" — get input/textarea/select valuevibium attr "<selector>" "<attribute>" — get HTML attribute valuevibium is-visible "<selector>" — check if element is visible (true/false)vibium is-enabled "<selector>" — check if element is enabled (true/false)vibium is-checked "<selector>" — check if checkbox/radio is checked (true/false)vibium wait "<selector>" — wait for element (--state visible|hidden|attached, --timeout ms)vibium wait-for-url "<pattern>" — wait until URL contains substring (--timeout ms)vibium wait-for-load — wait until page is fully loaded (--timeout ms)vibium wait-for-text "<text>" — wait until text appears on page (--timeout ms)vibium wait-for-fn "<expression>" — wait until JS expression returns truthy (--timeout ms)vibium sleep <ms> — pause execution (max 30000ms)vibium screenshot -o file.png — capture screenshot (--full-page, --annotate)vibium pdf -o file.pdf — save page as PDFvibium dialog accept [text] — accept dialog (optionally with prompt text)vibium dialog dismiss — dismiss dialogvibium set-viewport <width> <height> — set viewport size (--dpr for device pixel ratio)vibium viewport — get current viewport dimensionsvibium window — get OS browser window dimensions and statevibium set-window <width> <height> [x] [y] — set window size and position (--state)vibium emulate-media — override CSS media features (--color-scheme, --reduced-motion, --forced-colors, --contrast, --media)vibium set-geolocation <lat> <lng> — override geolocation (--accuracy)vibium set-content "<html>" — replace page HTML (--stdin to read from stdin)vibium frames — list all iframes on the pagevibium frame "<nameOrUrl>" — find a frame by name or URL substringvibium upload "<selector>" <files...> — set files on input[type=file]vibium trace start — start recording (--screenshots, --snapshots, --name)vibium trace stop — stop recording and save ZIP (-o path)vibium cookies — list all cookiesvibium cookies set <name> <value> — set a cookievibium cookies clear — clear all cookiesvibium storage-state — export cookies + localStorage + sessionStorage (-o state.json)vibium restore-storage <path> — restore state from JSON filevibium download set-dir <path> — set download directoryvibium tabs — list open tabsvibium tab-new [url] — open new tabvibium tab-switch <index|url> — switch tabvibium tab-close [index] — close tabvibium highlight "<selector>" — highlight element visually (3 seconds)vibium quit — close the browser (daemon keeps running)vibium close — alias for quitvibium daemon start — start background browservibium daemon status — check if runningvibium daemon stop — stop daemonvibium go https://example.com
vibium map
vibium click @e1
vibium map # re-map after interaction
vibium map
vibium click @e3
vibium diff map # see what changed
vibium go https://example.com && vibium text
vibium go https://example.com/login
vibium map
# Look at map output to identify form fields
vibium fill @e1 "user@example.com"
vibium fill @e2 "secret"
vibium click @e3
vibium wait-for-url "/dashboard"
vibium screenshot -o after-login.png
vibium map --selector "nav" # Only map elements in <nav>
vibium map --selector "#sidebar" # Only map elements in #sidebar
vibium map --selector "form" # Only map form controls
vibium find --text "Sign In" # → @e1 [button] "Sign In"
vibium find --label "Email" # → @e1 [input] placeholder="Email"
vibium click @e1 # Click the found element
vibium find --placeholder "Search..." # → @e1 [input] placeholder="Search..."
vibium find --testid "submit-btn" # → @e1 [button] "Submit"
vibium find --alt "Company logo" # → @e1 [img] alt="Company logo"
vibium find --title "Close" # → @e1 [button] title="Close"
vibium find --xpath "//a[@href='/about']" # → @e1 [a] "About"
# Log in once and save state
vibium go https://app.example.com/login
vibium fill "input[name=email]" "user@example.com"
vibium fill "input[name=password]" "secret"
vibium click "button[type=submit]"
vibium wait-for-url "/dashboard"
vibium storage-state -o auth.json
# Restore in a later session (skips login)
vibium restore-storage auth.json
vibium go https://app.example.com/dashboard
vibium go https://example.com
vibium eval "JSON.stringify([...document.querySelectorAll('a')].map(a => ({text: a.textContent.trim(), href: a.href})))"
vibium go https://example.com && vibium a11y-tree
vibium tab-new https://docs.example.com
vibium text "h1"
vibium tab-switch 0
vibium screenshot -o annotated.png --annotate
vibium attr "a" "href"
vibium value "input[name=email]"
vibium is-visible ".modal"
vibium go https://example.com && vibium pdf -o page.pdf
vibium eval is the escape hatch for any DOM query or mutation the CLI doesn't cover directly.
Simple expressions — use single quotes:
vibium eval 'document.title'
vibium eval 'document.querySelectorAll("li").length'
Complex scripts — use --stdin with a heredoc:
vibium eval --stdin <<'EOF'
const rows = [...document.querySelectorAll('table tbody tr')];
JSON.stringify(rows.map(r => {
const cells = r.querySelectorAll('td');
return { name: cells[0].textContent.trim(), price: cells[1].textContent.trim() };
}));
EOF
JSON output — use --json to get machine-readable output:
vibium eval --json 'JSON.stringify({url: location.href, title: document.title})'
All interaction commands (click, fill, type, etc.) auto-wait for the target element to be actionable. You usually don't need explicit waits.
Use explicit waits when:
vibium wait-for-url "/dashboard" — after clicking a link that navigatesvibium wait-for-text "Success" — after form submission, wait for confirmationvibium wait ".modal" — wait for a modal to appearvibium wait-for-load — after navigation to a slow pagevibium wait-for-fn "window.appReady === true" — wait for app initializationvibium sleep 2000 — only when no better signal exists (max 30s)All wait commands accept --timeout <ms> (default varies by command).
Refs (@e1, @e2) are invalidated when the page changes. Always re-map after:
| Flag | Description |
|---|---|
--headless | Hide browser window |
--json | Output as JSON |
-v, --verbose | Debug logging |
@ref from vibium mapvibium map before interacting to discover interactive elementsvibium map --selector to reduce noise on large pagesvibium fill to replace a field's value, vibium type to append to itvibium find --text / --label / --testid for semantic element lookup (more reliable than CSS selectors)vibium find --role for ARIA-role-based lookupvibium a11y-tree to understand page structure without visual renderingvibium text "<selector>" to read specific sectionsvibium diff map after interactions to see what changedvibium eval is the escape hatch for complex DOM queriesvibium check/vibium uncheck are idempotent — safe to call without checking state first-o to change)vibium storage-state / vibium restore-storage to persist auth across sessions- name: Install QA Skills
run: npx @qaskills/cli add vibe-check7 of 29 agents supported