* feat: add video recording with Playwright native video Adds `record start/stop` commands using Playwright's built-in video recording. No external dependencies required (no FFmpeg). Usage: agent-browser record start ./demo.webm https://example.com agent-browser click @e1 agent-browser record stop Recording creates a fresh browser context with video enabled. For smooth demos, explore the page first to plan actions, then start recording. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: auto-capture URL and transfer state for recording When starting a recording without a URL: - Automatically captures current page URL - Preserves cookies and localStorage from current session This enables a seamless workflow: agent-browser open https://app.example.com agent-browser snapshot -i # explore, plan agent-browser record start ./demo.webm # picks up URL + auth state agent-browser click @e3 agent-browser record stop Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: error on non-webm recording path instead of silent coercion Previously, specifying a non-.webm path like ./demo.mp4 would silently change it to ./demo.webm. Now it throws a clear error telling the user that Playwright native recording only supports WebM format. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: clean up recording temp directory after stopRecording Previously the temp directory was created but never deleted, relying on OS cleanup. Now we explicitly remove it after saving the video, in both success and error paths. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add record restart command Adds `record restart` command that stops the current recording (if any) and starts a new one. Also improves the error message when trying to start recording while already recording. Changes: - Add restartRecording method to BrowserManager - Add recording_restart action to protocol, types, and actions - Add CLI parsing for `record restart <path> [url]` - Update help text and skill documentation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add CLI tests for record restart command Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Chris Tate <chris@ctate.dev>
1296 lines
37 KiB
Rust
1296 lines
37 KiB
Rust
use crate::connection::Response;
|
|
|
|
pub fn print_response(resp: &Response, json_mode: bool) {
|
|
if json_mode {
|
|
println!("{}", serde_json::to_string(resp).unwrap_or_default());
|
|
return;
|
|
}
|
|
|
|
if !resp.success {
|
|
eprintln!(
|
|
"\x1b[31m✗\x1b[0m {}",
|
|
resp.error.as_deref().unwrap_or("Unknown error")
|
|
);
|
|
return;
|
|
}
|
|
|
|
if let Some(data) = &resp.data {
|
|
// Navigation response
|
|
if let Some(url) = data.get("url").and_then(|v| v.as_str()) {
|
|
if let Some(title) = data.get("title").and_then(|v| v.as_str()) {
|
|
println!("\x1b[32m✓\x1b[0m \x1b[1m{}\x1b[0m", title);
|
|
println!("\x1b[2m {}\x1b[0m", url);
|
|
return;
|
|
}
|
|
println!("{}", url);
|
|
return;
|
|
}
|
|
// Snapshot
|
|
if let Some(snapshot) = data.get("snapshot").and_then(|v| v.as_str()) {
|
|
println!("{}", snapshot);
|
|
return;
|
|
}
|
|
// Title
|
|
if let Some(title) = data.get("title").and_then(|v| v.as_str()) {
|
|
println!("{}", title);
|
|
return;
|
|
}
|
|
// Text
|
|
if let Some(text) = data.get("text").and_then(|v| v.as_str()) {
|
|
println!("{}", text);
|
|
return;
|
|
}
|
|
// HTML
|
|
if let Some(html) = data.get("html").and_then(|v| v.as_str()) {
|
|
println!("{}", html);
|
|
return;
|
|
}
|
|
// Value
|
|
if let Some(value) = data.get("value").and_then(|v| v.as_str()) {
|
|
println!("{}", value);
|
|
return;
|
|
}
|
|
// Count
|
|
if let Some(count) = data.get("count").and_then(|v| v.as_i64()) {
|
|
println!("{}", count);
|
|
return;
|
|
}
|
|
// Boolean results
|
|
if let Some(visible) = data.get("visible").and_then(|v| v.as_bool()) {
|
|
println!("{}", visible);
|
|
return;
|
|
}
|
|
if let Some(enabled) = data.get("enabled").and_then(|v| v.as_bool()) {
|
|
println!("{}", enabled);
|
|
return;
|
|
}
|
|
if let Some(checked) = data.get("checked").and_then(|v| v.as_bool()) {
|
|
println!("{}", checked);
|
|
return;
|
|
}
|
|
// Eval result
|
|
if let Some(result) = data.get("result") {
|
|
println!(
|
|
"{}",
|
|
serde_json::to_string_pretty(result).unwrap_or_default()
|
|
);
|
|
return;
|
|
}
|
|
// Tabs
|
|
if let Some(tabs) = data.get("tabs").and_then(|v| v.as_array()) {
|
|
for (i, tab) in tabs.iter().enumerate() {
|
|
let title = tab
|
|
.get("title")
|
|
.and_then(|v| v.as_str())
|
|
.unwrap_or("Untitled");
|
|
let url = tab.get("url").and_then(|v| v.as_str()).unwrap_or("");
|
|
let active = tab.get("active").and_then(|v| v.as_bool()).unwrap_or(false);
|
|
let marker = if active { "→" } else { " " };
|
|
println!("{} [{}] {} - {}", marker, i, title, url);
|
|
}
|
|
return;
|
|
}
|
|
// Console logs
|
|
if let Some(logs) = data.get("messages").and_then(|v| v.as_array()) {
|
|
for log in logs {
|
|
let level = log.get("type").and_then(|v| v.as_str()).unwrap_or("log");
|
|
let text = log.get("text").and_then(|v| v.as_str()).unwrap_or("");
|
|
let color = match level {
|
|
"error" => "\x1b[31m",
|
|
"warning" => "\x1b[33m",
|
|
"info" => "\x1b[36m",
|
|
_ => "\x1b[0m",
|
|
};
|
|
println!("{}[{}]\x1b[0m {}", color, level, text);
|
|
}
|
|
return;
|
|
}
|
|
// Errors
|
|
if let Some(errors) = data.get("errors").and_then(|v| v.as_array()) {
|
|
for err in errors {
|
|
let msg = err.get("message").and_then(|v| v.as_str()).unwrap_or("");
|
|
println!("\x1b[31m✗\x1b[0m {}", msg);
|
|
}
|
|
return;
|
|
}
|
|
// Cookies
|
|
if let Some(cookies) = data.get("cookies").and_then(|v| v.as_array()) {
|
|
for cookie in cookies {
|
|
let name = cookie.get("name").and_then(|v| v.as_str()).unwrap_or("");
|
|
let value = cookie.get("value").and_then(|v| v.as_str()).unwrap_or("");
|
|
println!("{}={}", name, value);
|
|
}
|
|
return;
|
|
}
|
|
// Bounding box
|
|
if let Some(box_data) = data.get("box") {
|
|
println!(
|
|
"{}",
|
|
serde_json::to_string_pretty(box_data).unwrap_or_default()
|
|
);
|
|
return;
|
|
}
|
|
// Closed
|
|
if data.get("closed").is_some() {
|
|
println!("\x1b[32m✓\x1b[0m Browser closed");
|
|
return;
|
|
}
|
|
// Recording start (has "started" field)
|
|
if let Some(started) = data.get("started").and_then(|v| v.as_bool()) {
|
|
if started {
|
|
if let Some(path) = data.get("path").and_then(|v| v.as_str()) {
|
|
println!("\x1b[32m✓\x1b[0m Recording started: {}", path);
|
|
} else {
|
|
println!("\x1b[32m✓\x1b[0m Recording started");
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
// Recording restart (has "stopped" field - from recording_restart action)
|
|
if data.get("stopped").is_some() {
|
|
let path = data.get("path").and_then(|v| v.as_str()).unwrap_or("unknown");
|
|
if let Some(prev_path) = data.get("previousPath").and_then(|v| v.as_str()) {
|
|
println!("\x1b[32m✓\x1b[0m Recording restarted: {} (previous saved to {})", path, prev_path);
|
|
} else {
|
|
println!("\x1b[32m✓\x1b[0m Recording started: {}", path);
|
|
}
|
|
return;
|
|
}
|
|
// Recording stop (has "frames" field - from recording_stop action)
|
|
if data.get("frames").is_some() {
|
|
if let Some(path) = data.get("path").and_then(|v| v.as_str()) {
|
|
if let Some(error) = data.get("error").and_then(|v| v.as_str()) {
|
|
println!("\x1b[33m⚠\x1b[0m Recording saved to {} - {}", path, error);
|
|
} else {
|
|
println!("\x1b[32m✓\x1b[0m Recording saved to {}", path);
|
|
}
|
|
} else {
|
|
println!("\x1b[32m✓\x1b[0m Recording stopped");
|
|
}
|
|
return;
|
|
}
|
|
// Screenshot path (no "started" or "frames" field)
|
|
if let Some(path) = data.get("path").and_then(|v| v.as_str()) {
|
|
println!("\x1b[32m✓\x1b[0m Screenshot saved to {}", path);
|
|
return;
|
|
}
|
|
// Default success
|
|
println!("\x1b[32m✓\x1b[0m Done");
|
|
}
|
|
}
|
|
|
|
/// Print command-specific help. Returns true if help was printed, false if command unknown.
|
|
pub fn print_command_help(command: &str) -> bool {
|
|
let help = match command {
|
|
// === Navigation ===
|
|
"open" | "goto" | "navigate" => r##"
|
|
agent-browser open - Navigate to a URL
|
|
|
|
Usage: agent-browser open <url>
|
|
|
|
Navigates the browser to the specified URL. If no protocol is provided,
|
|
https:// is automatically prepended.
|
|
|
|
Aliases: goto, navigate
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
--headers <json> Set HTTP headers (scoped to this origin)
|
|
--headed Show browser window
|
|
|
|
Examples:
|
|
agent-browser open example.com
|
|
agent-browser open https://github.com
|
|
agent-browser open localhost:3000
|
|
agent-browser open api.example.com --headers '{"Authorization": "Bearer token"}'
|
|
# ^ Headers only sent to api.example.com, not other domains
|
|
"##,
|
|
"back" => r##"
|
|
agent-browser back - Navigate back in history
|
|
|
|
Usage: agent-browser back
|
|
|
|
Goes back one page in the browser history, equivalent to clicking
|
|
the browser's back button.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser back
|
|
"##,
|
|
"forward" => r##"
|
|
agent-browser forward - Navigate forward in history
|
|
|
|
Usage: agent-browser forward
|
|
|
|
Goes forward one page in the browser history, equivalent to clicking
|
|
the browser's forward button.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser forward
|
|
"##,
|
|
"reload" => r##"
|
|
agent-browser reload - Reload the current page
|
|
|
|
Usage: agent-browser reload
|
|
|
|
Reloads the current page, equivalent to pressing F5 or clicking
|
|
the browser's reload button.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser reload
|
|
"##,
|
|
|
|
// === Core Actions ===
|
|
"click" => r##"
|
|
agent-browser click - Click an element
|
|
|
|
Usage: agent-browser click <selector>
|
|
|
|
Clicks on the specified element. The selector can be a CSS selector,
|
|
XPath, or an element reference from snapshot (e.g., @e1).
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser click "#submit-button"
|
|
agent-browser click @e1
|
|
agent-browser click "button.primary"
|
|
agent-browser click "//button[@type='submit']"
|
|
"##,
|
|
"dblclick" => r##"
|
|
agent-browser dblclick - Double-click an element
|
|
|
|
Usage: agent-browser dblclick <selector>
|
|
|
|
Double-clicks on the specified element. Useful for text selection
|
|
or triggering double-click handlers.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser dblclick "#editable-text"
|
|
agent-browser dblclick @e5
|
|
"##,
|
|
"fill" => r##"
|
|
agent-browser fill - Clear and fill an input field
|
|
|
|
Usage: agent-browser fill <selector> <text>
|
|
|
|
Clears the input field and fills it with the specified text.
|
|
This replaces any existing content in the field.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser fill "#email" "user@example.com"
|
|
agent-browser fill @e3 "Hello World"
|
|
agent-browser fill "input[name='search']" "query"
|
|
"##,
|
|
"type" => r##"
|
|
agent-browser type - Type text into an element
|
|
|
|
Usage: agent-browser type <selector> <text>
|
|
|
|
Types text into the specified element character by character.
|
|
Unlike fill, this does not clear existing content first.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser type "#search" "hello"
|
|
agent-browser type @e2 "additional text"
|
|
"##,
|
|
"hover" => r##"
|
|
agent-browser hover - Hover over an element
|
|
|
|
Usage: agent-browser hover <selector>
|
|
|
|
Moves the mouse to hover over the specified element. Useful for
|
|
triggering hover states or dropdown menus.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser hover "#dropdown-trigger"
|
|
agent-browser hover @e4
|
|
"##,
|
|
"focus" => r##"
|
|
agent-browser focus - Focus an element
|
|
|
|
Usage: agent-browser focus <selector>
|
|
|
|
Sets keyboard focus to the specified element.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser focus "#input-field"
|
|
agent-browser focus @e2
|
|
"##,
|
|
"check" => r##"
|
|
agent-browser check - Check a checkbox
|
|
|
|
Usage: agent-browser check <selector>
|
|
|
|
Checks a checkbox element. If already checked, no action is taken.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser check "#terms-checkbox"
|
|
agent-browser check @e7
|
|
"##,
|
|
"uncheck" => r##"
|
|
agent-browser uncheck - Uncheck a checkbox
|
|
|
|
Usage: agent-browser uncheck <selector>
|
|
|
|
Unchecks a checkbox element. If already unchecked, no action is taken.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser uncheck "#newsletter-opt-in"
|
|
agent-browser uncheck @e8
|
|
"##,
|
|
"select" => r##"
|
|
agent-browser select - Select a dropdown option
|
|
|
|
Usage: agent-browser select <selector> <value>
|
|
|
|
Selects an option in a <select> dropdown by its value attribute.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser select "#country" "US"
|
|
agent-browser select @e5 "option2"
|
|
"##,
|
|
"drag" => r##"
|
|
agent-browser drag - Drag and drop
|
|
|
|
Usage: agent-browser drag <source> <target>
|
|
|
|
Drags an element from source to target location.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser drag "#draggable" "#drop-zone"
|
|
agent-browser drag @e1 @e2
|
|
"##,
|
|
"upload" => r##"
|
|
agent-browser upload - Upload files
|
|
|
|
Usage: agent-browser upload <selector> <files...>
|
|
|
|
Uploads one or more files to a file input element.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser upload "#file-input" ./document.pdf
|
|
agent-browser upload @e3 ./image1.png ./image2.png
|
|
"##,
|
|
|
|
// === Keyboard ===
|
|
"press" | "key" => r##"
|
|
agent-browser press - Press a key or key combination
|
|
|
|
Usage: agent-browser press <key>
|
|
|
|
Presses a key or key combination. Supports special keys and modifiers.
|
|
|
|
Aliases: key
|
|
|
|
Special Keys:
|
|
Enter, Tab, Escape, Backspace, Delete, Space
|
|
ArrowUp, ArrowDown, ArrowLeft, ArrowRight
|
|
Home, End, PageUp, PageDown
|
|
F1-F12
|
|
|
|
Modifiers (combine with +):
|
|
Control, Alt, Shift, Meta
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser press Enter
|
|
agent-browser press Tab
|
|
agent-browser press Control+a
|
|
agent-browser press Control+Shift+s
|
|
agent-browser press Escape
|
|
"##,
|
|
"keydown" => r##"
|
|
agent-browser keydown - Press a key down (without release)
|
|
|
|
Usage: agent-browser keydown <key>
|
|
|
|
Presses a key down without releasing it. Use keyup to release.
|
|
Useful for holding modifier keys.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser keydown Shift
|
|
agent-browser keydown Control
|
|
"##,
|
|
"keyup" => r##"
|
|
agent-browser keyup - Release a key
|
|
|
|
Usage: agent-browser keyup <key>
|
|
|
|
Releases a key that was pressed with keydown.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser keyup Shift
|
|
agent-browser keyup Control
|
|
"##,
|
|
|
|
// === Scroll ===
|
|
"scroll" => r##"
|
|
agent-browser scroll - Scroll the page
|
|
|
|
Usage: agent-browser scroll [direction] [amount]
|
|
|
|
Scrolls the page in the specified direction.
|
|
|
|
Arguments:
|
|
direction up, down, left, right (default: down)
|
|
amount Pixels to scroll (default: 300)
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser scroll
|
|
agent-browser scroll down 500
|
|
agent-browser scroll up 200
|
|
agent-browser scroll left 100
|
|
"##,
|
|
"scrollintoview" | "scrollinto" => r##"
|
|
agent-browser scrollintoview - Scroll element into view
|
|
|
|
Usage: agent-browser scrollintoview <selector>
|
|
|
|
Scrolls the page until the specified element is visible in the viewport.
|
|
|
|
Aliases: scrollinto
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser scrollintoview "#footer"
|
|
agent-browser scrollintoview @e15
|
|
"##,
|
|
|
|
// === Wait ===
|
|
"wait" => r##"
|
|
agent-browser wait - Wait for condition
|
|
|
|
Usage: agent-browser wait <selector|ms|option>
|
|
|
|
Waits for an element to appear, a timeout, or other conditions.
|
|
|
|
Modes:
|
|
<selector> Wait for element to appear
|
|
<ms> Wait for specified milliseconds
|
|
--url <pattern> Wait for URL to match pattern
|
|
--load <state> Wait for load state (load, domcontentloaded, networkidle)
|
|
--fn <expression> Wait for JavaScript expression to be truthy
|
|
--text <text> Wait for text to appear on page
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser wait "#loading-spinner"
|
|
agent-browser wait 2000
|
|
agent-browser wait --url "**/dashboard"
|
|
agent-browser wait --load networkidle
|
|
agent-browser wait --fn "window.appReady === true"
|
|
agent-browser wait --text "Welcome back"
|
|
"##,
|
|
|
|
// === Screenshot/PDF ===
|
|
"screenshot" => r##"
|
|
agent-browser screenshot - Take a screenshot
|
|
|
|
Usage: agent-browser screenshot [path]
|
|
|
|
Captures a screenshot of the current page. If no path is provided,
|
|
outputs base64-encoded image data.
|
|
|
|
Options:
|
|
--full, -f Capture full page (not just viewport)
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser screenshot
|
|
agent-browser screenshot ./screenshot.png
|
|
agent-browser screenshot --full ./full-page.png
|
|
"##,
|
|
"pdf" => r##"
|
|
agent-browser pdf - Save page as PDF
|
|
|
|
Usage: agent-browser pdf <path>
|
|
|
|
Saves the current page as a PDF file.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser pdf ./page.pdf
|
|
agent-browser pdf ~/Documents/report.pdf
|
|
"##,
|
|
|
|
// === Snapshot ===
|
|
"snapshot" => r##"
|
|
agent-browser snapshot - Get accessibility tree snapshot
|
|
|
|
Usage: agent-browser snapshot [options]
|
|
|
|
Returns an accessibility tree representation of the page with element
|
|
references (like @e1, @e2) that can be used in subsequent commands.
|
|
Designed for AI agents to understand page structure.
|
|
|
|
Options:
|
|
-i, --interactive Only include interactive elements
|
|
-c, --compact Remove empty structural elements
|
|
-d, --depth <n> Limit tree depth
|
|
-s, --selector <sel> Scope snapshot to CSS selector
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser snapshot
|
|
agent-browser snapshot -i
|
|
agent-browser snapshot --compact --depth 5
|
|
agent-browser snapshot -s "#main-content"
|
|
"##,
|
|
|
|
// === Eval ===
|
|
"eval" => r##"
|
|
agent-browser eval - Execute JavaScript
|
|
|
|
Usage: agent-browser eval <script>
|
|
|
|
Executes JavaScript code in the browser context and returns the result.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser eval "document.title"
|
|
agent-browser eval "window.location.href"
|
|
agent-browser eval "document.querySelectorAll('a').length"
|
|
"##,
|
|
|
|
// === Close ===
|
|
"close" | "quit" | "exit" => r##"
|
|
agent-browser close - Close the browser
|
|
|
|
Usage: agent-browser close
|
|
|
|
Closes the browser instance for the current session.
|
|
|
|
Aliases: quit, exit
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser close
|
|
agent-browser close --session mysession
|
|
"##,
|
|
|
|
// === Get ===
|
|
"get" => r##"
|
|
agent-browser get - Retrieve information from elements or page
|
|
|
|
Usage: agent-browser get <subcommand> [args]
|
|
|
|
Retrieves various types of information from elements or the page.
|
|
|
|
Subcommands:
|
|
text <selector> Get text content of element
|
|
html <selector> Get inner HTML of element
|
|
value <selector> Get value of input element
|
|
attr <selector> <name> Get attribute value
|
|
title Get page title
|
|
url Get current URL
|
|
count <selector> Count matching elements
|
|
box <selector> Get bounding box (x, y, width, height)
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser get text @e1
|
|
agent-browser get html "#content"
|
|
agent-browser get value "#email-input"
|
|
agent-browser get attr "#link" href
|
|
agent-browser get title
|
|
agent-browser get url
|
|
agent-browser get count "li.item"
|
|
agent-browser get box "#header"
|
|
"##,
|
|
|
|
// === Is ===
|
|
"is" => r##"
|
|
agent-browser is - Check element state
|
|
|
|
Usage: agent-browser is <subcommand> <selector>
|
|
|
|
Checks the state of an element and returns true/false.
|
|
|
|
Subcommands:
|
|
visible <selector> Check if element is visible
|
|
enabled <selector> Check if element is enabled (not disabled)
|
|
checked <selector> Check if checkbox/radio is checked
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser is visible "#modal"
|
|
agent-browser is enabled "#submit-btn"
|
|
agent-browser is checked "#agree-checkbox"
|
|
"##,
|
|
|
|
// === Find ===
|
|
"find" => r##"
|
|
agent-browser find - Find and interact with elements by locator
|
|
|
|
Usage: agent-browser find <locator> <value> [action] [text]
|
|
|
|
Finds elements using semantic locators and optionally performs an action.
|
|
|
|
Locators:
|
|
role <role> Find by ARIA role (--name <n>, --exact)
|
|
text <text> Find by text content (--exact)
|
|
label <label> Find by associated label (--exact)
|
|
placeholder <text> Find by placeholder text (--exact)
|
|
alt <text> Find by alt text (--exact)
|
|
title <text> Find by title attribute (--exact)
|
|
testid <id> Find by data-testid attribute
|
|
first <selector> First matching element
|
|
last <selector> Last matching element
|
|
nth <index> <selector> Nth matching element (0-based)
|
|
|
|
Actions (default: click):
|
|
click, fill, type, hover, focus, check, uncheck
|
|
|
|
Options:
|
|
--name <name> Filter role by accessible name
|
|
--exact Require exact text match
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser find role button click --name Submit
|
|
agent-browser find text "Sign In" click
|
|
agent-browser find label "Email" fill "user@example.com"
|
|
agent-browser find placeholder "Search..." type "query"
|
|
agent-browser find testid "login-form" click
|
|
agent-browser find first "li.item" click
|
|
agent-browser find nth 2 ".card" hover
|
|
"##,
|
|
|
|
// === Mouse ===
|
|
"mouse" => r##"
|
|
agent-browser mouse - Low-level mouse operations
|
|
|
|
Usage: agent-browser mouse <subcommand> [args]
|
|
|
|
Performs low-level mouse operations for precise control.
|
|
|
|
Subcommands:
|
|
move <x> <y> Move mouse to coordinates
|
|
down [button] Press mouse button (left, right, middle)
|
|
up [button] Release mouse button
|
|
wheel <dy> [dx] Scroll mouse wheel
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser mouse move 100 200
|
|
agent-browser mouse down
|
|
agent-browser mouse up
|
|
agent-browser mouse down right
|
|
agent-browser mouse wheel 100
|
|
agent-browser mouse wheel -50 0
|
|
"##,
|
|
|
|
// === Set ===
|
|
"set" => r##"
|
|
agent-browser set - Configure browser settings
|
|
|
|
Usage: agent-browser set <setting> [args]
|
|
|
|
Configures various browser settings and emulation options.
|
|
|
|
Settings:
|
|
viewport <w> <h> Set viewport size
|
|
device <name> Emulate device (e.g., "iPhone 12")
|
|
geo <lat> <lng> Set geolocation
|
|
offline [on|off] Toggle offline mode
|
|
headers <json> Set extra HTTP headers
|
|
credentials <user> <pass> Set HTTP authentication
|
|
media [dark|light] Set color scheme preference
|
|
[reduced-motion] Enable reduced motion
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser set viewport 1920 1080
|
|
agent-browser set device "iPhone 12"
|
|
agent-browser set geo 37.7749 -122.4194
|
|
agent-browser set offline on
|
|
agent-browser set headers '{"X-Custom": "value"}'
|
|
agent-browser set credentials admin secret123
|
|
agent-browser set media dark
|
|
agent-browser set media light reduced-motion
|
|
"##,
|
|
|
|
// === Network ===
|
|
"network" => r##"
|
|
agent-browser network - Network interception and monitoring
|
|
|
|
Usage: agent-browser network <subcommand> [args]
|
|
|
|
Intercept, mock, or monitor network requests.
|
|
|
|
Subcommands:
|
|
route <url> [options] Intercept requests matching URL pattern
|
|
--abort Abort matching requests
|
|
--body <json> Respond with custom body
|
|
unroute [url] Remove route (all if no URL)
|
|
requests [options] List captured requests
|
|
--clear Clear request log
|
|
--filter <pattern> Filter by URL pattern
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser network route "**/api/*" --abort
|
|
agent-browser network route "**/data.json" --body '{"mock": true}'
|
|
agent-browser network unroute
|
|
agent-browser network requests
|
|
agent-browser network requests --filter "api"
|
|
agent-browser network requests --clear
|
|
"##,
|
|
|
|
// === Storage ===
|
|
"storage" => r##"
|
|
agent-browser storage - Manage web storage
|
|
|
|
Usage: agent-browser storage <type> [operation] [key] [value]
|
|
|
|
Manage localStorage and sessionStorage.
|
|
|
|
Types:
|
|
local localStorage
|
|
session sessionStorage
|
|
|
|
Operations:
|
|
get [key] Get all storage or specific key
|
|
set <key> <value> Set a key-value pair
|
|
clear Clear all storage
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser storage local
|
|
agent-browser storage local get authToken
|
|
agent-browser storage local set theme "dark"
|
|
agent-browser storage local clear
|
|
agent-browser storage session get userId
|
|
"##,
|
|
|
|
// === Cookies ===
|
|
"cookies" => r##"
|
|
agent-browser cookies - Manage browser cookies
|
|
|
|
Usage: agent-browser cookies [operation] [args]
|
|
|
|
Manage browser cookies for the current context.
|
|
|
|
Operations:
|
|
get Get all cookies (default)
|
|
set <name> <value> Set a cookie
|
|
clear Clear all cookies
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser cookies
|
|
agent-browser cookies get
|
|
agent-browser cookies set session_id "abc123"
|
|
agent-browser cookies clear
|
|
"##,
|
|
|
|
// === Tabs ===
|
|
"tab" => r##"
|
|
agent-browser tab - Manage browser tabs
|
|
|
|
Usage: agent-browser tab [operation] [args]
|
|
|
|
Manage browser tabs in the current window.
|
|
|
|
Operations:
|
|
list List all tabs (default)
|
|
new [url] Open new tab
|
|
close [index] Close tab (current if no index)
|
|
<index> Switch to tab by index
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser tab
|
|
agent-browser tab list
|
|
agent-browser tab new
|
|
agent-browser tab new https://example.com
|
|
agent-browser tab 2
|
|
agent-browser tab close
|
|
agent-browser tab close 1
|
|
"##,
|
|
|
|
// === Window ===
|
|
"window" => r##"
|
|
agent-browser window - Manage browser windows
|
|
|
|
Usage: agent-browser window <operation>
|
|
|
|
Manage browser windows.
|
|
|
|
Operations:
|
|
new Open new browser window
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser window new
|
|
"##,
|
|
|
|
// === Frame ===
|
|
"frame" => r##"
|
|
agent-browser frame - Switch frame context
|
|
|
|
Usage: agent-browser frame <selector|main>
|
|
|
|
Switch to an iframe or back to the main frame.
|
|
|
|
Arguments:
|
|
<selector> CSS selector for iframe
|
|
main Switch back to main frame
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser frame "#embed-iframe"
|
|
agent-browser frame "iframe[name='content']"
|
|
agent-browser frame main
|
|
"##,
|
|
|
|
// === Dialog ===
|
|
"dialog" => r##"
|
|
agent-browser dialog - Handle browser dialogs
|
|
|
|
Usage: agent-browser dialog <response> [text]
|
|
|
|
Respond to browser dialogs (alert, confirm, prompt).
|
|
|
|
Operations:
|
|
accept [text] Accept dialog, optionally with prompt text
|
|
dismiss Dismiss/cancel dialog
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser dialog accept
|
|
agent-browser dialog accept "my input"
|
|
agent-browser dialog dismiss
|
|
"##,
|
|
|
|
// === Trace ===
|
|
"trace" => r##"
|
|
agent-browser trace - Record execution trace
|
|
|
|
Usage: agent-browser trace <operation> [path]
|
|
|
|
Record a trace for debugging with Playwright Trace Viewer.
|
|
|
|
Operations:
|
|
start [path] Start recording trace
|
|
stop [path] Stop recording and save trace
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser trace start
|
|
agent-browser trace start ./my-trace
|
|
agent-browser trace stop
|
|
agent-browser trace stop ./debug-trace.zip
|
|
"##,
|
|
|
|
// === Record (video) ===
|
|
"record" => r##"
|
|
agent-browser record - Record browser session to video
|
|
|
|
Usage: agent-browser record start <path.webm> [url]
|
|
agent-browser record stop
|
|
agent-browser record restart <path.webm> [url]
|
|
|
|
Record the browser to a WebM video file using Playwright's native recording.
|
|
Creates a fresh browser context but preserves cookies and localStorage.
|
|
If no URL is provided, automatically navigates to your current page.
|
|
|
|
Operations:
|
|
start <path> [url] Start recording (defaults to current URL if omitted)
|
|
stop Stop recording and save video
|
|
restart <path> [url] Stop current recording (if any) and start a new one
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
# Record from current page (preserves login state)
|
|
agent-browser open https://app.example.com/dashboard
|
|
agent-browser snapshot -i # Explore and plan
|
|
agent-browser record start ./demo.webm
|
|
agent-browser click @e3 # Execute planned actions
|
|
agent-browser record stop
|
|
|
|
# Or specify a different URL
|
|
agent-browser record start ./demo.webm https://example.com
|
|
|
|
# Restart recording with a new file (stops previous, starts new)
|
|
agent-browser record restart ./take2.webm
|
|
"##,
|
|
|
|
// === Console/Errors ===
|
|
"console" => r##"
|
|
agent-browser console - View console logs
|
|
|
|
Usage: agent-browser console [--clear]
|
|
|
|
View browser console output (log, warn, error, info).
|
|
|
|
Options:
|
|
--clear Clear console log buffer
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser console
|
|
agent-browser console --clear
|
|
"##,
|
|
"errors" => r##"
|
|
agent-browser errors - View page errors
|
|
|
|
Usage: agent-browser errors [--clear]
|
|
|
|
View JavaScript errors and uncaught exceptions.
|
|
|
|
Options:
|
|
--clear Clear error buffer
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser errors
|
|
agent-browser errors --clear
|
|
"##,
|
|
|
|
// === Highlight ===
|
|
"highlight" => r##"
|
|
agent-browser highlight - Highlight an element
|
|
|
|
Usage: agent-browser highlight <selector>
|
|
|
|
Visually highlights an element on the page for debugging.
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser highlight "#target-element"
|
|
agent-browser highlight @e5
|
|
"##,
|
|
|
|
// === State ===
|
|
"state" => r##"
|
|
agent-browser state - Save/load browser state
|
|
|
|
Usage: agent-browser state <operation> <path>
|
|
|
|
Save or restore browser state (cookies, localStorage, sessionStorage).
|
|
|
|
Operations:
|
|
save <path> Save current state to file
|
|
load <path> Load state from file
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser state save ./auth-state.json
|
|
agent-browser state load ./auth-state.json
|
|
"##,
|
|
|
|
// === Session ===
|
|
"session" => r##"
|
|
agent-browser session - Manage sessions
|
|
|
|
Usage: agent-browser session [operation]
|
|
|
|
Manage isolated browser sessions. Each session has its own browser
|
|
instance with separate cookies, storage, and state.
|
|
|
|
Operations:
|
|
(none) Show current session name
|
|
list List all active sessions
|
|
|
|
Environment:
|
|
AGENT_BROWSER_SESSION Default session name
|
|
|
|
Global Options:
|
|
--json Output as JSON
|
|
--session <name> Use specific session
|
|
|
|
Examples:
|
|
agent-browser session
|
|
agent-browser session list
|
|
agent-browser --session test open example.com
|
|
"##,
|
|
|
|
// === Install ===
|
|
"install" => r##"
|
|
agent-browser install - Install browser binaries
|
|
|
|
Usage: agent-browser install [--with-deps]
|
|
|
|
Downloads and installs browser binaries required for automation.
|
|
|
|
Options:
|
|
-d, --with-deps Also install system dependencies (Linux only)
|
|
|
|
Examples:
|
|
agent-browser install
|
|
agent-browser install --with-deps
|
|
"##,
|
|
|
|
_ => return false,
|
|
};
|
|
println!("{}", help.trim());
|
|
true
|
|
}
|
|
|
|
pub fn print_help() {
|
|
println!(
|
|
r#"
|
|
agent-browser - fast browser automation CLI for AI agents
|
|
|
|
Usage: agent-browser <command> [args] [options]
|
|
|
|
Core Commands:
|
|
open <url> Navigate to URL
|
|
click <sel> Click element (or @ref)
|
|
dblclick <sel> Double-click element
|
|
type <sel> <text> Type into element
|
|
fill <sel> <text> Clear and fill
|
|
press <key> Press key (Enter, Tab, Control+a)
|
|
hover <sel> Hover element
|
|
focus <sel> Focus element
|
|
check <sel> Check checkbox
|
|
uncheck <sel> Uncheck checkbox
|
|
select <sel> <val> Select dropdown option
|
|
drag <src> <dst> Drag and drop
|
|
upload <sel> <files...> Upload files
|
|
scroll <dir> [px] Scroll (up/down/left/right)
|
|
scrollintoview <sel> Scroll element into view
|
|
wait <sel|ms> Wait for element or time
|
|
screenshot [path] Take screenshot
|
|
pdf <path> Save as PDF
|
|
snapshot Accessibility tree with refs (for AI)
|
|
eval <js> Run JavaScript
|
|
close Close browser
|
|
|
|
Navigation:
|
|
back Go back
|
|
forward Go forward
|
|
reload Reload page
|
|
|
|
Get Info: agent-browser get <what> [selector]
|
|
text, html, value, attr <name>, title, url, count, box
|
|
|
|
Check State: agent-browser is <what> <selector>
|
|
visible, enabled, checked
|
|
|
|
Find Elements: agent-browser find <locator> <value> <action> [text]
|
|
role, text, label, placeholder, alt, title, testid, first, last, nth
|
|
|
|
Mouse: agent-browser mouse <action> [args]
|
|
move <x> <y>, down [btn], up [btn], wheel <dy> [dx]
|
|
|
|
Browser Settings: agent-browser set <setting> [value]
|
|
viewport <w> <h>, device <name>, geo <lat> <lng>
|
|
offline [on|off], headers <json>, credentials <user> <pass>
|
|
media [dark|light] [reduced-motion]
|
|
|
|
Network: agent-browser network <action>
|
|
route <url> [--abort|--body <json>]
|
|
unroute [url]
|
|
requests [--clear] [--filter <pattern>]
|
|
|
|
Storage:
|
|
cookies [get|set|clear] Manage cookies
|
|
storage <local|session> Manage web storage
|
|
|
|
Tabs:
|
|
tab [new|list|close|<n>] Manage tabs
|
|
|
|
Debug:
|
|
trace start|stop [path] Record trace
|
|
record start <path> [url] Start video recording (WebM)
|
|
record stop Stop and save video
|
|
console [--clear] View console logs
|
|
errors [--clear] View page errors
|
|
highlight <sel> Highlight element
|
|
|
|
Sessions:
|
|
session Show current session name
|
|
session list List active sessions
|
|
|
|
Setup:
|
|
install Install browser binaries
|
|
install --with-deps Also install system dependencies (Linux)
|
|
|
|
Snapshot Options:
|
|
-i, --interactive Only interactive elements
|
|
-c, --compact Remove empty structural elements
|
|
-d, --depth <n> Limit tree depth
|
|
-s, --selector <sel> Scope to CSS selector
|
|
|
|
Options:
|
|
--session <name> Isolated session (or AGENT_BROWSER_SESSION env)
|
|
--headers <json> HTTP headers scoped to URL's origin (for auth)
|
|
--executable-path <path> Custom browser executable (or AGENT_BROWSER_EXECUTABLE_PATH)
|
|
--extension <path> Load browser extensions (repeatable).
|
|
--proxy <url> Proxy server (http://[user:pass@]host:port)
|
|
--json JSON output
|
|
--full, -f Full page screenshot
|
|
--headed Show browser window (not headless)
|
|
--cdp <port> Connect via CDP (Chrome DevTools Protocol)
|
|
--debug Debug output
|
|
--version, -V Show version
|
|
|
|
Environment:
|
|
AGENT_BROWSER_SESSION Session name (default: "default")
|
|
AGENT_BROWSER_EXECUTABLE_PATH Custom browser executable path
|
|
AGENT_BROWSER_STREAM_PORT Enable WebSocket streaming on port (e.g., 9223)
|
|
|
|
Examples:
|
|
agent-browser open example.com
|
|
agent-browser snapshot -i # Interactive elements only
|
|
agent-browser click @e2 # Click by ref from snapshot
|
|
agent-browser fill @e3 "test@example.com"
|
|
agent-browser find role button click --name Submit
|
|
agent-browser get text @e1
|
|
agent-browser screenshot --full
|
|
agent-browser --cdp 9222 snapshot # Connect via CDP port
|
|
"#
|
|
);
|
|
}
|
|
|
|
pub fn print_version() {
|
|
println!("agent-browser {}", env!("CARGO_PKG_VERSION"));
|
|
}
|