给 AI agent 接一个浏览器,开局都很顺:打开页面、读内容、填个搜索框。真正卡死人的,是那种藏在跨域 iframe 里的表单——Google Payments 的收款资料、各种结账组件、KYC 控件。agent 能把里面的字读出来,能把值填进去,就是点不动那颗「保存」按钮。读得到、办不成。

这篇记一次把这道坎啃下来的过程。主角是 chrome-use——一个用 Rust 写的、给 agent 用的浏览器自动化 CLI,直接驱动你真正登录着的那个 Chrome,不用 Playwright、不开 headless。
为什么跨域 iframe 这么难
普通页面好办:抓可访问性树、拿元素引用、点就完了。但跨域 iframe(比如 adsense.google.com 页面里嵌了一个 payments.google.com 的 iframe)会一次性踩中三个雷:
- 选择器进不去。同源策略下,你在外层文档跑的 CSS 选择器、
eval全都摸不到 iframe 内部的 DOM。document.querySelector在这里是瞎的。 - 滚动落空。你以为在滚页面,其实能滚的是 iframe 内部那个滚动容器;wheel 事件发给了外层文档,里面纹丝不动——目标那一行永远在「屏幕外」,连看都看不到。
- 只能盲点坐标。前两条逼着你退回到「截图 + 猜像素坐标」,而那是最不精准、最容易点错相邻字段的方式。在一个改的是全局支付资料的表单上,点错一下的代价不小。
chrome-use 的底子:给 agent 的是「引用」,不是 HTML
在讲怎么破之前,得先说它的基本盘——这也是它和「把 HTML 喂给模型」那一派的根本区别。

chrome-use 不把页面源码丢给 agent,而是抓一棵可访问性树快照,每个可交互元素配一个紧凑引用:
- textbox "邮箱" [ref=e2]
- listbox "国家/地区" [ref=e60]
- button "保存" [ref=e41]
agent 直接对引用动手:fill @e2 "..."、click @e41。一页大概 200–400 token,而不是一整屏 DOM 噪声。这套引用机制,正是后面能穿透 iframe 的前提——只要快照能「看见」iframe 里的节点,引用就能拿到。
三道坎,一道一道过
第一坎:让快照看见 iframe 里的东西。
让可访问性树穿透跨域 iframe,把里面的节点也带上引用。修好之后,snapshot 直接列出来:
- textbox "电话号码 (可选)" [ref=e59]
- listbox "国家/地区代码:日本 (+81)" [ref=e60]
——选择器进不去的地方,引用进得去。
第二坎:让滚动作用在 iframe 的滚动容器上。 不再把 wheel 一股脑发给外层文档,而是滚真正该滚的那个容器。下面的表单行终于能滚进视野,引用也才取得到。
第三坎(最硬):跨域 iframe 里那颗「已启用」的提交按钮,点了没反应。 这一关最折磨人,因为它看起来全对:
- 用真实键击把号码填进去了,
get value一读,确实在; - 「保存」按钮该亮的时候亮了(填入合法值前它是 disabled,填完才出现);
- 然后
click @e41——表单纹丝不动。find text "保存"?跨域取不到。聚焦后敲 Enter / 空格?还是没反应。
对上了,又哪哪都不对。根因是:跨域 iframe 里那种 Material/框架按钮,对合成点击不买账;而且 fill 只改了输入框的值、没派发框架要的 input/change 事件,表单自己以为「没变化」,于是保存按钮要么禁用、要么点了等于没点。
破法分两半:填值改走真实键击(每个字符都触发真事件,框架才认);点击则要对 iframe 内的内容节点派发一套真实的鼠标/键盘激活,而不是糊一个 click() 上去。
收尾:点进去,存下来

三道坎过完,整条链路就通了:打开 → 滚到目标行 → 快照取引用 → 真实键击填值 → 按下保存。那种「能读、办不成」的死局,到此为止。
给同样在做 agent 浏览器自动化的人,几条用血换的经验
- 优先用可访问性引用,别默认截图点坐标。一旦快照能看见 iframe,引用永远比猜像素稳。截图留给 canvas/WebGL 那种真没结构的场景。
- 跨域 iframe 是道明确的边界。选择器和
eval到此为止,要么让工具把 a11y 树穿透进去,要么你就只剩盲点。 - 测「能不能提交」,而不只是「能不能填」。值填进去 ≠ 框架收到了。
fill不派发事件这种坑,只有你真去点保存才会暴露。 - 能用真实登录的浏览器,就别用 headless。登录态、cookie、扩展全都现成,还没有自动化指纹——这也是 chrome-use 走「驱动你自己的 Chrome」这条路的原因。
试试
curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh
仓库在 github.com/leeguooooo/chrome-use。我一直在做这类「用你自己的订阅、把 agent 接到真实浏览器/设备上」的工具,进展都发在 X @leeguooooo。
评论
评论发布后会立即公开,如触发规则可能被审核下架。