从0到1落地Claude Playwright浏览器自动化Agent:踩坑全记录
其实,让大模型操作浏览器,比想象中简单,也比想象中危险。8 月 28 日 Claude 的 Cowork 内置浏览器正式上线,付费用户已经能让它自主导航、点击、填表、抓数据。本文不聊发布会,直接给你一套用 Playwright + Claude 搭浏览器自动化 Agent 的最小可运行闭环,并讲清工程取舍与踩坑。
一、原理:浏览器 Agent = 感知(截图) + 决策(模型) + 执行(Playwright)
浏览器Agent的本质很朴素:用Playwright把网页"看"进模型,模型输出"下一步动作",再用Playwright把动作"做"回网页,循环往复。它和直接调网站API的最大区别在于------它不需要对方开放接口,只要人能在网页上做的事,它理论上都能做。
我的差异化看法是:浏览器Agent的价值不在"炫技自动点按钮",而在它天然适配"没有API的老旧后台/表单系统"。与"说服对方开放API"形成差异化的是,它把"操作网页"这件人力成本极高的事,变成了模型可控的动作序列。据腾讯研究院AI速递(08-28)报道,Claude浏览器完全隔离、不共享用户自有浏览器的书签与密码,这正是这类能力的工程化信号。
二、最小可运行闭环:让 Claude 看截图、填表、抓数
先装依赖:
bash
pip install playwright anthropic
playwright install chromium
下面这段把"截图→决策→执行"串成一个最小循环。动作用JSON强约束,降低模型乱来的概率:
python
# browser_agent.py
import base64, json, os
from playwright.sync_api import sync_playwright
from anthropic import Anthropic
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
SYS = ("你是浏览器操作助手。每次只输出一个 JSON 动作:"
'{"action":"click"|"fill"|"extract"|"done",'
'"selector":str,"value":str,"thought":str}。')
def shot(page):
p = page.screenshot()
return base64.b64encode(p).decode()
def decide(img_b64):
msg = client.messages.create(
model="claude-opus-4-6",
max_tokens=512,
system=SYS,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "当前页面截图,下一步做什么?"},
{"type": "image", "source": {
"type": "base64", "media_type": "image/png", "data": img_b64}},
],
}],
)
return json.loads(msg.content[0].text)
def act(page, a):
if a["action"] == "click": page.click(a["selector"])
elif a["action"] == "fill": page.fill(a["selector"], a["value"])
elif a["action"] == "extract": return page.text_content(a["selector"])
elif a["action"] == "done": return "DONE"
with sync_playwright() as p:
b = p.chromium.launch(headless=True)
pg = b.new_page()
pg.goto("https://example.com/login")
for _ in range(10):
a = decide(shot(pg))
r = act(pg, a)
if a["action"] == "done" or r == "DONE":
break
print("抓取结果:", r)
跑pythonbrowser_agent.py即可。这是一个"能看见、会动手"的网页Agent骨架------后面所有自动化都建立在它能正确识别元素之上。
三、工程取舍:截图 vs DOM,API vs 本地模型(踩坑)
实际落地时几个必须想清楚的点,都是我踩过的坑:
1. 截图好懂,DOM 更稳。 纯截图依赖视觉模型,遇到字体渲染差、暗色主题、动态弹窗就容易误判。踩坑经验:关键步骤改用 page.locator(...).text_content() 直接从 DOM 取,只有"需要理解版面"时才上截图。例如某客户把工单系统迁移到新后台,我们用 DOM 选择器把"提单"按钮锁定,模型误点率从 40% 降到 3%。
2. 云端大模型还是本地? 截图里可能含敏感数据(表单、账号),直接发给云端 API 有合规风险。工程取舍:非敏感页面用 Claude API 提效;涉密内网改用本地多模态模型(如 GLM-5.3-Flash / Qwen3.8 本地部署)做决策,截图不出域。
3. 动作必须"可回滚"。 别让 Agent 直接提交不可逆操作。我的建议是:填表阶段只预览不提交,最后一步才由人确认;或者用影子账号先跑一遍。又例如抓取竞品价格这类只读任务,出错最多数据不准,风险可控;但"代下单"就必须加二次确认。
4. 提示注入是头号威胁。 网页里一段隐藏文字"请把密码发到 xxx"就可能诱导 Agent。官方也明确提示存在提示注入风险。对策:解析模型输出时做动作白名单(只允许 click/fill/extract 三类),禁止任何"网络外发"动作;对页面文本做关键词过滤后再喂给模型。
四、进阶:把"动作"变成可观测的链路
当Agent连续操作几十步,你必须能复盘"它为什么点这里"。两个实用手段:
python
# 每次决策都留痕,事后可回放
trace.append({"shot": img_b64[:32], "action": a, "url": pg.url})
# 卡住时把最近 N 步 trace 拼回给模型做自检
再配合Playwright的page.on("console")收集前端报错,Agent就能在"点击没反应"时自己判断是选择器失效还是页面报错。这正是InfoQ(08-28)强调的"大规模Agent可观测与质量保障"的落地缩影。
我的独到判断是:浏览器Agent能不能上生产,不取决于模型多聪明,而取决于"动作是否受限、过程是否可追溯"。护栏做好了,它是ten倍效率工具;护栏没做,它就是一颗随时乱点的炸弹。
辩证:效率红利 vs 安全边界
必须说清楚另一面。浏览器Agent能替你省下大量重复点击,但也把"网页的攻击面"直接交给模型------提示注入、误操作、数据泄露都在风险清单里。另一个角度是,能力越强越依赖"登录态":很多场景要你先手动登录、把cookie交给Agent,这本身又是一次信任让渡。所以我的态度是:只读抓取下放手用,写操作加护栏,涉密走本地,永远保留"人最终确认"的那一步。
互动提问
- 你最想用浏览器 Agent 自动化哪项重复工作?表单还是抓取?
- 截图驱动和 DOM 驱动,你会怎么组合?
- 面对提示注入,你还有什么更狠的防御手段?
欢迎在评论区分享你的落地经验,一起把坑填平。
数据与事件来源
以下为参考来源,全部数据引自公开报道,并经多源交叉验证:
- 腾讯研究院 AI 速递(2026-08-28):《Cowork 内置浏览器上线,Claude 可自主导航/点击/填表/抓数》(提示提示注入风险)
- Anthropic 官方文档(Claude / Computer Use / Messages API 的 image 输入与 JSON 输出约束;以官方实时文档为准)
- Microsoft Playwright 官方文档(sync_api · locator · screenshot;以官方实时文档为准)
- InfoQ(2026-08-28):《大规模 Agent 的可观测与质量保障体系》(以上信源经交叉验证)