最近我一直在折腾 openclaw,一个把自己电脑变成“数字员工”的开源智能体框架。这玩意的核心思路并不复杂:你把它跑在本地,通过飞书、Discord、Teams 这类每天本来就在用的聊天软件给它派活,它调用大模型做任务拆解,然后再调度浏览器、命令行、文件系统这些工具把活干了。我最早关注它,是因为实在不想再维护一堆乱七八糟的脚本——爬虫脚本、签到脚本、定时监控、网页填表,每个都是独立的碎片代码,时间一长连自己都忘了哪段是干嘛用的。
openclaw 让我能用一句自然语言,完整体验“理解意图 → 拆解步骤 → 操作电脑 → 返回结果”的闭环。这篇先只聊一个最常用到的能力:让它操作 Chrome 浏览器。我会从部署准备、浏览器接入方式、实际跑通的三个日常任务,到踩坑记录全部捋一遍。无论你是刚听说 openclaw、想找个能复现的入门案例,还是已经在用但被浏览器自动化这块卡住,这篇应该都能给你点实在的东西。
1. openclaw 是个什么东西:先搞清楚它解决的问题
1.1 我对 agent 类工具的选型逻辑:为什么是 openclaw
最近 agent 类工具多到爆炸,光是开源的就能数出一串:OpenManus、Moltbot、WorkBuddy,还有各大厂出的云端智能体。我选 openclaw 之前,把 WorkBuddy 也装过一轮,两者定位其实挺接近——都是本地优先、消息渠道驱动的个人智能体。但用下来的感觉是,openclaw 更“程序员向”:配置全是文件,行为靠约定,出了问题能顺着日志一路查到源头;而 WorkBuddy 更倾向给你开箱即用的图形界面。
如果你纠结“openclaw 和 workbuddy 哪个好”,我的建议很直接:你如果习惯命令行、能接受读配置文档、想让智能体操作自己这台电脑上的真实软件,选 openclaw;如果你更想要一个装完就能点、界面友好、少碰配置的助手,WorkBuddy 会更省心。openclaw 的学习曲线陡一点,但它的天花板明显更高——尤其是操作浏览器这个场景,它给了完整的工具链,而不是像有些云端 agent 那样只给你一个“假浏览器”的沙盒环境。
我个人还有一个很私人的理由:数据不出本机。像操作浏览器这种任务,中间会经过登录态、Cookie、页面内容甚至个人信息,我不想把这些全部丢给某个云端平台。openclaw 的调用链是“本地 agent → 本地浏览器”,模型 API 走加密请求,不会把页面内容偷偷传到第三方服务器,这一点对我来说是硬需求。
1.2 openclaw 的核心设计:一个常驻本地的“数字员工”
openclaw 的架构其实可以拆成三个核心组件来理解。
第一个是消息渠道入口(Channel)。它不是一个本地 GUI 程序,而是一个常驻后台的服务,你通过聊天软件跟它对话。Channel 支持飞书、Discord、微软 Teams、Telegram 等,你把 agent 加入一个群或者单聊,发消息就是下指令,它回复就是交结果。这个设计的好处是:你不用专门打开一个面板去看任务进度,手机上就能派活、看结果,非常符合“日常妙用”的定位。
第二个是大模型大脑(Agent Core)。openclaw 本身不内置模型,它接的是你配置的大模型 API,比如通义千问、OpenAI 兼容接口、本地 Ollama 模型等。它拿到你的自然语言指令后,会用大模型做任务规划,把“帮我查一下今天某网页的新闻标题”拆成“打开浏览器 → 访问 URL → 提取标题 → 整理返回”这样的步骤。热词里出现“openclaw 配置千问”,就是因为很多人用通义千问的 API 来跑它,便宜、国内访问稳定。
第三个是工具集(Tools)。这是 openclaw 真正“动手”的部分,包括浏览器工具、终端执行、文件读写、HTTP 请求等。浏览器这块是它目前最亮的功能,通过 Chrome DevTools Protocol(CDP)跟浏览器建立连接,可以读取页面 DOM、点击元素、输入文本、滚动、截图、下载文件。这也是本文第二大部分要展开的。
注意:openclaw 不是浏览器插件,它不运行在页面内部。它是独立的进程,通过 CDP 这个标准调试协议“遥控”浏览器。理解这一点,后面所有配置就都顺了。
它还维护一个会话(Session)系统。每开一个对话,都会生成对应的 session 文件,用来存上下文和任务状态。热词里那个agent failed before reply: session file locked (timeout 60000ms)报错,就是会话文件被多进程同时占用时出现的经典问题,后面我会专门讲。
2. 让 openclaw 调用 Chrome:环境准备与核心机制
2.1 部署 openclaw 的两种方式:Windows 和 Linux 我都试过
官方文档里推荐安装方式挺多,我实际跑过两条路子,一条是 Windows,一条是 Linux 服务器。
Windows 上如果完全没有编程环境,最省事的是用windowshub这类一键安装脚本(openclaw 社区里有 Windows 整合包)。它会自动拉依赖、装 Python 环境、初始化配置目录。但我不太推荐生产环境这么干——整合包版本锁定比较死,后面升级模型配置或者改 channel 容易出幺蛾子。我更建议在 Windows 上装好 Git 和 Python 3.11+,然后从源码安装:
git clone https://github.com/openclaw/openclaw.git cd openclaw python -m venv venv venv\Scripts\activate pip install -e . openclaw initLinux 服务器上更简单,我用的是 Ubuntu 22.04,命令几乎一样,只是激活 venv 用source venv/bin/activate。装完以后,核心的配置文件在你用户目录下,一个叫.openclaw/的文件夹,里面是config.yaml(主配置)、agents/(每个 agent 的定义)、sessions/(会话文件)。这一步务必记住:所有让你头大的问题,最后基本都要回到这几个文件里找原因。
部署完先别急着接浏览器,先确认 agent 能跟模型正常对话。我当时在config.yaml里配置通义千问:
model: provider: dashscope api_key: sk-xxxxxxxxxxxx model_name: qwen-plus然后启动服务,在飞书里给它发一句“你好”,如果回了,说明链路通。很多上来就配浏览器的人,结果卡在模型调用上,连报错都看不懂——我建议按这个顺序一点点来。
2.2 Chrome 浏览器接入:CDP 调试端口与 Profile 隔离
openclaw 要操作 Chrome,依赖 CDP(Chrome DevTools Protocol)。这是 Chrome 自带的一个调试协议,允许外部程序通过 WebSocket 连接浏览器实例,进行页面控制、DOM 操作、网络监听等。你可以把它理解成给浏览器装了一个“远程驾驶接口”,openclaw 走的就是这个口子。
要让 Chrome 暴露这个调试接口,需要带参数启动。我写了一个固定的启动脚本,Windows 下长这样:
"C:\Program Files\Google\Chrome\Application\chrome.exe" \ --remote-debugging-port=9222 \ --user-data-dir="C:\chrome-profile-openclaw" \ --no-first-run --no-default-browser-checkLinux 下对应:
google-chrome \ --remote-debugging-port=9222 \ --user-data-dir=/home/user/chrome-profile-openclaw \ --no-first-run --no-default-browser-check三个参数讲清楚:
--remote-debugging-port=9222:让 Chrome 在 9222 端口开放调试接口,openclaw 通过这个端口连接。--user-data-dir="...":指定独立的浏览器数据目录。这个参数必须加,否则 openclaw 连接的是你日常用的那个 Chrome 实例,两者抢同一个用户数据目录会各种冲突,而且等于把你所有个人登录态直接暴露给 agent。开一个专用的 Profile,是安全底线。--no-first-run:跳过首次运行引导页,避免一些自动化场景下弹窗挡路。
启动完 Chrome 后,你可以先在浏览器里访问http://127.0.0.1:9222/json,如果看到一串 JSON 列表,说明调试端口已经打开,里面有每个标签页的标题、URL、WebSocket 地址,openclaw 就是靠这些信息定位标签页的。
测试没问题后,再到 openclaw 的config.yaml里确认浏览器工具被启用。一般是这样的一段配置:
tools: browser: enabled: true cdp_url: "http://127.0.0.1:9222"配好后重启 openclaw,在飞书里发“打开浏览器访问 example.com”,它就应该能真的操作你的 Chrome 了。
2.3 为什么本地浏览器比“沙盒浏览器”更适合日常任务
不少云端 agent 平台也号称能“操作浏览器”,但都是在远程虚拟机里开一个预装的浏览器,页面要求、登录态、企业内网环境全都跟你的真实环境隔离。openclaw 直接操作你本地的 Chrome 意味着:
- 已经登录的网站不需要重新登录(比如公司内部系统、个人后台),agent 直接继承这个 Profile 里的 Cookie;
- 能访问到你本地网络才能访问的地址,比如
http://localhost:8080、内网路由器管理页; - 你可以亲眼看着它在你的屏幕上一个个标签页打开、操作,任务出错时一眼就能发现问题。
代价是:它能力越大,破坏力也越大,所以权限控制要格外留心。我给 openclaw 拆的浏览任务,基本都是“只读+有限写入”的级别,涉及删除、提交订单这种高危动作,我会在指令里明确说“只做到点击前一步,不要确认提交”。
3. 实操记录:用 openclaw 完成三个日常浏览器任务
3.1 任务一:自动打开网页并提取关键信息
先说最常用的场景:我每天早上去看几个网站的公告,原来要一个个点开标签页,现在直接在飞书群里给 openclaw 发:
打开 https://status.example.com ,提取页面上所有“异常”状态的条目,整理成清单发给我。
openclaw 的拆解过程大致是这样:它先用浏览器工具请求http://127.0.0.1:9222/json看当前有没有 Chrome 实例,发现没有标签页就新建一个,导航到目标网址;等待页面加载完成后,读取页面上的文本节点,找到包含“异常”字样的区域,把内容整理成结构化文本返回。
第一次跑这个任务,我就遇到一个经典问题:页面是动态渲染的,数据在 3 秒后才通过 JavaScript 加载完,openclaw 等页面load事件触发就直接抓 DOM 了,结果提取到一片空白。解决方法是显式地要求它等待:
打开 https://status.example.com ,等页面加载完成后额外等待 5 秒,再提取内容。
openclaw 的工具集里有等待原语,它会老老实实执行。如果某天你发现它取数老是快几拍,就在指令里把“等待 XX 秒”说清楚,这也是 agent 协作的一大经验:你给的上下文越具体,它犯错的概率越低。
后来我把这个任务沉淀成了一个固定 prompt,存在 agent 的说明文件里。进阶玩法是让 openclaw 按 cron 调度跑——定时任务它也有,配置好触发时间后,每天 9 点它自动执行同样的操作,结果直接推到飞书群。从“自己点开网页看”变成“等它主动汇报”,体验提升一个档次。
3.2 任务二:自动化填表与点击操作
第二个高频场景是表单填写。我手头有个内部系统,每周要把一批固定格式的数据填进网页表单,纯重复劳动,填错一个数字还得回滚重填。
我给 openclaw 下的指令是这样的:
打开 http://internal.example.com/form ,在“项目编号”输入框填入 PRJ-2025-001 ,在“负责人”输入框填入 张三 ,在“备注”里填 本周无异常 ,点击“保存”按钮,然后把保存结果截图发我。
openclaw 在浏览器工具里对元素操作的实现方式是:通过 CDP 的DOM.querySelector找到匹配的元素节点,再调用Input.insertText输入模拟文本,点击操作则通过Input.dispatchMouseEvent模拟真实鼠标事件。整个过程在 Chrome 看来和真人操作几乎没有区别,这也是它能通过很多页面反爬检测的原因之一——走的是真正的浏览器调试通道,不是那种伪造请求的库。
但这里有个比较容易翻车的地方:如果页面上有多个相似名字的输入框,openclaw 可能选错。比如一个页面同时有“负责人”和“经办人”,它通过 label 文本定位,有时会匹配到第一个相近的。我的经验是在指令里给更精确的描述,比如“从上往下数第二个输入框”,或者直接让它先截图给你看当前页面状态,再继续操作。
填表类任务的核心原则是:先确认后提交。我现在都会在指令末尾加上“点击保存前,先把表单内容截图发我”,这样即使它填错了,我也在真正的错误写入数据库之前拦下来。这就是 agent 操作真实系统最需要养成的意识。
3.3 任务三:定时巡检与截图留痕
第三个场景结合了前面两个的能力:巡检。我维护一个线上服务的运营看板,每天早上要确认几个关键指标正常。原来靠人肉刷新页面,后来让 openclaw 跑。
我配置了一个定时任务,每天早上 8:30 执行,逻辑是:打开看板地址 → 等待图表渲染完成(通常要 8 秒)→ 截取整个页面 → 提取核心指标数值 → 把截图和文字摘要一起发到飞书群。巡检这事之所以特别适合 agent 干,是因为它的判断标准比较“模糊”:指标到底算不算正常,需要结合上下文看,不是简单的一个数字比较。openclaw 有模型大脑,能把“CPU 使用率 78% 是否异常”这种问题放在业务语境里去判断,比写死的阈值脚本聪明得多。
这里有个实操经验:截图要注意完整性。默认情况下 openclaw 截的是可视区域,对于需要滚动才能看全的页面,你要明确告诉它“截取整页长图”。在 openclaw 浏览器工具里,对应的是截全屏模式。如果你的页面里某些图表是 Canvas 渲染的,还需要额外等待动画稳定后再操作,不然截出来的图可能是个半成品。
截图文件默认存在 openclaw 的outputs/目录下,通过 channel 发出时会自动上传为图片消息。我后来发现飞书对单条消息的图片大小有限制,超大长图会发送失败——解决办法是让它分段截图,或者把图压缩到 2MB 以内。不要小看这个细节,真到每天早上等着看巡检图的时候,图片发不出来会让你非常抓狂。
4. 常见问题排查与避坑实录
4.1 部署期高频故障:从 session 锁到 channel 配置
先说那个热词里被问爆的报错:agent failed before reply: session file locked (timeout 60000ms)。
这个报错的意思很直白:openclaw 在写入 session 文件时,发现同一个 session 被另一个进程锁住了,等了 60 秒没等到解锁,直接放弃。我遇到这个问题的场景有好几种:
- 同时开了两个 openclaw 进程,指向同一个配置目录;
- 上次任务进程没退干净,Windows 下最常见,关掉终端窗口但 Python 进程还在后台跑;
- 飞书/Teams 渠道里,短时间内连发多条消息,同一个 session 被并发写入。
排查思路也很粗暴:先看是不是有残留进程,Windows 用任务管理器把 python/Chromium 相关进程清干净,Linux 用ps aux | grep openclaw查;然后把sessions/目录下对应的 session 文件删掉(如果你不在乎历史上下文),重启 openclaw 就好。它本质上不是什么复杂故障,就是锁文件没释放。但如果你频繁遇到,建议每次只开一个 openclaw 服务,并且把渠道回调超时时间调大一点,给模型思考留足余量。
第二个高频问题是 channel 配置。热词里“openclaw agent 怎么选择 channel”说明好多人在这卡住。简单说,channel 是“agent 以什么方式跟你对话”的配置,一个 agent 可以接多个 channel。比如我在飞书里建了个群,把 agent 拉进群里,在配置里给这个 agent 添加飞书 channel,填上应用凭证,就能开始对话。容易搞混的是:一个 openclaw 实例可以同时跑多个 agent,每个 agent 可以有自己的 channel 列表。你要先搞清楚自己是想“不同场景用不同 agent”还是“一个 agent 多渠道接入”。
第三个坑跟飞书输出有关:热词里那条“openclaw 在飞书输出容易被截断”。这是真实存在的——飞书单条消息有长度上限,当 agent 一次性返回很长的结果(比如我让它列出几十个巡检项详细状态)时,消息会被截断,看起来像 agent 干到一半就停了,其实内容是完整的,只是被平台截断了。解决办法是让 agent 用简洁方式汇报:
结果用列表格式,每个项目不超过一行,超长内容先写入文件再发文件链接。
这个约束在 prompt 层面解决,不用改任何代码。
4.2 Chrome 专用坑:元素定位、登录态和弹窗处理
操作 Chrome 跟写爬虫是两码事,但有些坑是共通的:
第一个坑是页面元素不稳定。有些网站的前端框架(比如 Vue/React 应用)会在交互后动态重建 DOM,openclaw 第一次打开的页面、执行完某个点击之后,之前定位到的元素可能已经失效。它的处理策略通常是重新查找一次,但也可能陷入“找不到元素 → 重试 → 还是找不到”的循环。我的经验是:任务描述里尽量避免依赖非常脆弱的定位路径,用内容文本定位比用 XPath 稳得多。比如“找到包含‘确定’字样的按钮,点击它”,比“点击 class 为btn-confirm-137的按钮”成功率高出不少。
第二个坑是登录态被意外清理。因为 openclaw 用的是独立 user-data-dir 的 Chrome Profile,它跟你日常浏览器不共享登录态。如果你让它访问一个需要登录的页面,它看到的可能是个未登录状态。这时候要么把需要登录的网站设为 Profile 的预登录站点,要么干脆把日常浏览器的 Profile 目录复制一份给 openclaw 用(不推荐但也可行)。实际跑下来,我选择让它自己走一遍登录流程,把账号密码放到 agent 的密钥文件里,虽然多一步,但可控性好得多。
第三个坑是弹窗和权限提示。我遇到过几次麻烦:网站突然弹出一个“接收通知?”的权限框,openclaw 不知道怎么办,整个任务就卡在那里。我最后的解决方案是给 Chrome 启动参数加上一堆默认禁用项,把通知、弹窗权限全部默认拒绝。这样页面就不会出现那些烦人的权限询问。具体参数我贴在这里,直接加到启动脚本后面:
--disable-notifications \ --disable-geolocation \ --disable-popup-blocking # 这个不要禁,禁了有些页面反而出问题等等,--disable-popup-blocking我这里是故意留了一个反例。实际上我没禁弹窗拦截,因为有些应用是弹窗登录流程,全禁了就连不上。正确的做法是不要禁弹窗拦截,只禁通知和地理位置权限。这种细节你在操作真实业务系统时才会意识到:每个权限策略都有代价,别一刀切。
4.3 安全边界:给 agent 操作浏览器划好红线
整个系列里,我最想说的一句经验是:给 agent 的操作权限,永远要比你给自己设的权限更窄。
openclaw 操作 Chrome 的能力是真实的:它能打开页面、点击按钮、输入内容、上传文件。这些能力如果被一条狡猾的指令触发——比如网页里有一段恶意 JavaScript 诱导 agent 点击——理论上是有可能造成操作的。虽然在实际中,openclaw 的模型大脑会“理解”指令意图,不会像一个没脑子的脚本一样盲目点掉所有的弹窗,但作为使用者,你必须在源头收敛。
我给自己定了三条规矩:
- 浏览器任务的表达,永远使用明确的 URL 和明确的动作;
- 涉及删除、提交、支付等不可逆操作,指令里显式写“停在确认页,不要点击最终确认按钮”;
- 专用的 Chrome Profile 里不登录任何个人主账号,宁可多花一次扫码登录的时间,也不把大号隐私暴露给 agent。
这套规矩跑了两周,没出过事,但心里踏实。工具越强大,越要给自己设限,这句话在 AI agent 时代比过去任何时候都适用。
5. 我沉淀下来的几条 openclaw 使用习惯
最后,分享几个我目前一直在用的习惯,不是什么标准答案,但确实是踩过坑之后形成的肌肉记忆。
第一,任务拆小,别让 agent 一口气干太多事。你可能会想“让 openclaw 一次把我所有的日报、巡检、邮件汇报全干了”——理论上它确实能,但一旦中间某一步出错,它回滚和重试的难度会指数级上升,最后变成一场“看着它反复横跳还找不到错在哪”的灾难。我现在都是每个任务单独发一条消息,一次只干一件事,跑顺了再考虑编排成定时任务链。
第二,指令里加“上下文锚点”。所谓锚点,就是给它明确的参照信息:目标 URL、等待时长、关键词、上报格式。这些细节看起来啰嗦,但大模型吃这一套。省那十几个字,换来的可能是多轮纠正的来回扯皮,得不偿失。
第三,保持一个“最小冒烟测试”任务。我保留了一个最简单的指令:“打开 https://www.baidu.com ,把页面标题发给我”。每次改了配置、升级了版本、换了模型,先跑一遍这个,链路通不通一眼就知道。这比看日志猜半天高效得多。
第四,版本升级前先备份配置目录。openclaw 迭代速度不慢,升级后偶发兼容问题是常事。我每次升级前会把.openclaw/整个目录打个 tar 包,出问题直接回滚,五分钟搞定,强烈建议你也养成这个习惯。
openclaw 操作 Chrome 这个方向其实才刚露出冰山一角——后面还有下载文件到指定目录、操作浏览器多标签并行、配合本地模型做离线自动化这些玩法。我准备在这个系列里继续往下写,如果你也有好的用法或者踩过什么新奇的坑,欢迎在评论区交流,咱们实际跑出来的经验比文档里写的有用得多。