BrowserUse05-源码-Controller模块


Controller模块

模块一:当前文件夹核心内容梳理

1.1 核心知识极简概括

  • 统一导出核心控制器:controller模块作为统一入口,导出Tools类作为主要控制器,简化外部依赖管理
  • 操作注册机制:通过Registry系统实现动态操作注册与管理,支持描述、参数模型、域过滤等特性
  • 浏览器操作封装:封装了完整的浏览器操作集合,包括导航、点击、输入、滚动、标签页管理等常用功能
  • 敏感数据处理:内置敏感数据替换机制,支持2FA验证码动态生成等高级功能
  • 结构化输出支持:支持结构化输出和文件系统操作,便于构建复杂的自动化工作流

1.2 子知识扩展

统一导出核心控制器
  • 输入输出:模块输入为Tools类,输出为Controller别名,便于统一访问
  • 异常处理:简单直接的导出机制,基本不会出现异常
  • 配置覆盖关系:无配置覆盖,仅作为类型别名导出
  • 依赖关系:依赖tools.service模块中的Tools
  • 使用场景:任何需要使用浏览器控制功能的地方都会导入此模块
操作注册机制
  • 输入输出:输入为装饰器参数(描述、参数模型等),输出为注册到系统中的可执行操作
  • 异常处理:处理参数验证、类型检查、域过滤等异常情况
  • 配置覆盖关系:支持通过domains/allowed_domains参数进行域过滤配置
  • 依赖关系:依赖Registry服务和ActionModel基类
  • 使用场景:所有自定义操作都需要通过此机制注册到系统中
浏览器操作封装
  • 输入输出:输入为各类操作参数模型,输出为ActionResult对象
  • 异常处理:完善的异常捕获机制,包括BrowserError、TimeoutError等
  • 配置覆盖关系:通过exclude_actions参数可排除不需要的操作
  • 依赖关系:依赖BrowserSession、FileSystem等多个核心服务
  • 使用场景:实现各种浏览器自动化任务的核心功能模块
敏感数据处理
  • 输入输出:输入为包含标记的参数,输出为替换后的实际参数
  • 异常处理:处理密钥缺失、格式错误等情况
  • 配置覆盖关系:通过sensitive_data参数传入密钥字典
  • 依赖关系:依赖pyotp库实现2FA验证码生成功能
  • 使用场景:处理登录密码、API密钥等敏感信息的自动化输入
结构化输出支持
  • 输入输出:输入为Pydantic模型定义,输出为符合模型的数据结构
  • 异常处理:处理模型验证失败等异常情况
  • 配置覆盖关系:通过output_model参数指定输出模型
  • 依赖关系:依赖Pydantic库实现数据验证功能
  • 使用场景:需要规范化的数据输出格式的自动化任务

1.3 知识点详细说明

统一导出核心控制器

controller模块是整个浏览器控制系统的入口点,它通过简单的导出机制将Tools类以Controller别名的形式暴露给外部使用者。这种设计模式实现了以下几个重要目标:

  1. 解耦:外部模块只需要依赖controller模块,而不需要了解内部的具体实现类
  2. 稳定性:即使内部实现类发生变化,只要接口保持一致,外部代码就不需要修改
  3. 简化:使用者只需要导入Controller即可获得完整的功能集
from browser_use.tools.service import Controller

# 导入控制器类
__all__ = ['Controller']
操作注册机制

操作注册机制是整个系统的核心架构之一,它允许开发者动态地注册和管理各种操作。通过Registry服务,系统可以:

  1. 统一管理所有可用操作
  2. 提供操作描述用于LLM提示
  3. 支持基于域名的过滤机制
  4. 实现参数验证和类型检查
操作注册
装饰器处理
参数模型创建
注册到Registry
运行时执行
参数验证
特殊参数注入
执行操作函数
浏览器操作封装

系统封装了丰富的浏览器操作,包括但不限于:

  • 导航操作:搜索、跳转、后退等
  • 元素交互:点击、输入、滚动等
  • 标签页管理:切换、关闭等
  • 文件操作:上传、下载等
  • 数据提取:结构化数据抽取等

这些操作都被封装成异步函数并通过Registry系统进行管理,确保了操作的一致性和可扩展性。

敏感数据处理

为了安全地处理密码、API密钥等敏感信息,系统实现了专门的敏感数据处理机制:

  1. 使用placeholder标记在参数中标识敏感数据占位符
  2. 通过sensitive_data参数传入实际的敏感数据
  3. 系统自动将占位符替换为实际值
  4. 特殊支持TOTP动态验证码生成
结构化输出支持

系统支持通过Pydantic模型定义结构化输出格式,这对于构建可靠的自动化工作流非常重要:

  1. 通过output_model参数指定输出模型
  2. 系统自动验证输出数据是否符合模型定义
  3. 提供清晰的数据结构文档
  4. 支持复杂嵌套数据结构

模块二:核心代码逻辑

2.1 核心类/方法速查表

类/方法名 定位(文件:行号) 输入输出 使用场景示例(1句话) 调试提示(如:断点打在哪)
Controller tools/service.py:1484 Tools类的别名 作为浏览器控制器的主要入口 在导入时确认别名正确建立
Tools tools/service.py:158 核心控制器类 实现所有浏览器操作功能 在act方法入口处打断点查看操作执行流程
Registry tools/registry/service.py:33 操作注册管理器 管理所有注册的操作 在execute_action方法中查看操作执行过程
Tools.action tools/service.py:1448 操作注册装饰器 注册自定义操作 在装饰器函数内查看操作注册过程
Tools.act tools/service.py:1343 执行操作的方法 执行具体的浏览器操作 在方法开始处打断点跟踪操作执行

2.2 最小复现示例(伪代码)

# ①依赖注入
browser_session = BrowserSession()  # 浏览器会话
file_system = FileSystem()          # 文件系统
llm = BaseChatModel()               # 语言模型

# ②关键调用
controller = Controller()            # 创建控制器实例

# 注册一个简单的操作
@controller.action("导航到指定URL")
async def navigate(url: str):
    await browser_session.goto(url)

# 执行操作
action_model = ActionModel(navigate={"url": "https://example.com"})
result = await controller.act(
    action=action_model,
    browser_session=browser_session
)

# ③断言验证
assert result.success == True
assert "Navigated to https://example.com" in result.memory

调试速查

  • 主要入口点:Tools.act方法是所有操作执行的统一入口
  • 操作注册:通过action装饰器注册新操作
  • 参数处理:execute_action方法负责参数验证和特殊参数注入

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐