Skip to content

Commit 2784667

Browse files
authored
fix readme + add missing wait flags (#19)
* fix inaccuracies * fix wait * address feedback
1 parent f2878c7 commit 2784667

File tree

2 files changed

+108
-13
lines changed

2 files changed

+108
-13
lines changed

README.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,28 @@ agent-browser find role button click --name "Submit"
5555
### Core Commands
5656

5757
```bash
58-
agent-browser open <url> # Navigate to URL
58+
agent-browser open <url> # Navigate to URL (aliases: goto, navigate)
5959
agent-browser click <sel> # Click element
6060
agent-browser dblclick <sel> # Double-click element
6161
agent-browser focus <sel> # Focus element
6262
agent-browser type <sel> <text> # Type into element
6363
agent-browser fill <sel> <text> # Clear and fill
64-
agent-browser press <key> # Press key (Enter, Tab, Control+a)
64+
agent-browser press <key> # Press key (Enter, Tab, Control+a) (alias: key)
6565
agent-browser keydown <key> # Hold key down
6666
agent-browser keyup <key> # Release key
6767
agent-browser hover <sel> # Hover element
6868
agent-browser select <sel> <val> # Select dropdown option
6969
agent-browser check <sel> # Check checkbox
7070
agent-browser uncheck <sel> # Uncheck checkbox
7171
agent-browser scroll <dir> [px] # Scroll (up/down/left/right)
72-
agent-browser scrollintoview <sel> # Scroll element into view
72+
agent-browser scrollintoview <sel> # Scroll element into view (alias: scrollinto)
7373
agent-browser drag <src> <tgt> # Drag and drop
7474
agent-browser upload <sel> <files> # Upload files
7575
agent-browser screenshot [path] # Take screenshot (--full for full page)
7676
agent-browser pdf <path> # Save as PDF
7777
agent-browser snapshot # Accessibility tree with refs (best for AI)
7878
agent-browser eval <js> # Run JavaScript
79-
agent-browser close # Close browser
79+
agent-browser close # Close browser (aliases: quit, exit)
8080
```
8181
8282
### Get Info
@@ -129,9 +129,9 @@ agent-browser find nth 2 "a" text
129129
### Wait
130130
131131
```bash
132-
agent-browser wait <selector> # Wait for element
133-
agent-browser wait <ms> # Wait for time
134-
agent-browser wait --text "Welcome" # Wait for text
132+
agent-browser wait <selector> # Wait for element to be visible
133+
agent-browser wait <ms> # Wait for time (milliseconds)
134+
agent-browser wait --text "Welcome" # Wait for text to appear
135135
agent-browser wait --url "**/dash" # Wait for URL pattern
136136
agent-browser wait --load networkidle # Wait for load state
137137
agent-browser wait --fn "window.ready === true" # Wait for JS condition
@@ -253,6 +253,10 @@ AGENT_BROWSER_SESSION=agent1 agent-browser click "#btn"
253253

254254
# List active sessions
255255
agent-browser session list
256+
# Output:
257+
# Active sessions:
258+
# -> default
259+
# agent1
256260

257261
# Show current session
258262
agent-browser session
@@ -393,15 +397,17 @@ agent-browser uses a client-daemon architecture:
393397
394398
The daemon starts automatically on first command and persists between commands for fast subsequent operations.
395399
400+
**Browser Engine:** Uses Chromium by default. The daemon also supports Firefox and WebKit via the Playwright protocol.
401+
396402
## Platforms
397403
398404
| Platform | Binary | Fallback |
399405
|----------|--------|----------|
400-
| macOS ARM64 | Native Rust | Node.js |
401-
| macOS x64 | Native Rust | Node.js |
402-
| Linux ARM64 | Native Rust | Node.js |
403-
| Linux x64 | Native Rust | Node.js |
404-
| Windows | - | Node.js |
406+
| macOS ARM64 | Native Rust | Node.js |
407+
| macOS x64 | Native Rust | Node.js |
408+
| Linux ARM64 | Native Rust | Node.js |
409+
| Linux x64 | Native Rust | Node.js |
410+
| Windows x64 | Native Rust | Node.js |
405411
406412
## Usage with AI Agents
407413

cli/src/commands.rs

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,44 @@ pub fn parse_command(args: &[String], flags: &Flags) -> Result<Value, ParseError
212212

213213
// === Wait ===
214214
"wait" => {
215+
// Check for --url flag: wait --url "**/dashboard"
216+
if let Some(idx) = rest.iter().position(|&s| s == "--url" || s == "-u") {
217+
let url = rest.get(idx + 1).ok_or_else(|| ParseError::MissingArguments {
218+
context: "wait --url".to_string(),
219+
usage: "wait --url <pattern>",
220+
})?;
221+
return Ok(json!({ "id": id, "action": "waitforurl", "url": url }));
222+
}
223+
224+
// Check for --load flag: wait --load networkidle
225+
if let Some(idx) = rest.iter().position(|&s| s == "--load" || s == "-l") {
226+
let state = rest.get(idx + 1).ok_or_else(|| ParseError::MissingArguments {
227+
context: "wait --load".to_string(),
228+
usage: "wait --load <state>",
229+
})?;
230+
return Ok(json!({ "id": id, "action": "waitforloadstate", "state": state }));
231+
}
232+
233+
// Check for --fn flag: wait --fn "window.ready === true"
234+
if let Some(idx) = rest.iter().position(|&s| s == "--fn" || s == "-f") {
235+
let expr = rest.get(idx + 1).ok_or_else(|| ParseError::MissingArguments {
236+
context: "wait --fn".to_string(),
237+
usage: "wait --fn <expression>",
238+
})?;
239+
return Ok(json!({ "id": id, "action": "waitforfunction", "expression": expr }));
240+
}
241+
242+
// Check for --text flag: wait --text "Welcome"
243+
if let Some(idx) = rest.iter().position(|&s| s == "--text" || s == "-t") {
244+
let text = rest.get(idx + 1).ok_or_else(|| ParseError::MissingArguments {
245+
context: "wait --text".to_string(),
246+
usage: "wait --text <text>",
247+
})?;
248+
// Use getByText locator to wait for text to appear
249+
return Ok(json!({ "id": id, "action": "wait", "selector": format!("text={}", text) }));
250+
}
251+
252+
// Default: selector or timeout
215253
if let Some(arg) = rest.get(0) {
216254
if arg.parse::<u64>().is_ok() {
217255
Ok(json!({ "id": id, "action": "wait", "timeout": arg.parse::<u64>().unwrap() }))
@@ -221,7 +259,7 @@ pub fn parse_command(args: &[String], flags: &Flags) -> Result<Value, ParseError
221259
} else {
222260
Err(ParseError::MissingArguments {
223261
context: "wait".to_string(),
224-
usage: "wait <selector|ms>",
262+
usage: "wait <selector|ms|--url|--load|--fn|--text>",
225263
})
226264
}
227265
}
@@ -1090,6 +1128,57 @@ mod tests {
10901128
assert_eq!(cmd["maxDepth"], 3);
10911129
}
10921130

1131+
// === Wait ===
1132+
1133+
#[test]
1134+
fn test_wait_selector() {
1135+
let cmd = parse_command(&args("wait #element"), &default_flags()).unwrap();
1136+
assert_eq!(cmd["action"], "wait");
1137+
assert_eq!(cmd["selector"], "#element");
1138+
}
1139+
1140+
#[test]
1141+
fn test_wait_timeout() {
1142+
let cmd = parse_command(&args("wait 5000"), &default_flags()).unwrap();
1143+
assert_eq!(cmd["action"], "wait");
1144+
assert_eq!(cmd["timeout"], 5000);
1145+
}
1146+
1147+
#[test]
1148+
fn test_wait_url() {
1149+
let cmd = parse_command(&args("wait --url **/dashboard"), &default_flags()).unwrap();
1150+
assert_eq!(cmd["action"], "waitforurl");
1151+
assert_eq!(cmd["url"], "**/dashboard");
1152+
}
1153+
1154+
#[test]
1155+
fn test_wait_load() {
1156+
let cmd = parse_command(&args("wait --load networkidle"), &default_flags()).unwrap();
1157+
assert_eq!(cmd["action"], "waitforloadstate");
1158+
assert_eq!(cmd["state"], "networkidle");
1159+
}
1160+
1161+
#[test]
1162+
fn test_wait_load_missing_state() {
1163+
let result = parse_command(&args("wait --load"), &default_flags());
1164+
assert!(result.is_err());
1165+
assert!(matches!(result.unwrap_err(), ParseError::MissingArguments { .. }));
1166+
}
1167+
1168+
#[test]
1169+
fn test_wait_fn() {
1170+
let cmd = parse_command(&args("wait --fn window.ready"), &default_flags()).unwrap();
1171+
assert_eq!(cmd["action"], "waitforfunction");
1172+
assert_eq!(cmd["expression"], "window.ready");
1173+
}
1174+
1175+
#[test]
1176+
fn test_wait_text() {
1177+
let cmd = parse_command(&args("wait --text Welcome"), &default_flags()).unwrap();
1178+
assert_eq!(cmd["action"], "wait");
1179+
assert_eq!(cmd["selector"], "text=Welcome");
1180+
}
1181+
10931182
// === Unknown command ===
10941183

10951184
#[test]

0 commit comments

Comments
 (0)