网页功能调研(对标清单生成)
对一个 Web 后台/SaaS 系统(如停车 SaaS、ERP、CRM)做字段级功能调研,产出结构化的
功能清单文档(菜单树 → 页面 → 查询字段/表格列/按钮/备注)+ 每页截图 + 覆盖情况汇报。
适用场景:竞品对标、需求文档调研、系统迁移前的功能盘点。
核心工作流(四阶段)
阶段 0:准备与安全边界
- 明确安全边界并写入文档开头:全程只读。删除/保存/提交/审核/启用停用/重置密码
一律不点;"新增"类按钮只打开弹窗记录字段后关闭;不确定的操作跳过并标注"未验证"。 - 每完成一个一级菜单就追加式保存文档(不等全部完成),中断后可续作。
- 建立任务清单(TodoWrite/进度表),每个一级菜单一个状态节点。
阶段 1:登录(含验证码)
详见 references/captcha-solver.md。要点:
- 先截图观察验证码类型;AJ-Captcha 类拼图验证码优先尝试图像分析定位而非盲拖。
- 登录成功后立即导出 Cookie(
agent-browser cookies或等价物),后续抓取可复用。 - 登录后可能有强制弹窗(如"密码过于简单"),只点取消,不做任何修改。
阶段 2:菜单枚举(三招,从省事到费力)
按顺序尝试,命中即停:
- 看首页/框架 HTML 是否服务端渲染了菜单(RuoYi/若依、JeeSite 等国产框架常这样干):
curl -H "Cookie: ..."抓首页,找li[...] href="/xxx"形式的菜单项——
一次拿到"菜单 → URL"全映射,这是最高效路径(本项目 84 个页面 1 分钟枚举完)。 - 菜单数据在 JS 变量/localStorage:grep 页面源码与 storage 中的 menu/route/routes。
- 都没有:逐个点击一级菜单,从 DOM 提取二级/三级面板(注意下面的可见性陷阱)。
阶段 3:页面字段采集(双通道,必须都用)
通道 A:服务端渲染直抓(主力,快而全)
- 拿 Cookie + 页面 URL 直接 curl HTML,解析:
- <label> → 查询/筛选字段
- field: 'x', title: 'y'(bootstrap-table 等配置)→ 表格列
- <a>/<button> → 操作按钮
- <title> → 页面标题
- 判据:抓回的 HTML 里能找到 <label>/field: 等真实内容即为服务端渲染,放心批量抓。
通道 B:浏览器渲染抽查(必做,补盲区)
- 纯源码解析一定会漏(本项目抽查 84 页就实证漏了 2 处):
- JS 渲染的表格列(如 Vue 组件里 columns 数组动态生成的"是否允许续费""是否统计余位")
- 行级操作按钮(如表格每行的"模拟计费")
- 每个一级菜单至少抽 2~3 个页面:浏览器打开渲染后,
document.querySelectorAll('table th, .el-table__header th, .ivu-table th') 与
行内按钮容器,与通道 A 结果做差集,把差集补进文档。
- 弹窗(新增/编辑)内的字段、交互行为、提示语(toast/confirm 文案)源码解析无结构承载,
需浏览器逐页验证;来不及全覆盖时在文档"未覆盖项"如实标注。
阶段 4:截图与文档
- 截图不要依赖逐页点击导航(SPA 多面板/iframe 下容易拍错页面)。
若页面 URL 可直连:浏览器逐个open URL → screenshot,与字段解析同源、可信。 - 文档结构:菜单树总览 → 按一级菜单分章节(页面 → 功能点)→ 对标提示 → 覆盖情况汇报。
- 交付前必须校验:文档中引用的每个截图路径用
os.path.exists逐一核对,
路径写错是高频翻车点(本项目首版就错)。 - 格式偏差要声明:如把表格改为结构化列表(信息等价、更规整),需在文档注明"格式创新",
避免读者以为是原始调研结果。
已验证的陷阱清单(必读)
- SPA 多面板可见性:多个菜单面板同时挂在 DOM 时,
getComputedStyle对 display:none 祖先的子元素仍返回block——
判断可见性必须用offsetParent !== null或getBoundingClientRect().width > 0。
盲点点击会落在错误面板上,表现为"点击无效/拍到旧页面"。 - iframe 架构:页面主体常在 iframe(如 RuoYi 的 tab 页签)。顶层 document 查不到
内容时,用iframe.contentDocument(同源)取;每次开新页可能追加新 iframe
而非复用,探测时取最后一个。 - 点击导航确认:点击菜单后必须轮询 iframe src 变化(或 URL 变化)确认导航成功,
超时重试;不能 click 完就采集,SPA 慢加载会采到上一页。 - 手柄类拖拽的坐标偏移:滑块手柄通常是"中心跟随鼠标",元素 left = 鼠标 x − 半宽,
计算落点时别漏掉这个半宽。 - 强弹窗遮罩:layui-layer 遮罩会挡住 click(agent-browser 会报 covered),
先点取消/关闭按钮,或display:none掉遮罩层再操作。 - 登录态时效:验证码图、登录 Cookie 都可能过期;把"重新登录 + 过验证码"流程
脚本化(图像分析 + 轨迹拖拽),随时可重跑。 - 源码解析盲区(再强调):JS 动态列、行级按钮、弹窗字段、交互提示语——
四类信息必须浏览器抽查/验证,源码解析只当"快而全的底稿"。 - 长任务执行环境:网络/会话易抖动时,把批量抓取写成脚本后台运行
(双 fork 脱离会话 + 进度文件轮询),避免工具调用轮次被故障重试吃光。
产出物规范
<名称>功能清单.md:菜单树总览 → 分章节(页面 → 操作路径/URL/标题/查询字段/
表格列/按钮/备注)→ 对标提示(只列观察,不下结论)→ 覆盖情况汇报(含未覆盖项及原因)。- 截图目录:
截图/<一级菜单>/<页面名>.png,与文档引用路径严格一致。 - 每条数据标注来源可信度:浏览器实走验证 ✅ / 源码解析 📄 / 渲染抽查补录 ➕。
参考文件
- references/captcha-solver.md — 滑块/拼图验证码自动通过方案
- references/capture-playbook.md — 双通道采集与抽查补盲操作手册
- scripts/parse_ruyi_html.py — 服务端渲染 HTML 字段解析(label/field:配置/按钮)
- scripts/screenshot_direct.py — Cookie 直连 URL 批量截图