Browser-Use 是一个开源项目,它让 AI 能够像人类一样理解和操作网页。想象一下,你告诉 AI "帮我在 Amazon 上找台 4K 显示器并加入购物车",它就能自动完成整个流程。这背后的核心技术在于解决了 AI "看不懂"网页的难题。
传统自动化工具如 Selenium 需要开发者预先编写精确的 XPath 或 CSS 选择器来定位元素。而 Browser-Use 的创新之处在于:
这个项目在 GitHub 上获得了 78k+ Star,是目前最受欢迎的 AI 浏览器自动化解决方案之一。
Browser-Use 的技术栈基于 Python + Playwright + LLM,其架构包含五个关键部分:
底层使用 Playwright 通过 Chrome DevTools Protocol (CDP) 与浏览器通信,这种底层协议提供了更精细的控制能力,包括 DOM 检查、JavaScript 执行、网络拦截和输入模拟等。
为什么选择 Playwright 而不是其他浏览器自动化工具?
Browser-Use 的核心创新在于其 DOM 处理方式。传统方法直接将完整 HTML 交给 AI,这会导致:
Browser-Use 的解决方案是 buildDomTree.js 脚本,它执行三重检查:
display: none、visibility: hidden 等不可见元素通过检查的元素会获得一个 highlight_index 编号,最终生成两个关键数据结构:
element_tree:精简后的 DOM 树selector_map:索引到元素的映射字典DOM 提取的调用链如下:
python复制Agent.step()
→ BrowserContext.get_state()
→ DomService.get_clickable_elements()
→ page.evaluate(buildDomTree.js) # 注入JS到浏览器
→ _construct_dom_tree(result) # 转换结果为Python对象
→ 组装BrowserState(DOM树+截图+URL+标题)
→ 将BrowserState发送给LLM
关键代码实现:
python复制class DomService:
def __init__(self, page):
self.page = page
self.js_code = resources.read_text('browser_use.dom', 'buildDomTree.js')
async def _build_dom_tree(self, highlight_elements, viewport_expansion, ...):
args = {
'doHighlightElements': highlight_elements,
'viewportExpansion': viewport_expansion,
}
eval_page = await self.page.evaluate(self.js_code, args)
return await self._construct_dom_tree(eval_page)
Agent 的核心是一个持续运行的循环:
python复制class Agent:
async def run(self, max_steps=100):
for step in range(max_steps):
result = await self.step()
if result.is_done:
break
async def step(self):
# 1. 感知:获取当前页面状态
state = await self.browser_context.get_state()
# 2. 将状态加入消息历史
self._message_manager.add_state_message(state)
# 3. 推理:询问LLM下一步操作
messages = self._message_manager.get_messages()
llm_response = await self.llm.invoke(messages)
# 4. 执行:执行LLM决定的动作
for action in llm_response.actions:
result = await self.controller.act(action, self.browser_context)
return result
System Prompt 是指导 AI 行为的关键,它明确告诉 AI:
示例响应格式:
json复制{
"current_state": {
"evaluation_previous_goal": "Success - 找到了搜索框",
"memory": "我在 Google 首页,需要搜索 cute cats",
"next_goal": "在搜索框 [5] 里输入 cute cats"
},
"action": [
{
"input_text": {
"index": 5,
"text": "cute cats"
}
},
{
"press_keys": {
"keys": "Enter"
}
}
]
}
Controller 和 Registry 共同完成动作执行:
python复制class ClickElementAction(BaseModel):
index: int
xpath: Optional[str] = None
python复制class Controller:
def __init__(self):
self.registry = Registry()
@self.registry.action("Click element", param_model=ClickElementAction)
async def click_element(params, browser):
element_node = await browser.get_dom_element_by_index(params.index)
await browser._click_element_node(element_node)
return ActionResult(extracted_content=f"Clicked element {params.index}")
Browser-Use 支持通过装饰器添加自定义功能:
python复制from browser_use import Tools
tools = Tools()
@tools.action(description='保存商品价格到数据库')
def save_price(product_name: str, price: float) -> str:
db.save(product_name, price)
return f"Saved {product_name}: ${price}"
agent = Agent(
task="找到最便宜的 4K 显示器并保存价格",
llm=llm,
browser=browser,
tools=tools,
)
后台监控系统处理各种边缘情况:
| Watchdog 类型 | 功能描述 |
|---|---|
| Downloads | 跟踪文件下载进度 |
| Screenshot | 操作后自动截图 |
| DOM | 缓存管理 |
| Popup | 处理弹窗 |
| Crash | 浏览器崩溃恢复 |
Token 消耗控制:
DOM 缓存:
LLM 选择:
| 特性 | Browser-Use | Playwright MCP | Stagehand |
|---|---|---|---|
| AI 驱动 | 原生支持 | 需包装 | 原生支持 |
| DOM 提取 | 智能编号 | 无 | 有 |
| 视觉理解 | 双通道 | 无 | 有 |
| 自定义工具 | 装饰器 | 无 | 有限 |
| 多标签页 | 支持 | 支持 | 有限 |
| 社区活跃度 | 78k Star | 官方 | 较新 |
Browser-Use 的创新在于将网页操作抽象为 AI 能理解的任务,其核心价值在于:
对于开发者而言,Browser-Use 不仅是一个工具,更提供了一套可复用的架构模式,适用于各种需要 AI 与界面交互的场景。