跳到内容
MagicFrog
目录

浏览器会话

浏览器标签页、多实例会话,以及云端 agent 如何共享一台计算机的浏览器。

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 路由;关于计算机本身的创建与登记,见云电脑。