基于 Chrome DevTools Protocol (CDP) 的浏览器自动化 HTTP API 服务器。
- 启动/停止浏览器
- 连接到现有浏览器
- 管理浏览器会话
- 导航到 URL
- 刷新页面
- 执行 JavaScript
- 获取页面标题和 URL
- 截图
- 等待加载状态
- 等待元素出现
- 获取页面 HTML
- 检查元素是否存在
- 获取元素文本
- 获取元素属性
- 点击元素
- 鼠标悬停
- 设置元素值
- 检查元素可见性
- 获取所有匹配元素
npm run server服务器将在 http://localhost:3000 启动。
POST /api/browser/start
Content-Type: application/json
{
"sessionId": "session-123",
"headless": false
}POST /api/browser/stop
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/page/navigate
Content-Type: application/json
{
"sessionId": "session-123",
"url": "https://example.com"
}POST /api/page/reload
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/page/execute
Content-Type: application/json
{
"sessionId": "session-123",
"script": "document.title"
}GET /api/page/title?sessionId=session-123GET /api/page/url?sessionId=session-123GET /api/page/html?sessionId=session-123POST /api/page/screenshot
Content-Type: application/json
{
"sessionId": "session-123",
"format": "png"
}POST /api/page/navigate-with-loaded-state
Content-Type: application/json
{
"sessionId": "session-123",
"url": "https://example.com"
}POST /api/page/reload-with-loaded-state
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/page/wait-for-load-state-load
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/page/wait-for-dom-content-loaded
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/page/wait-for-network-idle
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/page/wait-for-selector-visible
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "h1"
}POST /api/page/expect-response-text
Content-Type: application/json
{
"sessionId": "session-123",
"urlOrPredicate": "https://api.example.com/data",
"callback": "document.querySelector('#load').click()"
}POST /api/page/inner-text
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "h1"
}POST /api/page/text-content
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "h1"
}POST /api/page/close
Content-Type: application/json
{
"sessionId": "session-123"
}POST /api/element/exists
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "h1"
}POST /api/element/text
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "h1"
}POST /api/element/click
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "#submit-button"
}POST /api/element/hover
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "#menu-item"
}POST /api/element/setValue
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "#username",
"value": "testuser"
}POST /api/element/wait
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "#result",
"timeout": 30000
}POST /api/element/attribute
Content-Type: application/json
{
"sessionId": "session-123",
"selector": "#link",
"attribute": "href"
}POST /api/element/all-texts
Content-Type: application/json
{
"sessionId": "session-123",
"selector": ".item"
}响应:
{
"success": true,
"texts": ["Item 1", "Item 2", "Item 3"]
}POST /api/element/all-attributes
Content-Type: application/json
{
"sessionId": "session-123",
"selector": ".item",
"attribute": "href"
}响应:
{
"success": true,
"attributes": ["url1", "url2", "url3"]
}POST /api/element/count
Content-Type: application/json
{
"sessionId": "session-123",
"selector": ".item"
}响应:
{
"success": true,
"count": 3
}GET /api/sessionsGET /health# 1. 启动浏览器
curl -X POST http://localhost:3000/api/browser/start \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"headless": false
}'
# 2. 导航到页面
curl -X POST http://localhost:3000/api/page/navigate \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"url": "https://example.com"
}'
# 3. 获取页面标题
curl http://localhost:3000/api/page/title?sessionId=test-session
# 4. 截图
curl -X POST http://localhost:3000/api/page/screenshot \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"format": "png"
}'
# 5. 关闭浏览器
curl -X POST http://localhost:3000/api/browser/stop \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session"
}'# 检查元素是否存在
curl -X POST http://localhost:3000/api/element/exists \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"selector": "h1"
}'
# 获取元素文本
curl -X POST http://localhost:3000/api/element/text \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"selector": "h1"
}'
# 点击元素
curl -X POST http://localhost:3000/api/element/click \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"selector": "#submit-button"
}'
# 设置输入框值
curl -X POST http://localhost:3000/api/element/setValue \
-H "Content-Type: application/json" \
-d '{
"sessionId": "test-session",
"selector": "#username",
"value": "testuser"
}'所有 API 响应都使用统一的 JSON 格式:
{
"success": true,
"data": { ... }
}{
"success": false,
"error": "Error message"
}- 会话管理: 每个浏览器实例都有一个唯一的
sessionId,所有操作都需要提供sessionId - 单页面模式: 当前版本为单页面模式,每个会话只有一个默认页面
- 资源清理: 使用完毕后记得调用
/api/browser/stop关闭浏览器 - 超时处理: 大多数操作都有默认超时时间(10秒),可以通过参数自定义
- 错误处理: 所有错误都会返回 JSON 格式的错误信息