名称: firefox-浏览器 描述: 控制用户的Firefox浏览器,保持其登录状态和Cookie不变。当需要以用户身份浏览网站、与认证页面交互、填写表单、点击按钮、截图或获取页面内容时使用。(用户) 允许工具: Bash, 读取, 写入
Firefox浏览器代理桥接
通过WebSocket控制用户实际的Firefox浏览器会话。这使用他们真实的浏览器和现有的登录状态与Cookie——不是无头浏览器。
快速开始
# 0. 如果Firefox未运行,先启动它
nohup firefox &>/dev/null &
# 1. 检查连接
browser ping
# 2. 查看打开的标签页
browser listTabs '{}'
# 3. 启动新会话(推荐)
browser newSession '{"url": "https://example.com"}'
# 4. 读取页面内容,并标记可交互元素
browser getContent '{"format": "annotated"}'
客户端用法
browser <动作> '<json参数>'
动作参考
会话与标签页管理
| 动作 | 描述 | 关键参数 |
|---|---|---|
listTabs |
列出所有窗口中的打开标签页 | - |
newSession |
创建新标签页以进行操作 | url (可选) |
setActiveTab |
切换代理正在操作的标签页 | tabId, focus |
getActiveTab |
获取当前标签页信息 | - |
导航与页面信息
| 动作 | 描述 | 关键参数 |
|---|---|---|
navigate |
在当前标签页中跳转到URL | url, wait, newTab |
getContent |
获取页面内容 | format: annotated, text, html |
getInteractables |
列出可点击元素和输入框 | selector (可选范围) |
screenshot |
将可见区域捕获为PNG | filename (可选) |
交互
| 动作 | 描述 | 关键参数 |
|---|---|---|
click |
点击元素 | selector, text, 或 x/y 坐标 |
type |
在聚焦/选中的输入框中输入 | selector, text, submit, clear |
fillForm |
填写表单字段(输入框、文本域、下拉选择) | fields[] 包含selector/value的数组 |
waitFor |
等待元素/文本出现 | selector, text, timeout |
fillForm - 填写表单的正确方式
重要提示: 没有 fill 命令。请使用带有 fields 数组的 fillForm:
# 填写单个字段
browser fillForm '{"fields": [{"selector": "#email", "value": "test@example.com"}]}'
# 同时填写多个字段(文本输入框、文本域和下拉选择框)
browser fillForm '{"fields": [
{"selector": "#name", "value": "John Doe"},
{"selector": "#email", "value": "john@example.com"},
{"selector": "#subject", "value": "support"},
{"selector": "#message", "value": "Hello world"}
]}'
适用于:<input>, <textarea>, <select>, 复选框, 单选按钮。
控制流
| 动作 | 描述 | 关键参数 |
|---|---|---|
fork |
将标签页复制到多个路径 | paths[] 包含名称 + 命令的数组 |
killFork |
关闭一个分支 | fork (名称) |
listForks |
列出活动分支 | - |
tryUntil |
尝试替代方案直到一个成功 | alternatives[], timeout |
parallel |
在多个URL上运行命令 | branches[] 包含url + 命令的数组 |
认证
| 动作 | 描述 | 关键参数 |
|---|---|---|
getAuthContext |
检测登录页面,可用账户 | - |
requestAuth |
请求用户授权进行认证 | reason |
configureAuth |
设置认证偏好 | authMode, setSiteRule, domain |
推荐工作流
1. 首先检查可用标签页
browser listTabs '{}'
返回:
{
"activeTabId": 123,
"windows": [
{
"windowId": 1,
"focused": true,
"tabs": [
{"tabId": 123, "url": "https://...", "title": "...", "active": true}
]
}
],
"totalTabs": 5
}
2. 开始新会话或选择现有标签页
# 开始新会话
browser newSession '{"url": "https://amazon.com"}'
# 或切换到现有标签页
browser setActiveTab '{"tabId": 456}'
3. 使用带注释的格式读取页面(推荐)
browser getContent '{"format": "annotated"}'
返回带有内联标记的可交互元素的内容:
产品名称
$4.99
[按钮: "加入购物车" | 选择器: #add-btn]
[输入框:文本: "搜索" | 值: "" | 选择器: #search-box]
[链接: "查看详情" | 链接: /product/123 | 选择器: a.details-link]
这显示了哪些是可点击的以及它们在上下文中的位置。
4. 使用选择器进行交互
# 使用带注释输出中的选择器点击
browser click '{"selector": "#add-btn"}'
# 或通过文本(优先选择可见元素)
browser click '{"text": "加入购物车"}'
# 在输入框中输入
browser type '{"selector": "#search-box", "text": "查询", "submit": true}'
Fork: 推测性并行执行
当不确定哪条路径正确时,可以分支标签页并尝试两者:
# 创建分支
browser fork '{
"paths": [
{
"name": "google-auth",
"commands": [{"action": "click", "params": {"text": "使用Google登录"}}]
},
{
"name": "email-auth",
"commands": [{"action": "click", "params": {"text": "使用邮箱登录"}}]
}
]
}'
返回:
{
"forked": true,
"sourceTabId": 123,
"forks": [
{"name": "google-auth", "tabId": 456, "url": "...", "commandResults": [...]},
{"name": "email-auth", "tabId": 789, "url": "...", "commandResults": [...]}
]
}
在特定分支上操作:
browser getContent '{"format": "annotated", "fork": "google-auth"}'
browser click '{"text": "继续", "fork": "google-auth"}'
关闭错误路径:
browser killFork '{"fork": "email-auth"}'
TryUntil: 处理不确定的UI
当确切按钮变化时(如Cookie横幅、A/B测试):
browser tryUntil '{
"alternatives": [
{"action": "click", "params": {"selector": "#accept-cookies"}},
{"action": "click", "params": {"text": "全部接受"}},
{"action": "click", "params": {"selector": ".cookie-dismiss"}}
],
"timeout": 3000
}'
尝试每个直到一个成功。
Parallel: 同时处理多个URL
跨网站比较价格:
browser parallel '{
"branches": [
{"url": "https://amazon.com/product", "commands": [{"action": "getContent", "params": {"format": "text"}}]},
{"url": "https://walmart.com/product", "commands": [{"action": "getContent", "params": {"format": "text"}}]}
]
}'
认证
桥接器检测认证页面并利用现有的浏览器会话:
# 检查是否在登录页面
browser getAuthContext '{}'
# 返回可用账户、OAuth选项等。
隔离会话(用于并行执行)
当并行运行多个任务时,使用 tabId 避免冲突:
# 1. 创建隔离会话 - 获取唯一的tabId
browser newSession '{"url": "https://example.com"}'
# 返回: {"tabId": 15, "url": "...", "windowId": 1}
# 2. 在后续所有命令中使用该tabId
browser navigate '{"url": "https://example.com/page", "tabId": 15}'
browser getContent '{"format": "annotated", "tabId": 15}'
browser click '{"selector": "#btn", "tabId": 15}'
browser type '{"selector": "#input", "text": "hello", "tabId": 15}'
这使得多个代理可以并行工作而不会相互干扰。
提示
- 从
listTabs开始 查看已打开的内容 - 使用
newSession进行干净的启动 - 使用
tabId进行并行/隔离执行 - 使用
annotated格式 - 同时显示内容和可点击元素 - 使用带注释输出中的选择器 - 比文本匹配更可靠
- 不确定时使用Fork - 尝试多条路径,关闭错误的
故障排除
- Firefox未运行? 启动它:
nohup firefox &>/dev/null & - 检查连接:
browser ping - 连接被拒绝? 扩展程序可能需要在
about:debugging中重新加载 - 找不到元素? 使用
browser getContent '{"format": "annotated"}'查看页面内容