☰
可视化点击选元素:pi-skills的browser-pick.js交互式选择器实现原理剖析
2026/10/3 16:58:03 网站建设 项目流程

可视化点击选元素:pi-skills的browser-pick.js交互式选择器实现原理剖析

【免费下载链接】pi-skillsSkills for pi coding agent (compatible with Claude Code and Codex CLI)项目地址: https://gitcode.com/gh_mirrors/pi/pi-skills

pi-skills 是一款为 pi coding agent(兼容 Claude Code、Codex CLI 等)打造的技能集合仓库,其中的 browser-pick.js 提供了"可视化点击选元素"能力:一个交互式选择器,让你在真实浏览器里用鼠标点选页面元素,把结构化的元素信息直接交给 AI。当 AI 分不清你说的"那个按钮"到底是哪一个时,这个工具就是最佳答案。

🎯 它解决什么问题?

用 AI 操作网页时,最常见的卡点是元素定位:页面 DOM 复杂、选择器含糊,AI 只能靠猜。传统的做法是 AI 反复执行 JavaScript 探查页面,效率低、易出错。

browser-pick.js 换了一个思路:把选择权交还给用户。它在你肉眼可见的浏览器页面上叠加一层高亮框和提示横幅,你点哪里,AI 就拿哪里的信息。一次点击,胜过十次猜测。

⚙️ 快速上手:三步跑通元素选择

前置要求:已安装 Chrome 和 Node.js,并在技能目录执行过依赖安装(依赖声明见 package.json)。

步骤操作说明
1️⃣ 启动浏览器运行 browser-start.js以远程调试模式启动 Chrome,监听localhost:9222
2️⃣ 打开目标页面运行 browser-nav.js + 网址导航到你要选元素的页面
3️⃣ 发起选择运行browser-pick.js "Click the submit button"页面出现蓝色高亮框,鼠标点选即可

⚠️ 小提醒:browser-pick.js 连接浏览器有5 秒超时,如果提示"Could not connect to browser",先执行第 1 步即可(对应 browser-pick.js)。

🔬 实现原理拆解(无代码也能看懂)

整个脚本只有不到 160 行,却五脏俱全。它的工作可以分为四个阶段:

阶段一:通过 CDP 连接正在运行的 Chrome

脚本基于 Chrome DevTools Protocol(CDP),使用 puppeteer-core 连接localhost:9222端口上已启动的浏览器,并自动锁定最后一个标签页作为操作对象(browser-pick.js)。这意味着它是"接管"你正在看的页面,而不是另开一个无头窗口——这正是"可视化"的关键。

阶段二:向页面注入一个"悬浮工具层"

脚本通过 browser-pick.js 向当前页面注入一个pick()函数,它会在页面上创建两个关键 DOM 元素:

  • 全屏透明遮罩层(overlay):z-index设为最大整数 2147483647,但pointer-events:none——看得见却"不挡手",所有鼠标事件仍能穿透到下面的真实元素;
  • 底部提示横幅(banner):深色圆角提示条,实时显示你传入的提示语、已选数量和快捷键说明(Enter 完成 / ESC 取消 / Cmd/Ctrl+点击追加选择)。

同时还有一个highlight 高亮框,鼠标划过时如影随形,用蓝色边框实时标出你悬停的元素。

阶段三:用两个 API 精准"捕获"元素

这是整个选择器的灵魂,只有两步:

  1. document.elementFromPoint(x, y):鼠标移动/点击的坐标,反查出坐标下最顶层的真实 DOM 元素;
  2. el.getBoundingClientRect():拿到该元素相对视口的精确位置和尺寸,据此把蓝色高亮框"贴"上去。

注意脚本在捕获时会主动排除 overlay 和 banner 自身,确保你永远选不到工具层,只会选到页面元素。

阶段四:三种交互,覆盖所有选择场景

操作行为
普通单击立即结束选择,返回该元素信息
Cmd/Ctrl + 单击追加选中(绿色 3px 描边标记),支持多选
Enter批量提交所有已选元素
ESC取消选择,清理现场

无论哪种方式结束,脚本都会执行 清理逻辑:移除遮罩层和横幅、还原被描边的元素样式,页面恢复原样。

📦 AI 最终拿到什么?

选择完成后,脚本对每个元素调用 buildElementInfo,输出一份面向 AI 的结构化档案:

字段内容对 AI 的价值
tag标签名(如button)知道元素类型
id/classID 与类名直接构造 CSS 选择器
text元素文本(截断至 200 字符)理解元素语义
html外层 HTML(截断至 500 字符)复现精确结构
parents从元素到 body 的完整父级路径消除同名元素歧义

这些信息经标准输出回传给 Agent(结果格式化逻辑),AI 无需再反复探查页面,一步到位。

🤝 它在 pi-skills 生态中的位置

browser-tools/SKILL.md 明确规定了 Agent 何时应调用它:

  • 用户说"我想点那个按钮" → 让用户用选择器指出来;
  • 用户说"提取这几条数据" → 让用户圈出目标元素;
  • 页面结构复杂、选择器有歧义 → 视觉选择最可靠。

它与同目录的 browser-eval.js(执行任意 JS)、browser-screenshot.js(截图)、browser-cookies.js(查看 Cookie)等工具组合,构成一套完整的"人机协作式浏览器自动化"工具箱。

❓ 常见问题

Q:为什么提示无法连接浏览器?A:先运行 browser-start.js 启动带调试端口的 Chrome。

Q:为什么我选不到某些元素?A:检查该元素是否被pointer-events:none或更高层级的遮罩覆盖,elementFromPoint只能命中视觉最顶层的元素。

Q:多选是怎么去重的?A:脚本内部用 Set 记录已选元素,重复点击同一元素不会重复计入(点击处理逻辑)。

📎 相关文件导航

文件作用
browser-pick.js交互式元素选择器(本文主角)
browser-start.js启动远程调试模式的 Chrome
browser-nav.js页面导航
browser-eval.js页面内执行 JavaScript
SKILL.md技能说明书:Agent 何时、如何使用各工具
README.mdpi-skills 全部技能一览

【免费下载链接】pi-skillsSkills for pi coding agent (compatible with Claude Code and Codex CLI)项目地址: https://gitcode.com/gh_mirrors/pi/pi-skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询