浏览器自动化别再复制 Cookie 了:ego lite task space 的跨进程实践与四个坑
为什么要在真浏览器里跑自动化
做浏览器自动化最麻烦的一步从来不是写选择器,而是登录态。把 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 在严格性上明显偏保守:定位器不猜、选择器不猜、控制权不抢。代价是上手时到处报错,好处是出错时你总能知道错在哪一步。
- 点赞
- 收藏
- 关注作者
评论(0)