Browser Harness 共学笔记

26-05-19|从安装连接、自然语言浏览器操作,到前端调试与 helper 沉淀

1. 学习总览

本次共学以 browser-harness 为核心,完成了从安装、连接隔离 Chrome、网页操作、自然语言任务、复杂网页提取、canvas 页游观察、前端调试,到 helper 沉淀的完整闭环。

操作能力

打开网页、截图观察、坐标点击、输入、滚动、JS 提取。

分析能力

去噪、详情页提取、无限滚动、证据链追踪、可信度判断。

调试能力

复现 bug、读取 console/network/storage、定位接口失败。

沉淀能力

理解 agent_helpers.py 与 domain-skills,并沉淀 get_debug_snapshot。

2. browser-harness 的定位

browser-harness 是面向 LLM Agent 的真实浏览器控制工具,通过 CDP 连接真实 Chrome/Chromium,让 Agent 能像人一样观察和操作网页。

用户自然语言任务
    ↓
Agent 规划与判断
    ↓
browser-harness CLI
    ↓
Chrome DevTools Protocol
    ↓
真实浏览器页面
核心心法:截图观察 → 坐标点击 → 状态验证 → 必要时 JS/CDP 辅助
工具典型思路
Selenium人写选择器和固定流程
Playwright人写测试脚本或自动化脚本
browser-harnessAgent 观察、操作、验证、沉淀

3. 安装与连接隔离 Chrome

安装

git clone https://github.com/browser-use/browser-harness.git
uv tool install -e "/e/CodeLab/AiLab/browser-harness-learn/browser-harness"

本次安装后 CLI 位于 /c/Users/Administrator/.local/bin/browser-harness,可用 browser-harness --doctor 做连接诊断。

启动隔离 Chrome

powershell.exe -NoProfile -Command "Start-Process -FilePath 'C:\Program Files\Google\Chrome\Application\chrome.exe' -ArgumentList '--remote-debugging-port=9222','--user-data-dir=E:\CodeLab\AiLab\browser-harness-learn\chrome-profile','about:blank'"

连接

BU_CDP_URL=http://127.0.0.1:9222 browser-harness <<'PY'
print(page_info())
PY

BU_CDP_URL 是环境变量,告诉 browser-harness 直接连接指定 CDP 地址。启动后应验证 page_info() 和截图,不假设页面已经正确加载。

4. 基础操作能力

打开页面与截图

new_tab('https://github.com/browser-use/browser-harness')
wait_for_load()
print(page_info())
capture_screenshot()

坐标点击

capture_screenshot()
click_at_xy(x, y)
capture_screenshot()

点击前可用 document.elementFromPoint(x, y) 校准坐标命中元素。

输入与验证

输入后必须读回真实值,如 input.valueselect.valuecheckbox.checked。本次发现 fill_input() 在当前环境可能出现字符重复,因此更稳做法是 JS 清空后再 type_text(),并读回字段值确认。

5. 从 API 到自然语言任务

最终使用方式不是用户手写 Python,而是用户用自然语言描述目标,Agent 在背后调用 browser-harness。

你:请打开页面并提取最新 10 条结果,过滤广告和重复内容。
Agent:打开页面 → 截图 → 提取 → 去重 → 汇总 → 复盘用到的能力
学习后期切换为:我给任务模板 → 用户输入 → Agent 执行 → 复盘。

6. X 搜索场景

登录墙

遇到 X 登录页时,停止并让用户手动登录,不读取或输入密码、验证码。

去噪

  • 关键词命中。
  • 语义相关。
  • 排除广告、刷量、垃圾内容和关键词误伤。
  • 区分高相关、低信息量和重复模板。

无限滚动

每一轮读取当前 DOM
→ 用 status 链接去重保存
→ 滚动
→ 等待
→ 再读取

证据链

对“张雪机车年度冠军前景”追踪时,步骤是先搜索精确关键词,再找最像来源或信息量最高的帖子,打开详情页检查正文、时间、图片、视频、引用帖、外链和来源标注。

本次结论是:X 内传播较多,并出现“来源:美丽浙江”等转述线索,但缺少 WSBK 官方链接、美丽浙江原始链接或官方积分榜,因此可信度为中等,仍需外部官方来源核验。

7. 页游 canvas 操作经验

访问 https://codomino.99.com/ 后发现页面主体是 canvas,DOM 几乎没有文本。

canvas 游戏中按钮只是画在画布上,无法像普通 DOM 按钮一样稳定定位。

Mummy Reborn 试玩判断

画面变化判断
SPIN → STOP回合进行中
出现 x5 / x13触发特殊倍率或免费旋转
符号持续变化自动结算中
STOP → SPIN回合结束
底部数字变化本轮赢分

本次普通玩家级试玩中最终赢分显示为 407,500

边界:即使用户确认是测试游戏,也只做普通玩家级观察和试玩;不做充值、刷分、绕过反作弊、自动挂机、多人对局自动化或刷资源。

8. CDP、CloakBrowser 与 BU_CDP_URL

browser-harness 连接的是 CDP endpoint。只要某浏览器基于 Chromium、开启 remote debugging、提供 CDP 地址,就可尝试连接。

BU_CDP_URL=http://127.0.0.1:9242 browser-harness <<'PY'
print(page_info())
PY

CloakBrowser 基于 Chromium,支持 Playwright/Puppeteer 和 CDP remote connection,因此理论上可由 browser-harness 连接。

多浏览器并行可配合 BU_NAME

BU_NAME=cloak BU_CDP_URL=http://127.0.0.1:9242 browser-harness <<'PY'
print(page_info())
PY

9. 前端调试练习

简单 bug 页

点击“加载用户信息”后请求 /api/user,服务端故意返回 500。

标准调试流程

打开页面
→ 截图初始状态
→ 安装 console/fetch 监听
→ 点击按钮
→ 截图异常状态
→ 读取 console/network/storage
→ 判断原因

综合练习页

页面地址:http://127.0.0.1:8766

完成:表单填写、保存草稿、localStorage 验证、失败 API 调试。

表单字段
#name、#email、#phone、#userType、#subscribed、#note
成功链路
保存草稿 → POST /api/draft → 200 → 写入 localStorage.lastDraft
失败链路
加载用户信息 → GET /api/user → 500 → database unavailable
最终判断:/api/user 返回 500,响应体提示 database unavailable,问题集中在后端接口或数据库依赖。

10. 沉淀机制

browser-harness 提供 Agent 可编辑工作区:

agent-workspace/agent_helpers.py
agent-workspace/domain-skills/

核心理解:

写入不自动,复用自动。
  • helper 写入后,下次 browser-harness 自动加载。
  • domain-skills 启用后,goto_url 可按域名暴露相关 skill。
  • browser-harness 不会后台自动总结和写文件。
适合沉淀通用调试能力、表单读回、滚动收集;不适合沉淀密码、token、一次性坐标、付款/删除/提交等高风险动作。

11. get_debug_snapshot helper

本次实际沉淀了一个 helper:

def get_debug_snapshot():
    from browser_harness.helpers import js

    return js(r"""
(() => ({
  visibleText: document.body ? document.body.innerText : '',
  console: window.__comprehensiveDebug?.console || window.__debugRun?.console || window.__debugPractice?.console || [],
  network: window.__comprehensiveDebug?.network || window.__debugRun?.network || window.__debugPractice?.network || [],
  localStorage: Object.fromEntries(Object.entries(localStorage)),
  sessionStorage: Object.fromEntries(Object.entries(sessionStorage)),
  url: location.href,
  title: document.title
}))()
""")

第一次验证遇到 NameError: name 'js' is not defined,原因是 agent_helpers.py 独立模块加载,修复为函数内部导入 js

自然语言调用

请复现这个问题,然后用 get_debug_snapshot 收集页面可见文本、console、network、localStorage 和 sessionStorage,并基于快照判断问题原因。

12. 卸载与清理

browser-harness --reload
uv tool uninstall browser-harness
rm -rf "/e/CodeLab/AiLab/browser-harness-learn/chrome-profile"
rm -rf "/e/CodeLab/AiLab/browser-harness-learn/browser-harness"

如需保留 helper,应先备份 agent-workspace/agent_helpers.py

隔离 Chrome profile 可能包含登录后 cookie/session,若要清理登录痕迹,应删除该 profile。

13. 可复用自然语言模板

页面操作模板
请打开 [网址],先截图观察页面状态,然后完成 [目标]。每一步操作后截图验证。如果遇到登录、付费、验证码或不可逆操作,先停下来问我。
前端调试模板
请复现 [bug]。先截图初始状态,然后执行用户操作,读取 console、network、storage,最后判断是 UI、JS、接口、鉴权还是数据问题。
证据链模板
请围绕 [说法] 做证据链追踪。先列出需要验证的事实,再找官方来源、媒体来源和用户转述,最后区分原始来源、二次传播和观点判断。
helper 调用模板
请复现这个问题,然后用 get_debug_snapshot 收集页面可见文本、console、network、localStorage 和 sessionStorage,并基于快照判断问题原因。

14. 复习测验

先在心里作答,再点击卡片翻面获得反馈。每张卡片对应一个能力点,建议按 Level 顺序完成。

Level 1 连接 Level 2 操作 Level 3 X 场景 Level 4 Canvas Level 5 调试 Level 6 沉淀 Level 7 工作流 Level 8 卸载

术语揭示小游戏

先看术语,心里说出含义,再点击卡片揭示答案,形成延迟反馈。

BU_CDP_URL
指定 browser-harness 要连接的 CDP HTTP endpoint,例如 http://127.0.0.1:9222。
BU_NAME
区分不同 browser-harness daemon,适合多浏览器或多 profile 并行。
agent_helpers.py
沉淀通用 helper 的位置;写入不自动,复用自动。
domain-skills
沉淀站点级经验,如稳定 selector、URL pattern、hidden wait 和 site-specific trap。
capture_screenshot()
获取当前视口截图,是观察页面、验证点击结果和分析 canvas 页游的核心能力。
click_at_xy(x, y)
按 CSS 坐标点击页面;使用前应确认 devicePixelRatio,并在重要操作后截图验证。
get_debug_snapshot()
本次沉淀的 helper,用于读取 visibleText、console、network、localStorage、sessionStorage、url 和 title。
f=live
X 搜索 URL 中用于表示“最新”排序的参数,本次用于最新帖子扫描。
elementFromPoint(x, y)
点击前校准坐标命中元素的方法,可检查目标 tag、文本和最近链接。
localStorage.lastDraft
综合练习中保存草稿成功的本地证据,需要与页面提示和 /api/draft 200 一起判断。

场景判断延迟反馈

先判断“该怎么做”,再展开查看建议答案。

遇到登录墙

停止自动操作,让用户手动登录;不读取、不输入密码、验证码或其他敏感凭据。

要验证输入是否成功

不要只看动作返回;读取 input.value、select.value、checkbox.checked 等真实字段状态。

要追踪一个说法的可信度

区分原始来源、搬运、二次转述和用户观点;优先找官方来源、媒体原链、时间和上下文。

想沉淀一次性坐标

不建议沉淀。坐标容易随视口、布局和 canvas 状态变化失效,应沉淀稳定 selector、调试快照或通用流程。

最终挑战:30 秒口述复盘

请尝试不用看正文,口述 browser-harness 的完整链路:自然语言任务 → 截图观察 → 点击/输入/滚动 → 验证 → 调试 → helper 沉淀。

  • 能否说清 browser-harness、CDP、Chrome 三者关系?
  • 能否说清截图、坐标点击、输入读回、滚动去重各自解决什么问题?
  • 能否说清 debug snapshot 为什么比临时 JS 更适合复用?
场景判断挑战:什么时候不适合用 browser-harness?

不适合高频爬虫、刷资源、绕过验证码/风控、批量账号操作、强确定性测试套件或不可逆高风险操作。它更适合人工协作式真实浏览器任务。