当前页面采集:唯一颜色选中后尺码遍历因锚点消失提前结束 #111

Closed
opened 2026-08-27 16:31:04 +08:00 by ila · 2 comments
Owner

所属与来源

  • 关联工单:#101 当前页面采集、#110 Activity 证据隔离与详情入口诊断。
  • 来源:用户于 2026-08-27 在 PKG110、Agent 0.9.7(提交 e606096)完成最新当前页面采集后反馈结果为“缺失项:size”,并确认期望 Agent 在规格面板中通过有界滑动定位尺码后采集全部尺码。
  • 类型:Android Agent / PDD 商品详情 / 规格面板尺码遍历缺陷。
  • 设计证据:恢复既有规格采集行为,不新增页面、组件、导航、文案、接口或数据库,无需 UI 原型。

当前事实与根因

最新结构化证据:

  • 当前页面任务 #79 已进入 completed_partial,详情入口诊断为 DETAIL_ENTRY_MATCHED,耗时 198ms,package/activity/selector 均匹配,说明 #110 修复有效。
  • 服务端保存了 1 个颜色维度值、1 个颜色价格和 1 条颜色 SKU,但没有 size 维度,最终 missing=[size]。
  • 从商品身份识别完成到任务结束约 8.9 秒,不是详情入口 30 秒超时。
  • PddProductDetailCollector 仅在 sizes 集合为空时加入 size 缺失,服务端只忠实保存结果。

代码根因:

  1. PDD 可能在唯一颜色被选中后,从可点击无障碍节点中移除该已选颜色;现有颜色遍历已将这种节点消失视为合法重排。
  2. 当尺码位于当前规格面板视口下方且尚未解析到尺码标题/值时,collectSizes() 以“已发现尺码节点,否则当前可见颜色节点”作为纵向滑动锚点。
  3. 如果唯一颜色节点此时也已消失,两个锚点均为空,函数直接返回成功结束,不执行纵向滑动,随后因 sizes.isEmpty() 标记 missing:size。
  4. 现有测试分别覆盖“选中颜色消失”和“尺码标题滚出视口后的连续采集”,但未覆盖“唯一颜色消失 + 尺码在下一屏”的组合。

是否该商品天然只有单一颜色维度目前不能仅靠持久化结果证明;本工单修复遍历提前结束,完整扫过规格面板仍无尺码时继续按现行契约标记 missing:size,不在本工单改变单规格商品完整性规则。

目标

  1. 尺码采集不再依赖选中后仍可见的颜色节点。
  2. 在规格面板内先建立稳定的纵向滚动容器证据,回到顶部后单向有界扫描,找到尺码标题/值并采集所有尺码。
  3. 尺码标题滑出视口后继续使用既有 continuation 逻辑采集后续值。
  4. 完整扫描至稳定边界或规则上限后仍未发现尺码,才标记 missing:size。
  5. 增加不含控件内容的尺码发现诊断,便于区分容器缺失、滑动失败、到达边界和发现尺码。

非目标

  • 不改变单规格商品是否应视为完整结果的产品规则。
  • 不修改 PDD 页面强证据、分享、剪贴板、短链、goods_id、任务创建时序或 #110 Activity 修复。
  • 不修改服务端、数据库、共享 API、Web、采集规则 JSON 结构和默认滑动上限。
  • 不点击尺码、确认、购买、订单或支付控件。
  • 不保存或输出原始控件树、截图、控件文本、链接、goods_id 或剪贴板内容。
  • 不涉及采购、地址、创建订单和支付。

实施方案

规格面板上下文

  1. 从规格面板已确认页面建立可复用的纵向滚动容器证据,优先使用规格值节点的可滚动祖先;不得把颜色节点本身作为唯一长期锚点。
  2. 尺码遍历前复用规格面板容器执行回顶;若当前选项节点已消失,允许由 driver 使用已确认面板容器或安全的规格面板纵向滚动回退,不得滚动页面外任意容器。
  3. 保留现有 UiDriver、PddCollectorDriver 对外契约;如需内部上下文数据,使用 Android 采集器内部类型,不波及采购路径。

有界尺码发现

  1. 从规格面板顶部开始,逐屏执行向上手势(内容向上移动),每屏解析尺码标题及值。
  2. 首次发现尺码后建立 continuation;标题滚出视口后,只在同一已确认滚动容器内继续识别候选值。
  3. 使用安全视口签名和现有 stableEdgeReads 判定边界,滑动次数不得超过 specVerticalSwipes;不得随机往返或无限循环。
  4. 只有无法证明回顶或第一次滑动方向未产生变化时,才允许一次有界反向恢复后重新单向扫描;不得用固定长等待掩盖失败。
  5. 扫描过程中离开 PDD 详情页、出现登录/验证码/风控仍按既有明确错误失败。

诊断与测试

  1. 复用现有本地 AgentDiagnosticStore 表结构,增加尺码发现阶段和安全原因;只记录 taskId、尝试/滑动次数、耗时、候选数量和停止原因,不增加数据库版本或服务端字段。
  2. 当前页面采集路径传入诊断;普通管理端采集和采购路径保持不变。
  3. 增加组合回归:唯一颜色、选中后颜色节点消失、初始视口无尺码、向上滑动后出现尺码,最终采集所有尺码且不含 missing:size。
  4. 覆盖无面板滚动容器、滑动未生效、到达稳定边界仍无尺码,以及标题滑出后 continuation 继续工作的行为。

安全边界

  • 只在已确认的 PDD 规格面板滚动容器内执行有界手势。
  • 尺码只读,不点击候选。
  • 不触碰确认、购买、订单和支付。
  • 诊断不记录控件文本/树、截图、商品链接、goods_id 或剪贴板内容。
  • 一台设备仍只执行一个任务,失败不自动换机。

验收标准

  • 组合测试证明唯一颜色节点消失后,Agent 仍能滚动规格面板并发现下一屏尺码。
  • 从顶部单向有界扫描,达到稳定边界或 specVerticalSwipes 上限即停止,无无限往返。
  • 尺码标题滑出后仍可在同一面板上下文中采集后续尺码。
  • 完整扫描未发现尺码时按现行契约提交 completed_partial + missing:size,不猜测数据。
  • PKG110 复采同一已授权商品后,若页面实际存在尺码,则结果包含全部可见尺码且不再缺失 size。
  • #110 的 DETAIL_ENTRY_MATCHED 保持小于 3 秒,不回退。
  • 普通管理端采集、采购路径、服务端/API/数据库/Web 均不变。
  • 诊断与日志不新增控件内容、链接、goods_id、剪贴板或截图。

验证方式

  • cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
  • .\scripts\verify.ps1 -Component android
  • 组合单测覆盖尺寸发现、稳定边界、容器/手势失败和 continuation。
  • PKG110 安装新版本后,由人工从已授权 PDD 商品页执行当前页面采集;只记录任务号、版本、规则、诊断原因、耗时、规格数量和最终状态。

依赖、风险与回退

  • 前置依赖:#110 提交 e606096 已完成并安装 PKG110。
  • 不建议与其他修改规格面板滚动或 PddProductDetailCollector 的工单并行。
  • 风险:错误选择滚动容器可能滚动规格面板外页面;必须复用已确认规格面板上下文并以页面强证据、容器关系和有界签名约束。
  • 回退:还原本工单 Android 提交即可;不涉及数据迁移、接口或服务端部署。

文档影响

预计为 Android 内部遍历修复和本地诊断增强,不改变长期业务规则、共享 API 或运行方式。实施时检查 Wiki 是否枚举尺码诊断;未枚举则在工单说明无长期文档影响并跳过 Wiki 同步。

状态

方案已按用户确认的全栈分析结论建立,立即实施。

## 所属与来源 - 关联工单:#101 当前页面采集、#110 Activity 证据隔离与详情入口诊断。 - 来源:用户于 2026-08-27 在 PKG110、Agent 0.9.7(提交 `e606096`)完成最新当前页面采集后反馈结果为“缺失项:size”,并确认期望 Agent 在规格面板中通过有界滑动定位尺码后采集全部尺码。 - 类型:Android Agent / PDD 商品详情 / 规格面板尺码遍历缺陷。 - 设计证据:恢复既有规格采集行为,不新增页面、组件、导航、文案、接口或数据库,无需 UI 原型。 ## 当前事实与根因 最新结构化证据: - 当前页面任务 #79 已进入 `completed_partial`,详情入口诊断为 `DETAIL_ENTRY_MATCHED`,耗时 198ms,package/activity/selector 均匹配,说明 #110 修复有效。 - 服务端保存了 1 个颜色维度值、1 个颜色价格和 1 条颜色 SKU,但没有 size 维度,最终 `missing=[size]`。 - 从商品身份识别完成到任务结束约 8.9 秒,不是详情入口 30 秒超时。 - `PddProductDetailCollector` 仅在 `sizes` 集合为空时加入 `size` 缺失,服务端只忠实保存结果。 代码根因: 1. PDD 可能在唯一颜色被选中后,从可点击无障碍节点中移除该已选颜色;现有颜色遍历已将这种节点消失视为合法重排。 2. 当尺码位于当前规格面板视口下方且尚未解析到尺码标题/值时,`collectSizes()` 以“已发现尺码节点,否则当前可见颜色节点”作为纵向滑动锚点。 3. 如果唯一颜色节点此时也已消失,两个锚点均为空,函数直接返回成功结束,不执行纵向滑动,随后因 `sizes.isEmpty()` 标记 `missing:size`。 4. 现有测试分别覆盖“选中颜色消失”和“尺码标题滚出视口后的连续采集”,但未覆盖“唯一颜色消失 + 尺码在下一屏”的组合。 是否该商品天然只有单一颜色维度目前不能仅靠持久化结果证明;本工单修复遍历提前结束,完整扫过规格面板仍无尺码时继续按现行契约标记 `missing:size`,不在本工单改变单规格商品完整性规则。 ## 目标 1. 尺码采集不再依赖选中后仍可见的颜色节点。 2. 在规格面板内先建立稳定的纵向滚动容器证据,回到顶部后单向有界扫描,找到尺码标题/值并采集所有尺码。 3. 尺码标题滑出视口后继续使用既有 continuation 逻辑采集后续值。 4. 完整扫描至稳定边界或规则上限后仍未发现尺码,才标记 `missing:size`。 5. 增加不含控件内容的尺码发现诊断,便于区分容器缺失、滑动失败、到达边界和发现尺码。 ## 非目标 - 不改变单规格商品是否应视为完整结果的产品规则。 - 不修改 PDD 页面强证据、分享、剪贴板、短链、goods_id、任务创建时序或 #110 Activity 修复。 - 不修改服务端、数据库、共享 API、Web、采集规则 JSON 结构和默认滑动上限。 - 不点击尺码、确认、购买、订单或支付控件。 - 不保存或输出原始控件树、截图、控件文本、链接、goods_id 或剪贴板内容。 - 不涉及采购、地址、创建订单和支付。 ## 实施方案 ### 规格面板上下文 1. 从规格面板已确认页面建立可复用的纵向滚动容器证据,优先使用规格值节点的可滚动祖先;不得把颜色节点本身作为唯一长期锚点。 2. 尺码遍历前复用规格面板容器执行回顶;若当前选项节点已消失,允许由 driver 使用已确认面板容器或安全的规格面板纵向滚动回退,不得滚动页面外任意容器。 3. 保留现有 `UiDriver`、`PddCollectorDriver` 对外契约;如需内部上下文数据,使用 Android 采集器内部类型,不波及采购路径。 ### 有界尺码发现 4. 从规格面板顶部开始,逐屏执行向上手势(内容向上移动),每屏解析尺码标题及值。 5. 首次发现尺码后建立 continuation;标题滚出视口后,只在同一已确认滚动容器内继续识别候选值。 6. 使用安全视口签名和现有 `stableEdgeReads` 判定边界,滑动次数不得超过 `specVerticalSwipes`;不得随机往返或无限循环。 7. 只有无法证明回顶或第一次滑动方向未产生变化时,才允许一次有界反向恢复后重新单向扫描;不得用固定长等待掩盖失败。 8. 扫描过程中离开 PDD 详情页、出现登录/验证码/风控仍按既有明确错误失败。 ### 诊断与测试 9. 复用现有本地 `AgentDiagnosticStore` 表结构,增加尺码发现阶段和安全原因;只记录 taskId、尝试/滑动次数、耗时、候选数量和停止原因,不增加数据库版本或服务端字段。 10. 当前页面采集路径传入诊断;普通管理端采集和采购路径保持不变。 11. 增加组合回归:唯一颜色、选中后颜色节点消失、初始视口无尺码、向上滑动后出现尺码,最终采集所有尺码且不含 `missing:size`。 12. 覆盖无面板滚动容器、滑动未生效、到达稳定边界仍无尺码,以及标题滑出后 continuation 继续工作的行为。 ## 安全边界 - 只在已确认的 PDD 规格面板滚动容器内执行有界手势。 - 尺码只读,不点击候选。 - 不触碰确认、购买、订单和支付。 - 诊断不记录控件文本/树、截图、商品链接、goods_id 或剪贴板内容。 - 一台设备仍只执行一个任务,失败不自动换机。 ## 验收标准 - [ ] 组合测试证明唯一颜色节点消失后,Agent 仍能滚动规格面板并发现下一屏尺码。 - [ ] 从顶部单向有界扫描,达到稳定边界或 `specVerticalSwipes` 上限即停止,无无限往返。 - [ ] 尺码标题滑出后仍可在同一面板上下文中采集后续尺码。 - [ ] 完整扫描未发现尺码时按现行契约提交 `completed_partial + missing:size`,不猜测数据。 - [ ] PKG110 复采同一已授权商品后,若页面实际存在尺码,则结果包含全部可见尺码且不再缺失 size。 - [ ] #110 的 `DETAIL_ENTRY_MATCHED` 保持小于 3 秒,不回退。 - [ ] 普通管理端采集、采购路径、服务端/API/数据库/Web 均不变。 - [ ] 诊断与日志不新增控件内容、链接、goods_id、剪贴板或截图。 ## 验证方式 - `cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug` - `.\scripts\verify.ps1 -Component android` - 组合单测覆盖尺寸发现、稳定边界、容器/手势失败和 continuation。 - PKG110 安装新版本后,由人工从已授权 PDD 商品页执行当前页面采集;只记录任务号、版本、规则、诊断原因、耗时、规格数量和最终状态。 ## 依赖、风险与回退 - 前置依赖:#110 提交 `e606096` 已完成并安装 PKG110。 - 不建议与其他修改规格面板滚动或 `PddProductDetailCollector` 的工单并行。 - 风险:错误选择滚动容器可能滚动规格面板外页面;必须复用已确认规格面板上下文并以页面强证据、容器关系和有界签名约束。 - 回退:还原本工单 Android 提交即可;不涉及数据迁移、接口或服务端部署。 ## 文档影响 预计为 Android 内部遍历修复和本地诊断增强,不改变长期业务规则、共享 API 或运行方式。实施时检查 Wiki 是否枚举尺码诊断;未枚举则在工单说明无长期文档影响并跳过 Wiki 同步。 ## 状态 方案已按用户确认的全栈分析结论建立,立即实施。
Author
Owner

实施完成,待验收

已按工单方案完成 Android 修复,提交:a10f9833e7efbf3e5612392bfcf7bad9b1ff42dd。

实现

  • 解析规格面板时保存已由“可滚动容器包含真实规格标题”确认的纵向滚动容器快照。
  • 颜色遍历回顶和尺码遍历均可复用该容器;唯一颜色选中后即使颜色节点消失,也不会因缺少颜色/尺码节点锚点而提前退出。
  • Accessibility Service 对滚动容器锚点按 scrollable + class + bounds 精确重新定位;普通选项仍保持标签、class、bounds 匹配。
  • 尺码扫描从顶部开始单向、有界执行,沿用 stableEdgeReads 与 specVerticalSwipes;首次空视口不再被错误视为已稳定到边界。
  • 标题出现后继续沿用既有 continuation,在标题滑出视口后采集同一已确认容器中的后续尺码。
  • 无法确认容器或滑动失败时安全停止,不回退到任意页面滚动。
  • 新增本地 SIZE_DISCOVERY 安全诊断:SIZE_FOUND、SIZE_EDGE_REACHED、SIZE_SCAN_LIMIT、SIZE_CONTAINER_UNAVAILABLE、SIZE_SWIPE_FAILED。仅记录任务号、滑动次数、耗时、候选数量与停止原因,复用现有 SQLite schema。
  • Agent 更新为 0.9.8(versionCode 21)。

自动验证

  • 目标 PddProductDetailCollectorTest:通过。
  • .\android\gradlew.bat -p android :app:testDebugUnitTest :app:assembleDebug:通过。
  • .\scripts\verify.ps1 -Component android:通过(Debug/Release 单元测试、Debug APK)。
  • python dev_scripts/harness.py check --strict:通过。
  • git diff --check:通过。
  • 新增组合覆盖:
    • 唯一颜色选中后节点消失、首屏无尺码、下一屏出现尺码,最终完整采到尺码且不含 missing:size;
    • 未确认滚动容器时不执行不安全纵向滑动;
    • 已确认容器滑动失败时有界停止;
    • 完整扫描在稳定边界仍无尺码时继续按现行契约提交 completed_partial + missing:size。
  • 未发现 Wiki 枚举尺码诊断阶段/原因;本次不改变业务规则、API、运行方式或数据结构,因此无长期文档影响并跳过 Wiki 更新与同步。

PKG110

  • 安装前确认设备 2 没有 pending/running 采集任务。
  • 已成功安装 0.9.8(versionCode 21)。
  • 无障碍授权仍在,已启动 Agent 主界面。
  • 尚未代替用户点击真实商品执行复采;同一商品是否实际暴露尺码、最终尺码数量和任务状态仍为人工验收项。
  • 未读取、保存或输出控件树、截图、控件文本、链接、goods_id 或剪贴板正文。

服务端、数据库、共享 API、Web、采购和规则 JSON 均未修改。工单保持 open / 待验收。

## 实施完成,待验收 已按工单方案完成 Android 修复,提交:`a10f9833e7efbf3e5612392bfcf7bad9b1ff42dd`。 ### 实现 - 解析规格面板时保存已由“可滚动容器包含真实规格标题”确认的纵向滚动容器快照。 - 颜色遍历回顶和尺码遍历均可复用该容器;唯一颜色选中后即使颜色节点消失,也不会因缺少颜色/尺码节点锚点而提前退出。 - Accessibility Service 对滚动容器锚点按 `scrollable + class + bounds` 精确重新定位;普通选项仍保持标签、class、bounds 匹配。 - 尺码扫描从顶部开始单向、有界执行,沿用 `stableEdgeReads` 与 `specVerticalSwipes`;首次空视口不再被错误视为已稳定到边界。 - 标题出现后继续沿用既有 continuation,在标题滑出视口后采集同一已确认容器中的后续尺码。 - 无法确认容器或滑动失败时安全停止,不回退到任意页面滚动。 - 新增本地 `SIZE_DISCOVERY` 安全诊断:`SIZE_FOUND`、`SIZE_EDGE_REACHED`、`SIZE_SCAN_LIMIT`、`SIZE_CONTAINER_UNAVAILABLE`、`SIZE_SWIPE_FAILED`。仅记录任务号、滑动次数、耗时、候选数量与停止原因,复用现有 SQLite schema。 - Agent 更新为 0.9.8(versionCode 21)。 ### 自动验证 - 目标 `PddProductDetailCollectorTest`:通过。 - `.\android\gradlew.bat -p android :app:testDebugUnitTest :app:assembleDebug`:通过。 - `.\scripts\verify.ps1 -Component android`:通过(Debug/Release 单元测试、Debug APK)。 - `python dev_scripts/harness.py check --strict`:通过。 - `git diff --check`:通过。 - 新增组合覆盖: - 唯一颜色选中后节点消失、首屏无尺码、下一屏出现尺码,最终完整采到尺码且不含 `missing:size`; - 未确认滚动容器时不执行不安全纵向滑动; - 已确认容器滑动失败时有界停止; - 完整扫描在稳定边界仍无尺码时继续按现行契约提交 `completed_partial + missing:size`。 - 未发现 Wiki 枚举尺码诊断阶段/原因;本次不改变业务规则、API、运行方式或数据结构,因此无长期文档影响并跳过 Wiki 更新与同步。 ### PKG110 - 安装前确认设备 2 没有 `pending/running` 采集任务。 - 已成功安装 0.9.8(versionCode 21)。 - 无障碍授权仍在,已启动 Agent 主界面。 - 尚未代替用户点击真实商品执行复采;同一商品是否实际暴露尺码、最终尺码数量和任务状态仍为人工验收项。 - 未读取、保存或输出控件树、截图、控件文本、链接、goods_id 或剪贴板正文。 服务端、数据库、共享 API、Web、采购和规则 JSON 均未修改。工单保持 open / 待验收。
Author
Owner

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。
ila closed this issue 2026-08-28 15:07:11 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#111