Firefox浏览器自动化控制桥接Skill firefox-browser

Firefox浏览器自动化控制桥接是一个通过WebSocket协议控制真实Firefox浏览器会话的工具。它允许用户或AI代理在保持现有登录状态和Cookie的情况下,自动化执行网页浏览、表单填写、按钮点击、截图和内容提取等任务。支持并行执行、分支测试、UI元素智能识别和认证页面处理,是网页自动化测试、数据抓取和RPA流程的理想选择。关键词:Firefox自动化,浏览器控制,WebSocket,网页抓取,RPA,自动化测试,Cookie保持,并行执行。

测试 0 次安装 0 次浏览 更新于 2/28/2026

名称: 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}'

这使得多个代理可以并行工作而不会相互干扰。

提示

  1. listTabs 开始 查看已打开的内容
  2. 使用 newSession 进行干净的启动
  3. 使用 tabId 进行并行/隔离执行
  4. 使用 annotated 格式 - 同时显示内容和可点击元素
  5. 使用带注释输出中的选择器 - 比文本匹配更可靠
  6. 不确定时使用Fork - 尝试多条路径,关闭错误的

故障排除

  1. Firefox未运行? 启动它:nohup firefox &>/dev/null &
  2. 检查连接browser ping
  3. 连接被拒绝? 扩展程序可能需要在 about:debugging 中重新加载
  4. 找不到元素? 使用 browser getContent '{"format": "annotated"}' 查看页面内容