Computer Use 与 Browser Use 实战:用 Playwright+CDP 搭建界面感知到自动化执行链路

发布时间:2026/9/29 20:16:02

Computer Use 与 Browser Use 实战:用 Playwright+CDP 搭建界面感知到自动化执行链路 1. 从截图坐标到元素定位为什么需要 PlaywrightCDPComputer Use 和 Browser Use 经常被混着讲但落到工程上它们解决的是两个不同层次的问题。Computer Use 面向的是整个操作系统界面Agent 看到的是屏幕像素决策输出的是坐标点击Browser Use 面向的是网页Agent 拿到的是 DOM 结构、无障碍语义和浏览器内部状态决策输出的是“点击那个叫登录的按钮”这类语义化指令。两者共享同一个循环读取状态、模型决策、程序执行、检查结果。区别在于“状态”从哪来、“执行”往哪去。Computer Use 靠截图加辅助功能树执行靠 pyautogui 这类系统级自动化库Browser Use 靠 DOM 快照加 CDP 暴露的浏览器能力执行靠 Playwright 这类浏览器自动化库。我试过纯截图方案跑网页任务最直接的坑是分辨率适配。同一套坐标在 1080p 上点得准换到 2K 屏就偏了页面滚动后坐标全废。而 Playwright 的定位器查询的是当前 DOM页面重新渲染后同一个getByRole还能重新定位到对应元素稳定性完全不是一个量级。所以这篇要搭的链路是用 CDP 做底层感知截图、DOM 快照、网络事件用 Playwright 做元素定位和动作执行中间夹一层 Agent 调度逻辑。目标是跑通一个最小闭环——Agent 能“看到”页面、决定下一步、执行动作、再验证结果。适合谁看已经会用 Playwright 做基础自动化但想把 LLM 决策接进来的开发者或者在做 Browser Use 类产品需要一套可复制的感知-执行骨架。下面从环境准备开始一步步把链路搭起来。2. TaoToken 前置把模型决策接进链路Agent 循环里“模型决策”这一步需要一个能调用的 LLM 接口。TaoToken 在这里的角色是提供统一的模型调用入口让 Playwright 脚本里的决策函数不用关心底层是哪个模型。先拿 API Key。访问 https://taotoken.net/api-keys 创建密钥控制台在 https://taotoken.net/console 。拿到 key 后模型对话调试可以用 https://taotoken.net/model-chat 先验证接口通不通。如果你后面要做长期编码或 Agent 任务Coding Plan 页面 https://taotoken.net/coding-plan 有更完整的配额说明。接入文档在 https://taotoken.net/doc API 基址是https://taotoken.net/api。环境变量这样配export TAOTOKEN_API_KEYsk-你的密钥 export TAOTOKEN_BASE_URLhttps://taotoken.net/apiPython 侧装依赖pip install playwright openai playwright install chromiumplaywright install chromium会下载 Chromium 二进制后面 CDP 连接的就是这个浏览器实例。注意不要用系统自带的 Chrome版本对不上时 CDP 的某些域会报错。3. 可复制配置PlaywrightCDP 感知层骨架3.1 启动带 CDP 的浏览器实例Playwright 默认启动的浏览器已经开了 CDP但端口是随机的。要手动控制用launch时指定argsfrom playwright.sync_api import sync_playwright def launch_browser(): pw sync_playwright().start() browser pw.chromium.launch( headlessFalse, args[ --remote-debugging-port9222, --disable-blink-featuresAutomationControlled, ], ) context browser.new_context( viewport{width: 1280, height: 800}, user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, ) page context.new_page() return pw, browser, context, page--remote-debugging-port9222是关键后面可以用http://localhost:9222/json查看当前页面列表。--disable-blink-featuresAutomationControlled减少被网站识别为自动化的概率但别指望它能绕过所有检测。3.2 用 CDP 抓取页面快照Playwright 的page.content()拿的是完整 HTML对模型来说太长。更实用的做法是用 CDP 的Accessibility域拿无障碍树再配合DOM域做精简def get_page_snapshot(page): cdp page.context.new_cdp_session(page) cdp.send(Accessibility.enable) ax_tree cdp.send(Accessibility.getFullAXTree) nodes [] for node in ax_tree.get(nodes, []): role node.get(role, {}).get(value, ) name node.get(name, {}).get(value, ) if role in (button, link, textbox, checkbox) and name: nodes.append({role: role, name: name}) return nodes这个快照只保留可交互元素模型拿到的输入从几万字符降到几百字符。实测下来一个典型登录页的 AX 树精简后大概 15 个节点模型决策准确率比喂完整 HTML 高不少。3.3 截图感知作为补充有些元素 AX 树里没有比如 canvas 绘制的图表或自定义组件。这时候用 CDP 的Page.captureScreenshotdef capture_screenshot(page, pathsnapshot.png): cdp page.context.new_cdp_session(page) result cdp.send(Page.captureScreenshot, {format: png}) import base64 with open(path, wb) as f: f.write(base64.b64decode(result[data])) return path截图和 AX 树组合使用AX 树负责结构化定位截图负责兜底视觉理解。模型决策时优先用 AX 树找不到目标再让它看截图。4. Agent 调度示例从感知到执行的完整循环4.1 决策函数把页面快照和任务描述发给模型让它输出下一步动作。用 OpenAI 兼容接口调 TaoTokenfrom openai import OpenAI import json client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], ) def decide_action(task, snapshot, history): prompt f任务{task} 当前页面可交互元素 {json.dumps(snapshot, ensure_asciiFalse, indent2)} 已执行动作{history} 请输出下一步动作JSON 格式 {{action: click|type|navigate|done, target: 元素名称, value: 输入内容}} 只输出 JSON。 resp client.chat.completions.create( modelgpt-4o, messages[{role: user, content: prompt}], temperature0, ) return json.loads(resp.choices[0].message.content)temperature0让输出稳定避免同一页面两次决策给出不同动作。4.2 执行函数把模型输出的语义动作翻译成 Playwright 调用def execute_action(page, action): act action[action] if act click: page.get_by_role(button, nameaction[target], exactFalse).click() elif act type: page.get_by_role(textbox, nameaction[target], exactFalse).fill(action[value]) elif act navigate: page.goto(action[value]) elif act done: return True page.wait_for_load_state(networkidle) return Falsewait_for_load_state(networkidle)等网络空闲再进入下一轮感知避免页面还没渲染完就抓快照。4.3 主循环def run_agent(task, max_steps10): pw, browser, context, page launch_browser() history [] try: page.goto(https://example.com/login) for step in range(max_steps): snapshot get_page_snapshot(page) action decide_action(task, snapshot, history) history.append(action) print(fStep {step}: {action}) if execute_action(page, action): print(任务完成) break finally: browser.close() pw.stop()跑起来后终端会打印每一步的决策页面会跟着动。这就是最小闭环感知AX 树→ 决策TaoToken 调模型→ 执行Playwright→ 再感知。5. 本篇常见错排查5.1 CDP session 报 “Target closed”原因通常是new_cdp_session之后页面被导航或关闭了。CDP session 绑定在特定 page 上页面一变就失效。解决每次感知前重新创建 session或者把 session 创建放在page.goto之后。5.2 getByRole 找不到元素先确认 AX 树里有没有这个节点。用get_page_snapshot打印出来看如果节点存在但 Playwright 找不到可能是exact参数太严。把exactFalse改成模糊匹配或者换get_by_text。另一个坑是 iframe。AX 树默认只抓主框架iframe 里的元素要单独处理frame page.frame_locator(iframe[namelogin]) frame.get_by_role(button, name登录).click()5.3 模型输出不是合法 JSON加一层容错import re def parse_action(text): match re.search(r\{.*\}, text, re.DOTALL) if match: return json.loads(match.group()) raise ValueError(f无法解析动作: {text})如果模型经常输出多余解释在 prompt 里加一句“不要输出任何解释只输出 JSON”。5.4 页面加载慢导致快照为空wait_for_load_state(networkidle)在 SPA 页面可能永远等不到。改成等具体元素page.wait_for_selector([rolebutton], timeout5000)或者用 CDP 的Page.loadEventFired事件做同步。5.5 TaoToken 接口返回 401检查TAOTOKEN_API_KEY环境变量有没有正确导出。在 Python 里打印os.environ.get(TAOTOKEN_API_KEY)确认。如果 key 没问题检查base_url是不是https://taotoken.net/api末尾不要加斜杠。6. 下一步把链路接到真实任务跑通最小闭环后可以往几个方向扩展。一是把感知层做厚除了 AX 树和截图再加 CDP 的Network域监听请求让 Agent 知道页面在加载什么数据。二是把执行层做稳给每个动作加超时和重试失败时自动重新感知再决策。三是把决策层做细用多轮对话让模型能追问“这个按钮点完之后页面变了没有”。长期跑编码或 Agent 任务的话Coding Plan 页面 https://taotoken.net/coding-plan 有配额和模型选择的说明。接入细节看文档 https://taotoken.net/doc 模型调试用 https://taotoken.net/model-chat 。API Key 在 https://taotoken.net/api-keys 管理。这套骨架的价值在于把“界面感知”和“自动化执行”解耦了。感知层换成语义树、截图或网络事件执行层换成 Playwright、CDP 或系统级库中间的决策循环不用大改。你可以先拿一个登录页跑通再换成自己业务里的表单填写或数据抓取逐步把链路调稳。
延伸阅读

更多相关文章

2026/9/29 20:11:02

6款AI写作辅助网站盘点:TaoToken统一Key接入DeepSeek与豆包实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 21:16:06

MCP与A2A协议实战:TaoToken统一Key下AI Agent通信配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 21:16:06

【Python 学习第 20 天】类型转换

【Python 学习第 20 天】类型转换学习日期:2026-09-28 知识点:类型转换 难度:0.65一、今日知识点 今天学习的是 类型转换。 类型转换是把一种数据类型变成另一种数据类型。Python 中分为隐式转换(自动进行,如 int 和 f…

2026/9/29 21:16:06

ASM入网小助手卸载成功:TaoToken 统一 Key 通道配置与验证实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 21:11:06

不敢让 Codex 直接改代码?我先让它只读分析一个 Node.js 项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑