Browser Interactions
This guide covers using the CLI for browser automation with element interactions.
Overview
zchrome provides multiple ways to target elements:
- CSS Selectors: Standard CSS selectors like
#id,.class,button[type="submit"] - Snapshot Refs: References from
zchrome snapshotlike@e1,@e2,@e15 - Layout Paths: DOM tree paths from
zchrome layoutlike@L0,@L0/2/1
Basic Workflow
1. Navigate and Snapshot
bash
# Launch browser and connect
zchrome open
zchrome connect
# Navigate to your target page
zchrome navigate https://example.com/login
# Take a snapshot to see available elements
zchrome snapshot -iOutput:
- navigation
- link "Home" [ref=e1]
- link "About" [ref=e2]
- main
- heading "Login"
- textbox "Email" [ref=e3]
- textbox "Password" [ref=e4]
- checkbox "Remember me" [ref=e5]
- button "Sign In" [ref=e6]
- link "Forgot password?" [ref=e7]
--- 7 element(s) with refs ---2. Interact with Elements
bash
# Fill the login form using refs
zchrome fill @e3 "user@example.com"
zchrome fill @e4 "secretpassword"
zchrome check @e5
zchrome click @e6Or using CSS selectors:
bash
zchrome fill "input[name='email']" "user@example.com"
zchrome fill "input[name='password']" "secretpassword"
zchrome check "#remember-me"
zchrome click "button[type='submit']"Snapshot Options
Interactive Only (-i)
Show only interactive elements (buttons, links, inputs, etc.):
bash
zchrome snapshot -iCompact Mode (-c)
Skip empty structural elements:
bash
zchrome snapshot -cDepth Limit (-d)
Limit tree depth for complex pages:
bash
zchrome snapshot -d 3Scope to Selector (-s)
Focus on a specific part of the page:
bash
zchrome snapshot -s "#main-content"
zchrome snapshot -s ".form-container"Mark Elements (-m)
Inject unique IDs (zc-1, zc-2, ...) into interactive elements that don't have IDs:
bash
zchrome snapshot --mark
zchrome snapshot -mThis is useful when:
- Dynamic content changes data but not page structure
- You want stable CSS selectors (
#zc-1) instead of transient refs (@e1) - You need to reference elements without re-taking snapshots
After marking, you can use either @e<N> refs or #zc-<N> CSS selectors:
bash
zchrome snapshot --mark
zchrome click "#zc-3" # Use injected ID
zchrome fill "#zc-4" "text" # Stable even after data updatesCombine Options
bash
zchrome snapshot -i -c -d 5 -s "#app"
zchrome snapshot -i -m -s "#form" # Interactive + mark + scopedElement Actions Reference
Click Actions
bash
# Single click
zchrome click "#submit-btn"
zchrome click @e6
# Double click
zchrome dblclick "#item-row"
zchrome dblclick @e10
# Hover (for dropdowns, tooltips)
zchrome hover "#menu-trigger"
zchrome hover @e3Input Actions
bash
# Focus an element
zchrome focus "#search-input"
zchrome focus @e4
# Type text (appends to existing)
zchrome type "#search" "hello world"
zchrome type @e4 "additional text"
# Fill (clears first, then types)
zchrome fill "#email" "new@example.com"
zchrome fill @e3 "replaced text"Form Controls
bash
# Select dropdown option by value
zchrome select "#country" "US"
zchrome select @e8 "option-value"
# Check a checkbox
zchrome check "#agree-terms"
zchrome check @e5
# Uncheck a checkbox
zchrome uncheck "#newsletter"
zchrome uncheck @e5Scrolling
bash
# Scroll the page
zchrome scroll down 500 # Scroll down 500px
zchrome scroll up 200 # Scroll up 200px
zchrome scroll left 100 # Scroll left 100px
zchrome scroll right 100 # Scroll right 100px
zchrome scroll down # Default: 300px
# Scroll element into view
zchrome scrollintoview "#footer"
zchrome scrollinto @e15 # AliasDrag and Drop
bash
# Drag element to another element
zchrome drag "#draggable-item" "#drop-zone"
zchrome drag @e3 @e7Keyboard Input
bash
# Press Enter to submit
zchrome press Enter
# Press Tab to move focus
zchrome press Tab
# Keyboard shortcuts
zchrome press Control+a # Select all
zchrome press Control+c # Copy
zchrome press Control+v # Paste
zchrome press Escape # Close modal/cancel
# Hold modifier for multi-select
zchrome keydown Control
zchrome click @e5
zchrome click @e7
zchrome click @e9
zchrome keyup ControlFile Upload
bash
# Upload a single file to a file input
zchrome upload "#file-input" document.pdf
zchrome upload @e5 ./report.xlsx
# Upload multiple files
zchrome upload "input[type=file]" file1.txt file2.txt file3.txt
# Note: This only selects files, does not submit the form
# Click the submit button afterwards if needed
zchrome click "#upload-btn"Complete Examples
Login Flow
bash
# Setup
zchrome open
zchrome connect
zchrome navigate https://app.example.com/login
# Discover elements
zchrome snapshot -i
# Fill login form
zchrome fill @e1 "john@example.com"
zchrome fill @e2 "password123"
zchrome click @e3
# Wait and verify
zchrome snapshot -i
zchrome screenshot --output logged-in.pngForm Submission
bash
# Navigate to form
zchrome navigate https://example.com/signup
# Fill form fields
zchrome fill "#firstName" "John"
zchrome fill "#lastName" "Doe"
zchrome fill "#email" "john.doe@example.com"
zchrome fill "#phone" "+1-555-1234"
# Select options
zchrome select "#country" "US"
zchrome select "#state" "CA"
# Check required boxes
zchrome check "#terms"
zchrome check "#privacy"
# Submit
zchrome click "#submit-button"
# Capture result
zchrome screenshot --output submitted.pngDropdown Navigation
bash
# Hover to open dropdown
zchrome hover "#products-menu"
# Wait briefly for animation (manual delay)
# Then click sub-item
zchrome click "#products-menu .item-laptops"Scroll and Click
bash
# Scroll to element first
zchrome scrollinto "#pricing-section"
# Then interact
zchrome click "#plan-pro .select-btn"Search and Results
bash
# Find search box
zchrome snapshot -i -s "header"
# Type search query
zchrome fill @e2 "zig programming"
zchrome click @e3 # Search button
# Take snapshot of results
zchrome snapshot -i -s "#results"
# Click first result
zchrome click @e1Keyboard Navigation Flow
bash
# Navigate form with keyboard only
zchrome focus "#first-field"
zchrome type @e1 "John"
zchrome press Tab
zchrome type @e2 "Doe"
zchrome press Tab
zchrome press Space # Check checkbox
zchrome press Tab
zchrome press Enter # Submit form
# Multi-select with modifier
zchrome keydown Control
zchrome click @e5
zchrome click @e7
zchrome click @e9
zchrome keyup Control
# Select all and copy
zchrome click "#text-area"
zchrome press Control+a
zchrome press Control+cFile Upload Flow
bash
# Navigate to upload page
zchrome navigate https://example.com/upload
# Take snapshot to find the file input
zchrome snapshot -i
# Upload file(s) - relative paths work
zchrome upload @e4 ./documents/report.pdf
# Or use CSS selector
zchrome upload "input[type=file]" invoice.pdf receipt.pdf
# Click submit to complete the upload
zchrome click "#submit-upload"
# Verify upload success
zchrome screenshot --output upload-result.pngGetting Information
Get Element Content
bash
# Get text content
zchrome get text @e3
zchrome get text "#heading"
# Get HTML
zchrome get html "#content"
# Get input value
zchrome get value "#email"Get Attributes
bash
# Get specific attribute
zchrome get attr @e5 href
zchrome get attr "#link" data-id
zchrome get attr "img" srcGet Page Info
bash
# Page title and URL
zchrome get title
zchrome get url
# Count elements
zchrome get count "li.item"
zchrome get count "button.primary"Get Element Position
bash
# Get bounding box
zchrome get box @e5
# Output: x=100 y=200 width=300 height=50
# Useful for verifying element visibility
zchrome get box "#modal"Get Styles
bash
# Get all computed styles as JSON
zchrome get styles "#button"Tips
Finding Elements
- Use
-iflag to filter to interactive elements only - Use
-sflag to scope to specific containers - Check the role in snapshot output - it tells you the element type
Reliable Selection
- CSS selectors are more stable if element IDs/classes don't change
- Snapshot refs are great for quick automation but change if page structure changes
- Layout paths (
@L0/2/1) are stable based on visual DOM structure, useful when class/id attributes are volatile - Combine all three: Use snapshot/layout to discover, then the most stable selector type in scripts
Debugging
Use --verbose to see CDP messages:
bash
zchrome click @e5 --verboseTiming
If actions fail because page hasn't loaded:
bash
# Take a screenshot to verify page state
zchrome screenshot --output debug.png
# Retake snapshot
zchrome snapshot -iMacro Recording
Record and replay browser interactions for automation. See the dedicated Macro Recording guide for full documentation.
bash
# Record interactions
zchrome cursor record workflow.json
# Replay with custom interval
zchrome cursor replay workflow.json --interval=200-500Troubleshooting
"Element not found"
- Take a new snapshot - element refs may have changed
- Check if element is visible (not hidden by CSS)
- Try scrolling element into view first
- Use
--verboseto see what selector is being used
Click doesn't work
- Element might be covered by another element
- Try
scrollintofirst to ensure visibility - Some elements need focus before click
Type not working
- Ensure element is focusable
- Try
focusbeforetype - Use
fillinstead to clear existing content