浏览器自动化别再复制 Cookie 了:ego lite task space 的跨进程实践与四个坑

举报
yd_293263726 发表于 2026/11/03 12:51:37 2026/11/03
【摘要】 从真实浏览器里跑自动化会省掉凭据传递,但会多出状态管理和控制权协调。本文记录 ego lite task space 的跨进程实践,以及定位器严格性、状态文件 EPERM、标签重登记、用户接管硬停这四个实际踩到的坑。

为什么要在真浏览器里跑自动化

做浏览器自动化最麻烦的一步从来不是写选择器,而是登录态。把 Cookie 从用户浏览器导出、塞进无头实例,这条路能跑通,但每次掉登录都要重来一遍,而且把长期凭据复制到第二个进程本身就是风险。ego lite 换了个思路:脚本不在自己的 Node 进程里操控一个影子浏览器,而是直接接管用户正在用的那个窗口,用 task space 把「哪些标签页归 agent、哪些归用户」做成了一等公民。

task space 到底是什么

一次 taskSpace() 调用会拿到一个空间,空间里可以开页面,每个页面有稳定的标签(p1、p2),页面里的元素有 ref。关键是这些标签和 ref 会被持久化到状态文件里,所以下一次进程启动时,taskSpace(1) 能把上一次的页面原样接回来,ref 依然指向同一个元素。下面这段是我实测的跨进程链路:第一个进程打开页面并拿到 ref,第二个进程(全新的 Node 进程)直接点击这个 ref,页面跳转成功,说明 ref 不是进程内句柄。

// round-01
const t = await taskSpace("demo");
const p = t.page("p1");
await p.goto("https://example.com");
// snapshot 后得到 anchor 的 ref=1

// round-02(新进程)
const t = await taskSpace(1);
const p = t.page("p1");
await p.click("@1");
await p.waitForURL("**iana.org**");

坑一:定位器比 Playwright 严格得多

第一类问题都来自「它不肯猜」。role 定位器必须带 name,只写 loc=role:textbox 会直接报错;page.fill() 不接受 label 选项,label 只允许给指针类动作;waitForSelector() 要求唯一匹配,匹配到多个不会默默取第一个,而是把前几个候选的文字列出来让你改选择器。这三点第一次用会卡住,但换个角度看,它把 Playwright 里那种「选错了元素但流程照跑」的静默错误提前暴露了。

坑二:状态文件写入失败会让整个 SDK 瘫痪

这个坑最费时间。某次运行开始抛 EPERM: rename 'space-1@browser-host-xxxx.json.tmp',之后 tabs()、snapshot() 全部失败,看起来像 SDK 崩了。实际是持久化层的原子写在 Windows 上被拦了一下,重试也没能成功,于是所有需要读状态的调用都卡在同一个点上。手动 mv 那个 JSON 文件是成功的,说明不是文件锁,而是写入路径本身出了问题。修法很土但有效:备份后删掉 ~/.ego-browser/state/space-1@browser-host-*.json,下一次运行会重建,代价是页面标签全部变成 undefined,需要重新登记。

坑三:标签丢了要重新登记,参数别传错

状态文件重建之后,t.tabs() 返回的每一项里 page 是一个描述对象,不是页面句柄。t.adopt(tab, { as: "grow" }) 会报「requires an untracked page」,正确写法是把 tab.page 传进去:await t.adopt(tab.page, { as: "grow" })。之后 t.page("grow") 就能拿到句柄继续操作。

坑四:用户一动手,脚本必须停

空间的控制权是可以转移的。用户自己点了一下浏览器,下一次命令就会抛 EGO_TASK_SPACE_USER_IN_CONTROL。SDK 的约定是硬停:不重试、不夺回,等用户明确说继续再 takeOverTaskSpace(1)。这条约束看着碍事,实际避免了两边同时操作同一个页面把状态搞乱。

几个实用建议

  • 抓数据优先用 evaluate() 返回结构化对象,不要拉整页快照。快照对大页面又慢又容易触发状态写入。
  • 点击 Vue 之类的卡片按钮,用 CDP 的坐标点击(取元素中心,派发 mousePressed/mouseReleased)比 DOM 的 click() 更接近真实用户,路由也更容易触发。
  • 每个动作返回 receipt 只说明「动作发出去了」,不说明业务成功。要验证业务状态,自己再查一次页面。
  • 需要等页面渲染的场合,宁可多等两秒再看文本,也不要靠固定选择器硬轮询。

小结

把自动化搬进用户正在用的浏览器,省掉的是凭据传递,多出来的是状态管理和控制权协调。ego lite 这套 API 在严格性上明显偏保守:定位器不猜、选择器不猜、控制权不抢。代价是上手时到处报错,好处是出错时你总能知道错在哪一步。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。