| name | agent-browser |
| description | Browser automation CLI for AI agents. Use for frontend development, debugging, and automated testing. Supports page navigation, DOM inspection, form interaction, keyboard shortcuts, and screenshot capture. |
| license | Apache-2.0 |
agent-browser
Headless browser automation CLI for AI agents. Fast Rust CLI with Node.js fallback.
Installation
npm install -g agent-browser
agent-browser install --with-deps
Decision Tree: Choosing Your Approach
User task → What do you need?
├─ Test page load → open + snapshot + console
│
├─ Interact with elements → snapshot -i + use refs (@e1)
│
├─ Test keyboard shortcuts → keydown + press + keyup
│
├─ Debug issues → console + errors + screenshot
│
└─ Verify content → get text + eval JavaScript
Core Workflow
1. Open and Inspect
agent-browser open <url>
sleep 5
agent-browser snapshot -i
agent-browser console
agent-browser screenshot
2. Interact Using Refs (Recommended)
agent-browser click @e1
agent-browser fill @e2 "text content"
agent-browser hover @e3
3. Keyboard Shortcuts
agent-browser press Enter
agent-browser press Escape
agent-browser keydown Control
agent-browser press p
agent-browser keyup Control
agent-browser keydown Control && agent-browser keydown Shift && agent-browser press p && agent-browser keyup Shift && agent-browser keyup Control
Essential Commands
| Category | Command | Description |
|---|
| Navigation | open <url> | Navigate to URL |
| back / forward | Navigate history |
| reload | Reload page |
| get url / get title | Get current URL/title |
| Inspection | snapshot -i | Interactive elements only |
| snapshot -i -C | Include cursor-interactive |
| snapshot --json | JSON output |
| snapshot --full | All elements (links, buttons, inputs) |
| snapshot --nav | All navigable elements (links) |
| eval "js" | Run JavaScript |
| style <selector> | Get computed CSS styles |
| health | Page health report |
| network | Network request analysis |
| Interaction | click @e1 | Click by ref |
| fill @e1 "text" | Clear and fill input |
| type @e1 "text" | Type without clearing |
| press Enter | Press key |
| scroll down 500 | Scroll page |
| Debug | console | View console messages |
| errors | View page errors |
| screenshot [path] | Take screenshot |
| deep-check | Full page analysis |
| Control | close | Close browser |
Snapshot Options
| Flag | Description |
|---|
-i | Interactive elements only (recommended) |
-C | Include cursor-interactive (onclick, cursor:pointer) |
-c | Compact output |
-d N | Limit depth to N levels |
-s "selector" | Scope to CSS selector |
--json | JSON output for parsing |
--full | ALL elements (links, buttons, inputs, images) |
--nav | All navigation elements (a, area, link) |
Key Names
| Key | Name |
|---|
| Enter | Enter |
| Tab | Tab |
| Escape | Escape |
| Backspace | Backspace |
| Backtick | Backquote |
| Arrow Keys | ArrowUp, ArrowDown, ArrowLeft, ArrowRight |
Selector Types
| Type | Example | Notes |
|---|
| Ref | @e1 | Recommended - from snapshot |
| CSS ID | #submit | |
| CSS Class | .button | |
| Text | text="Submit" | |
| XPath | xpath=//button | |
| Role | role=button --name "Submit" | ARIA role |
强制检查清单 ⚠️
每次测试必须执行以下检查,不能只依赖截图:
1. 页面加载检查
agent-browser open "$URL"
sleep 5
agent-browser snapshot -i
agent-browser console
agent-browser errors
2. 代码层面检查 (不能只看截图)
agent-browser eval "document.scripts.length"
agent-browser eval "document.querySelector('#app') !== null"
agent-browser network
agent-browser eval "
Array.from(document.images).map(img => ({
src: img.src,
complete: img.complete,
naturalWidth: img.naturalWidth
}))
"
3. 页面健康度检查
agent-browser health
4. 深度检查模式 (推荐)
agent-browser deep-check
页面结构分析
问题3解决: 首次获取完整页面结构
问题: 首次只找顶部导航,需要多轮才能找到左侧菜单
解决方案: 使用 --full 或 --nav 选项
agent-browser snapshot --full
agent-browser snapshot --nav
获取所有可导航元素
agent-browser snapshot --nav
获取元素样式
agent-browser style ".sidebar"
agent-browser style "nav"
agent-browser style ".menu-item"
agent-browser eval "
(function() {
const style = window.getComputedStyle(document.body);
return {
backgroundColor: style.backgroundColor,
color: style.color,
fontFamily: style.fontFamily
};
})()
"
图片和图形元素检查
agent-browser eval "
(function() {
const images = Array.from(document.images).map(img => ({
src: img.src.split('/').pop(),
complete: img.complete,
naturalWidth: img.naturalWidth,
naturalHeight: img.naturalHeight,
error: img.error
}));
return images;
})()
"
agent-browser eval "
document.querySelectorAll('canvas').length
"
agent-browser eval "
Array.from(document.querySelectorAll('svg')).map(s => ({
width: s.getAttribute('width'),
height: s.getAttribute('height'),
viewBox: s.getAttribute('viewBox')
}))
"
网络请求分析
agent-browser network
agent-browser eval "
(function() {
// 需要 Performance API 支持
if (!window.performance || !window.performance.getEntries) {
return 'Performance API not supported';
}
return window.performance.getEntries().map(entry => ({
name: entry.name,
type: entry.initiatorType,
status: entry.responseStatus,
duration: entry.duration.toFixed(2)
}));
})()
"
Common Patterns
标准页面加载测试 (含强制检查)
agent-browser open "http://localhost:8080"
sleep 5
agent-browser snapshot -i
agent-browser snapshot --nav
agent-browser console
agent-browser errors
agent-browser eval "document.scripts.length"
agent-browser eval "
Array.from(document.images).filter(img => !img.complete).length
"
agent-browser screenshot
完整页面分析测试
agent-browser open "http://localhost:8080"
sleep 5
agent-browser deep-check
agent-browser snapshot -i
agent-browser snapshot --nav
agent-browser console
agent-browser errors
agent-browser screenshot
Test Page Load
agent-browser open "http://localhost:8080"
sleep 5
agent-browser snapshot -i
agent-browser console | grep -i error
Test Form
agent-browser snapshot -i
agent-browser fill @e1 "username"
agent-browser fill @e2 "password"
agent-browser click @e3
sleep 2
agent-browser get url
Test Keyboard Shortcuts
agent-browser keydown Control && agent-browser keydown Shift && agent-browser press p && agent-browser keyup Shift && agent-browser keyup Control
sleep 1
agent-browser snapshot -i
agent-browser press Escape
Debug Page Issues
agent-browser errors
agent-browser console
agent-browser eval "document.querySelectorAll('*').length"
Sessions
Multiple isolated browser instances:
agent-browser --session test1 open site-a.com
agent-browser --session test2 open site-b.com
agent-browser session list
Best Practices
- Use refs (@e1) instead of CSS selectors - More reliable after page changes
- Always snapshot before interacting - Get fresh refs
- Check console for errors -
agent-browser console
- Use -i flag - Only interactive elements, reduces noise
- Wait after navigation - Pages need time to load
- Close browser when done -
agent-browser close
强制检查原则 ⚠️
必须执行多重验证,不能只依赖截图:
| 检查类型 | 命令 | 原因 |
|---|
| 交互元素 | snapshot -i | 了解可点击元素 |
| 所有导航 | snapshot --nav | 快速找到目标链接 |
| 控制台 | console | 发现潜在问题 |
| JS错误 | errors | 发现运行时错误 |
| 脚本加载 | eval "document.scripts.length" | 确认JS加载 |
| 图片状态 | eval "..." | 发现图片加载失败 |
| 截图 | screenshot | 视觉验证 |
为什么不能只截图:
- ❌ 截图正常 ≠ 代码没问题 (JS错误可能已发生)
- ❌ 截图正常 ≠ 网络请求成功 (API可能已失败)
- ❌ 截图正常 ≠ 图片已加载 (可能显示占位符)
- ❌ 截图正常 ≠ 无控制台警告 (警告可能被忽略)
Common Pitfalls
| Issue | Solution |
|---|
| Elements not found | Use snapshot -i -C for cursor-interactive |
| 401 Unauthorized | Verify token in URL is URL-encoded |
| Page not fully loaded | Increase sleep time after open |
| Shadow DOM elements | Try eval to access shadow roots |
针对性解决方案
问题1: 截图无法感知布局和颜色变化
| 症状 | 解决方案 |
|---|
| 图片显示空白 | 检查 document.images 加载状态 |
| 样式变化不明显 | 使用 eval 获取Computed Style |
| 图表不渲染 | 检查 canvas 元素是否存在 |
| 主题切换无效 | 检查 document.body 的 computed style |
agent-browser eval "Array.from(document.images).filter(i => !i.complete).length"
agent-browser style "body"
agent-browser eval "getComputedStyle(document.body).backgroundColor"
问题2: 排查错误不会举一反三
| 症状 | 解决方案 |
|---|
| 截图正常但功能异常 | 必须检查 console 和 errors |
| 页面白屏 | 检查 JS 脚本加载数量 |
| API 请求失败 | 检查 network |
agent-browser console
agent-browser errors
agent-browser eval "document.scripts.length"
问题3: 首次只找顶部导航
| 症状 | 解决方案 |
|---|
| 找不到左侧菜单 | 使用 snapshot --nav 获取所有链接 |
| 找不到目标页面 | 使用 snapshot --full 获取全部元素 |
agent-browser snapshot --nav
agent-browser snapshot --full
Universal Testing Patterns
测试模式分类
根据项目类型选择合适的测试模式:
项目类型
├── Web应用 (SPA/SSR)
│ ├── 登录认证测试
│ ├── 页面导航测试
│ ├── 表单交互测试
│ └── API集成测试
├── 管理后台
│ ├── CRUD操作测试
│ ├── 表格列表测试
│ ├── 弹窗对话框测试
│ └── 权限控制测试
├── 编辑器/Web IDE
│ ├── 文件操作测试
│ ├── 代码编辑测试
│ └── 终端集成测试
└── 响应式/多端
├── 布局适配测试
└── 主题切换测试
Quick Start Templates
1. Web应用基础测试模板
#!/bin/bash
APP_URL="${APP_URL:-http://localhost:8080}"
WAIT_TIME="${WAIT_TIME:-5}"
echo "=== Web应用基础测试 ==="
echo "测试URL: $APP_URL"
agent-browser open "$APP_URL"
sleep $WAIT_TIME
agent-browser snapshot -i
ERRORS=$(agent-browser errors 2>&1)
if echo "$ERRORS" | grep -qi "error"; then
echo "❌ 发现JS错误: $ERRORS"
fi
agent-browser get title
agent-browser close
2. 登录认证测试模板
#!/bin/bash
APP_URL="${APP_URL:-http://localhost:8080}"
USERNAME="${USERNAME:-admin}"
PASSWORD="${PASSWORD:-123456}"
agent-browser open "$APP_URL"
sleep 5
agent-browser snapshot -i
agent-browser fill @e1 "$USERNAME"
agent-browser fill @e2 "$PASSWORD"
agent-browser click @e3
sleep 3
CURRENT_URL=$(agent-browser get url)
if echo "$CURRENT_URL" | grep -q "login"; then
echo "❌ 登录失败,停留在登录页"
agent-browser screenshot /tmp/login-fail.png
else
echo "✅ 登录成功: $CURRENT_URL"
fi
agent-browser close
3. 管理后台CRUD测试模板
#!/bin/bash
agent-browser open "http://localhost:8080/list"
sleep 5
agent-browser snapshot -i
echo "=== 测试新建功能 ==="
agent-browser click @e1
sleep 2
agent-browser snapshot -i
agent-browser fill @e1 "测试数据"
agent-browser click @e2
sleep 2
echo "=== 测试列表展示 ==="
agent-browser snapshot -i
agent-browser eval "document.body.innerText" | grep -q "测试数据"
echo "=== 测试编辑功能 ==="
agent-browser click @e3
sleep 2
agent-browser fill @e1 "修改后数据"
agent-browser click @e2
sleep 2
echo "=== 测试删除功能 ==="
agent-browser click @e4
sleep 1
agent-browser snapshot -i
agent-browser click @e5
sleep 2
agent-browser close
4. 主题切换测试模板
#!/bin/bash
agent-browser open "http://localhost:8080/settings"
sleep 5
agent-browser snapshot -i
agent-browser screenshot /tmp/theme-before.png
agent-browser click @e1
sleep 2
agent-browser screenshot /tmp/theme-dark.png
agent-browser eval "
(function() {
const body = document.body;
const bgColor = window.getComputedStyle(body).backgroundColor;
return { bgColor };
})()
"
agent-browser click @e1
sleep 2
agent-browser screenshot /tmp/theme-light.png
agent-browser close
5. 表格列表测试模板
#!/bin/bash
agent-browser open "http://localhost:8080/list"
sleep 5
agent-browser snapshot -i
echo "=== 测试分页 ==="
agent-browser click @e1
sleep 2
agent-browser snapshot -i
echo "=== 测试排序 ==="
agent-browser click @e2
sleep 1
echo "=== 测试筛选 ==="
agent-browser fill @e3 "关键词"
agent-browser press Enter
sleep 2
echo "=== 测试行展开 ==="
agent-browser click @e4
sleep 1
agent-browser snapshot -i
agent-browser close
测试用例设计原则
AAA模式 (Arrange-Act-Assert)
agent-browser open "http://localhost:8080/page"
sleep 5
agent-browser fill @e1 "test"
agent-browser click @e2
agent-browser get url
agent-browser eval "document.body.innerText" | grep -q "预期结果"
测试数据管理
export TEST_USERNAME="testuser"
export TEST_EMAIL="test@example.com"
TIMESTAMP=$(date +%s)
UNIQUE_NAME="test_${TIMESTAMP}"
等待策略
| 场景 | 等待方式 | 示例 |
|---|
| 页面导航 | 固定等待 | sleep 5 |
| API加载 | 检查加载状态 | agent-browser eval "document.querySelector('.loading').style.display" |
| 动画过渡 | 等待过渡完成 | sleep 1 (CSS transition 通常 300ms) |
| 弹窗动画 | 等待DOM出现 | agent-browser snapshot -i |
调试技巧
常见问题快速诊断
agent-browser console | grep -i "failed\|error\|cannot"
agent-browser eval "document.readyState"
agent-browser snapshot -i -C
agent-browser eval "element.getBoundingClientRect()"
agent-browser snapshot
agent-browser eval "document.querySelectorAll('.class').length"
agent-browser eval "window.getComputedStyle(document.querySelector('.element')).backgroundColor"
agent-browser console | grep -E "fetch|xhr|404|500"
元素定位技巧
agent-browser click "text=提交按钮"
agent-browser click "text*=删除"
agent-browser click "xpath=//button[@class='submit']"
agent-browser click "role=button --name '提交'"
状态验证模式
agent-browser eval "
(function() {
const loading = document.querySelector('.loading');
return !loading || loading.style.display === 'none';
})()
"
agent-browser eval "
(function() {
const modal = document.querySelector('.arco-modal');
return modal && !modal.classList.contains('arco-modal-hidden');
})()
"
agent-browser eval "
(function() {
const error = document.querySelector('.arco-form-item-error');
return error ? error.innerText : null;
})()
"
测试脚本最佳实践
1. 错误处理
#!/bin/bash
set -e
trap 'echo "测试失败,截图: /tmp/fail.png"; agent-browser screenshot /tmp/fail.png; agent-browser close; exit 1' ERR
agent-browser open "http://localhost:8080"
agent-browser close
2. 日志输出
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
log "开始测试..."
log "测试完成"
3. 截图命名规范
agent-browser screenshot /tmp/login-success.png
agent-browser screenshot /tmp/form-filled.png
agent-browser screenshot /tmp/error-state.png
4. 条件跳过
agent-browser snapshot -i
if agent-browser eval "document.querySelector('.advanced-feature')"; then
echo "高级功能存在,测试它"
else
echo "高级功能不存在,跳过"
fi
快速验证清单
每次测试前快速检查:
□ 服务是否运行中?
□ 页面URL是否正确?
□ Token/登录状态是否有效?
□ 测试数据是否准备好?
□ 截图目录是否存在?
UI Framework Specific Tips
Arco Design Vue 测试技巧
常见组件选择器
agent-browser fill "input[placeholder*='请输入']" "value"
agent-browser click "button:has-text('提交')"
agent-browser click "button:has-text('取消')"
agent-browser click "table tbody tr:first-child .arco-table-cell"
agent-browser click ".arco-table-pagination button.arco-pagination-next"
agent-browser click ".arco-modal button:has-text('确定')"
agent-browser click ".arco-select-view"
agent-browser snapshot -i
agent-browser click "text=选项1"
agent-browser snapshot -i
agent-browser click ".arco-drawer-close"
agent-browser eval "
document.querySelectorAll('.arco-form-item-error-message').length > 0
"
主题切换验证
agent-browser eval "
document.querySelector('html').getAttribute('arco-theme')
"
agent-browser click "button:has-text('主题')"
sleep 1
agent-browser eval "
(function() {
const body = document.body;
const bg = window.getComputedStyle(body).backgroundColor;
const components = {
modal: document.querySelector('.arco-modal'),
dropdown: document.querySelector('.arco-dropdown'),
tooltip: document.querySelector('.arco-tooltip'),
};
return { bg, components };
})()
"
Vue 3 测试技巧
响应式数据验证
agent-browser eval "
(function() {
// 获取Vue组件实例
const el = document.querySelector('#app');
const vm = el.__vue_app__ || el._vnode;
// 获取响应式数据
const count = vm.config.globalProperties.\$store?.state?.count
|| vm.exposed?.count;
return { count };
})()
"
agent-browser eval "
(function() {
const el = document.querySelector('.dynamic-element');
return {
exists: !!el,
visible: el && (el.style.display !== 'none' && !el.hasAttribute('hidden'))
};
})()
"
路由测试
agent-browser eval "window.location.hash"
agent-browser eval "window.history.state.current"
agent-browser click "a[href='/path']"
sleep 2
agent-browser get url
agent-browser eval "
(function() {
const url = window.location.href;
const expected = '/expected-path';
return { current: url, expected, match: url.includes(expected) };
})()
"
React 测试技巧
组件状态验证
agent-browser eval "
(function() {
// 使用React DevTools或在控制台获取
const root = document.getElementById('root');
return root._reactRootContainer?._internalRoot?.current?.memoizedState;
})()
"
agent-browser eval "
document.body.innerText.includes('状态值')
"
agent-browser console | grep -i "useEffect"
状态管理验证
agent-browser eval "
window.__REDUX_DEVTOOLS_EXTENSION__
"
Advanced Testing Patterns
1. 批量测试脚本
#!/bin/bash
PAGES=(
"/"
"/login"
"/dashboard"
"/settings"
"/help"
)
BASE_URL="http://localhost:8080"
for page in "${PAGES[@]}"; do
echo "=== Testing $page ==="
agent-browser open "$BASE_URL$page"
sleep 3
ERRORS=$(agent-browser errors 2>&1)
if echo "$ERRORS" | grep -qi "error"; then
echo "❌ $page: 发现错误"
agent-browser screenshot "/tmp/error-$page.png"
else
echo "✅ $page: 正常"
fi
agent-browser close
sleep 1
done
2. 数据驱动测试
#!/bin/bash
TEST_DATA_CSV="test_data.csv"
while IFS=',' read -r name email role; do
echo "=== Testing user: $name ==="
agent-browser open "http://localhost:8080/user/add"
sleep 3
agent-browser fill @e1 "$name"
agent-browser fill @e2 "$email"
agent-browser fill @e3 "$role"
agent-browser click @e4
sleep 2
done < <(tail -n +2 "$TEST_DATA_CSV")
agent-browser close
3. 对比测试
#!/bin/bash
agent-browser open "http://localhost:8080/page"
sleep 5
agent-browser screenshot "/tmp/before.png"
agent-browser open "http://localhost:8080/page"
sleep 5
agent-browser screenshot "/tmp/after.png"
4. 性能测试辅助
#!/bin/bash
agent-browser open "http://localhost:8080/page"
sleep 5
agent-browser eval "
(function() {
const perfData = window.performance.timing;
return {
loadTime: perfData.loadEventEnd - perfData.navigationStart,
domReady: perfData.domContentLoadedEventEnd - perfData.navigationStart,
firstPaint: perfData.firstPaint,
};
})()
"
agent-browser eval "
(function() {
return new Promise((resolve) => {
if ('web-vitals' in window) {
// web-vitals 库已加载
}
resolve({
cls: 0,
lcp: 0,
fid: 0
});
});
})()
"
参考资源
测试框架
API测试工具
- REST Assured: Java REST API测试
- Supertest: Node.js HTTP测试
- HttpRunner: Python测试框架
- httpie: 命令行HTTP客户端 https://httpie.io/
辅助工具