agent 驱动的是目标计算机上的真实浏览器。在已登记机器上,系统会启动自己管理的独立浏览器实例;在你自己的机器上,浏览器扩展直接提供你现有浏览器里的页面访问。本页讲前者:标签页如何管理、会话如何隔离,以及多个任务共享一台计算机时会话如何分配。
会话与实例
每个浏览器会话都是一个完全独立的浏览器实例——自己的进程、自己的数据目录。会话之间不共享任何东西。
多数浏览器命令接受可选的 sessionId。只有一个会话在跑时,命令自动指向它。有多个会话在跑时,调用必须指名会话——省略 id 得到的是一个会列出当前存活会话的错误,而不是一次猜测。
打开标签页时传 newInstance: true 会启动一个全新的独立浏览器实例,而不是复用现有会话。
标签页管理
四个标签页操作,各自以会话为作用域:
| Method | 参数 | 返回 | 行为 |
|---|---|---|---|
tabs.list |
sessionId? |
会话 id、channel、标签页 | 列出该会话的标签页,含 tabId、URL、标题,以及当前激活的是哪一个。 |
tabs.open |
url?、newInstance?、sessionId? |
会话 id、tab id、channel | 打开一个新标签页。URL 必须是 http(s) URL;about:blank 也接受,作为规范的空标签页。导航只接受 http(s)。 |
tabs.activate |
tabId、sessionId? |
ok、会话 id、tab id、channel | 把既有标签页带到前台(必要时先创建目标)。 |
tabs.close |
tabId、sessionId? |
ok、会话 id、tab id、channel | 关闭该标签页。 |
快照与导航也接受 tabId;省略时使用该会话当前激活的标签页。channel 字段告诉你应答的是哪个面。
句柄规则
sessionId标识一个会话。省略时使用当前会话;没有会话时启动一个新会话。tabId只在所属会话内有效。来自另一个会话(或另一台计算机)的标签页句柄无法解析。browser.close关停一个会话并删除其数据目录。它从不触碰你自己的浏览器。- 所有标签页操作只作用于系统管理的会话。在一台只有你自己的浏览器的机器上(扩展通道),标签页管理会显式失败,而不是动你的浏览器。
会话生命周期
- 空闲回收——空闲超过 10 分钟的会话(以及进程已死的会话)会被回收。
- 显式关闭——
browser.close立即关闭一个会话并移除其数据目录。 - 不留孤儿——服务重启时会清扫此前运行留下的残余浏览器进程,只清理系统自己启动的进程,绝不误伤其他程序。
在没有 GUI 会话的地方(例如已登记服务器),浏览器以 headless 运行,浏览器方法照常可用。如果计算机根本没有声明浏览器能力,操作会以显式能力错误拒绝——绝不静默跳过。
云端 agent 调度
多个 agent 任务共享一台计算机时,按以下规则分配浏览器会话:
- 按任务绑定——每个任务有自己的会话,互不混用。
- 并发上限——每台计算机最多 4 个并发浏览器会话。到达上限时,后到的任务排队等待(默认 30 秒预算,超时以显式错误失败),绝不抢占正在运行的任务。
- 终态回收——任务完成、失败或取消时,其会话被回收。没能正常关闭的会话会出现在统计里,泄漏可见,不会无声消失。
- 可追溯——会话的分配与回收都有记录,写明所涉任务与计算机。
扩展通道
在用你自己的浏览器的机器上,MagicFrog 浏览器扩展提供该浏览器内页面的导航与结构化 DOM 快照——不启动新的浏览器,不开调试端口。扩展不提供标签页管理;系统管理的标签页操作也从不作用于你的浏览器。两者是不同的面。
关于工具调用最初如何到达某台指定计算机,见 Computer ID 路由;关于计算机本身的创建与登记,见云电脑。