规格面板识别:以地址入口、支付入口和数量输入框为必备依据(含保存地址后返回) #331

Open
opened 2026-09-21 17:41:45 +08:00 by ila · 6 comments
Owner

原始需求摘要

2026-09-21,线上同款 PDD 商品在设备 7、8 上多次出现 PURCHASE_SPEC_PANEL_EVIDENCE_NOT_MATCHED;保存收货地址后又出现规格面板无法恢复或过早判定失败。目标是提高规格面板识别和地址保存返回后的稳定性,不放宽真正下单按钮的安全判断。

当前事实

  • 当前识别依赖已选摘要、规格选项、数量、支付区和提交订单按钮等结构证据。
  • 部分真实面板出现 summary=false、orderAction=false,但仍有地址入口、支付方式入口、数量输入框和其他面板证据。
  • 保存地址后当前只等待地址编辑页消失,随后立即判断一次;面板尚未完成加载时可能被误判,并触发返回键关闭规格面板。

本单范围

  1. 规格面板识别:地址入口、支付方式修改入口、唯一可见可用数量输入框作为必备证据,并要求至少一项辅助证据(规格选项、摘要、关闭控件、加减数量控件或提交按钮)。
  2. 必备证据必须属于同一 PDD 规格面板上下文,保留页面包名、页面证据、窗口/面板关系和稳定结构校验,避免把地址页、支付弹窗或其他页面节点拼接为面板。
  3. 保存地址后等待规格面板加载:连续采样确认必备证据和结构签名稳定;等待期间不按返回键;达到上限后明确失败并输出脱敏诊断。
  4. 保持提交订单按钮判断严格:必须唯一、可点击、文字明确匹配;面板识别放宽不等于放宽提交动作。

非目标

  • 不修改规格颜色/尺码的精确匹配和选中确认逻辑;该问题另见新工单 #332。
  • 不修改地址编辑流程、服务端/Web 接口、采购规则、付款行为或订单创建动作。
  • 不使用 OCR/VLM,不保存原始控件树和整屏截图。

验收

  • 脱敏真实样本:设备 7、8 的规格面板在摘要或提交按钮缺失时仍可正确识别。
  • 地址保存后面板分多次加载时,等待稳定后继续流程,期间不按返回键。
  • 地址入口、支付入口、数量输入框任一缺失时不得判定为规格面板。
  • 商品详情页、地址列表/编辑页、支付方式弹窗、支付页均不得误判。
  • 零尺寸或不唯一的提交按钮仍明确失败。
  • Android 全量单元测试及采购相关回归测试通过;真机验证需单独授权。

风险与文档

这是采购页面识别变化,属于高风险范围;实施前需要人工授权,真机采购验证不得执行付款。长期识别规则变化后更新业务规则与架构 Wiki;无 API 变化则不修改 Agent API 契约。

依赖

与 #332 可分别实施;建议先完成本单的识别与等待,再验证 #332 的规格选择确认。

## 原始需求摘要 2026-09-21,线上同款 PDD 商品在设备 7、8 上多次出现 `PURCHASE_SPEC_PANEL_EVIDENCE_NOT_MATCHED`;保存收货地址后又出现规格面板无法恢复或过早判定失败。目标是提高规格面板识别和地址保存返回后的稳定性,不放宽真正下单按钮的安全判断。 ## 当前事实 - 当前识别依赖已选摘要、规格选项、数量、支付区和提交订单按钮等结构证据。 - 部分真实面板出现 `summary=false`、`orderAction=false`,但仍有地址入口、支付方式入口、数量输入框和其他面板证据。 - 保存地址后当前只等待地址编辑页消失,随后立即判断一次;面板尚未完成加载时可能被误判,并触发返回键关闭规格面板。 ## 本单范围 1. 规格面板识别:地址入口、支付方式修改入口、唯一可见可用数量输入框作为必备证据,并要求至少一项辅助证据(规格选项、摘要、关闭控件、加减数量控件或提交按钮)。 2. 必备证据必须属于同一 PDD 规格面板上下文,保留页面包名、页面证据、窗口/面板关系和稳定结构校验,避免把地址页、支付弹窗或其他页面节点拼接为面板。 3. 保存地址后等待规格面板加载:连续采样确认必备证据和结构签名稳定;等待期间不按返回键;达到上限后明确失败并输出脱敏诊断。 4. 保持提交订单按钮判断严格:必须唯一、可点击、文字明确匹配;面板识别放宽不等于放宽提交动作。 ## 非目标 - 不修改规格颜色/尺码的精确匹配和选中确认逻辑;该问题另见新工单 #332。 - 不修改地址编辑流程、服务端/Web 接口、采购规则、付款行为或订单创建动作。 - 不使用 OCR/VLM,不保存原始控件树和整屏截图。 ## 验收 - 脱敏真实样本:设备 7、8 的规格面板在摘要或提交按钮缺失时仍可正确识别。 - 地址保存后面板分多次加载时,等待稳定后继续流程,期间不按返回键。 - 地址入口、支付入口、数量输入框任一缺失时不得判定为规格面板。 - 商品详情页、地址列表/编辑页、支付方式弹窗、支付页均不得误判。 - 零尺寸或不唯一的提交按钮仍明确失败。 - Android 全量单元测试及采购相关回归测试通过;真机验证需单独授权。 ## 风险与文档 这是采购页面识别变化,属于高风险范围;实施前需要人工授权,真机采购验证不得执行付款。长期识别规则变化后更新业务规则与架构 Wiki;无 API 变化则不修改 Agent API 契约。 ## 依赖 与 #332 可分别实施;建议先完成本单的识别与等待,再验证 #332 的规格选择确认。
Author
Owner

范围补充:保存地址后等待规格面板加载完成(2026-09-21,用户确认补入)

用户观察

用户用 uiautomator2 导出 PDD 商品页控件树时,连接后不等待直接导出数据不全,需要等几秒。

代码事实(origin/main 5e0a9d1,PurchaseLiveAutomation.kt)

  1. 点击“保存地址”后,waitForStableAddressEditorExit 每 200ms 采样,连续 2 次看不到地址编辑页即返回(约 0.4 秒),只判断编辑页消失,不判断规格面板是否加载完成。
  2. 随后 isPurchaseConfirmationPanel 对这一份快照只判断一次。
  3. 判断失败时走 else 分支:按一次返回键(driver.backPurchase()),再用 waitFor 最多 50×200ms(约 10 秒)等待地址证据,超时报 PURCHASE_ADDRESS_SAVE_TIMEOUT“地址保存后无法返回订单页面”。

推断(未验证)

面板已返回但尚未加载完整时,第 2 步认不出,第 3 步按返回键可能把规格面板关闭,导致后续一直等不到而报错。线上该错误 7 次中可能有一部分属于此情况;需要失败现场的结构化诊断证实。

补充方案

  1. 保存地址后,**等待规格面板必备三项(地址入口、支付入口、数量输入框)全部出现,且连续两次采样结构签名一致(加载稳定)**后再判断;设上限(建议约 5 秒,实施时定为常量并回写)。
  2. 等待期间不得按返回键;只有等满上限且确认不是规格面板时,才返回或明确失败(实施时二选一并回写理由,默认倾向明确失败)。
  3. 首次点击规格入口后的等待(waitForSpecPanel)同样改为以新判定三项 + 稳定签名为完成条件。
  4. 诊断增加:等待时长/采样次数、三项必备与辅助项各自有无、是否按过返回键;不含地址等个人内容。

验收补充

  • 单测:模拟面板分多次加载(前几次缺项、之后齐全)→ 等待后识别成功且未按返回键;始终缺项 → 到上限明确失败;加载中结构变化未稳定时不提前判定。
  • 回归:既有地址保存返回路径(已直接识别到面板、需滚动找地址证据)行为不变。

风险

仍属采购流程,高风险,实施前需人工确认;真机验证另行授权。

## 范围补充:保存地址后等待规格面板加载完成(2026-09-21,用户确认补入) ### 用户观察 用户用 uiautomator2 导出 PDD 商品页控件树时,连接后不等待直接导出数据不全,需要等几秒。 ### 代码事实(origin/main 5e0a9d1,`PurchaseLiveAutomation.kt`) 1. 点击“保存地址”后,`waitForStableAddressEditorExit` 每 200ms 采样,**连续 2 次看不到地址编辑页即返回**(约 0.4 秒),只判断编辑页消失,**不判断规格面板是否加载完成**。 2. 随后 `isPurchaseConfirmationPanel` 对这一份快照**只判断一次**。 3. 判断失败时走 else 分支:**按一次返回键**(`driver.backPurchase()`),再用 `waitFor` 最多 50×200ms(约 10 秒)等待地址证据,超时报 `PURCHASE_ADDRESS_SAVE_TIMEOUT`“地址保存后无法返回订单页面”。 ### 推断(未验证) 面板已返回但尚未加载完整时,第 2 步认不出,第 3 步按返回键可能把规格面板关闭,导致后续一直等不到而报错。线上该错误 7 次中可能有一部分属于此情况;需要失败现场的结构化诊断证实。 ### 补充方案 1. 保存地址后,**等待规格面板必备三项(地址入口、支付入口、数量输入框)全部出现,且连续两次采样结构签名一致(加载稳定)**后再判断;设上限(建议约 5 秒,实施时定为常量并回写)。 2. **等待期间不得按返回键**;只有等满上限且确认不是规格面板时,才返回或明确失败(实施时二选一并回写理由,默认倾向明确失败)。 3. 首次点击规格入口后的等待(`waitForSpecPanel`)同样改为以新判定三项 + 稳定签名为完成条件。 4. 诊断增加:等待时长/采样次数、三项必备与辅助项各自有无、是否按过返回键;不含地址等个人内容。 ### 验收补充 - 单测:模拟面板分多次加载(前几次缺项、之后齐全)→ 等待后识别成功且未按返回键;始终缺项 → 到上限明确失败;加载中结构变化未稳定时不提前判定。 - 回归:既有地址保存返回路径(已直接识别到面板、需滚动找地址证据)行为不变。 ### 风险 仍属采购流程,高风险,实施前需人工确认;真机验证另行授权。
Author
Owner

范围补充:规格选项重复计数导致选中确认失败(任务 535,2026-09-21,用户确认补入)

线上现象

任务 535(SYB 260918CRGHU5JD,PDD 商品 8910,设备 8)失败:PURCHASE_SPEC_SELECTION_UNCONFIRMED“无障碍点击和受控手势后未能确认精确选中状态”。服务端下发(ai_match):颜色 兰条纹,尺码 2XL建议130-150斤。该报错来自首次选规格(selectExactSpecWithRetry),不是地址返回后的最终复核。

证据(真机导出 + 本地解析验证)

  • 设备 192.168.0.173:34581 上人工选好该规格后导出控件树(仅本地 xml_data/,含地址,未提交)。
  • 用 Agent 自身 PddScreenParser.parse(origin/main 5e0a9d1)在本地临时单测解析该样本(测试已删除,未提交),结果:
    • 颜色解析出 3 个值:兰条纹(ViewGroup,selected)、兰条纹\n 零差评(其内部 TextView,selected)、白条纹(未选)。同一选项块被计为两个值。
    • 尺码:2XL建议130-150斤 selected,其余未选,正常。
    • isExactSpecSelected 逻辑:颜色 otherSelected=true(带“零差评”的重复值文字≠目标且已选中)→ 直接判定未选中;尺码通过。
  • 结论:已确认失败原因是选项重复计数,与等待时长无关(点击+手势两轮、共约 4 秒以上,选中状态在树中即时存在)。

附带发现(属本单范围一)

同一样本解析为 specPanelOpen=false、type=UNKNOWN、selectedSummary=null:选中后摘要为 #快抢光#兰条纹 2XL建议130-150斤(无“已选/请选择”前缀),底部为 提交订单 ¥23.99。说明本单“规格面板识别”问题在该商品选中后状态同样存在。

补充方案

  1. 解析规格值时,同一选项块(外层可点击块及其内部文字)只算一个选项;文字优先取外层块的 label,外层无文字时才用内部文字。
  2. 暂不做“去标签”(零差评、快要抢光等):合并后本样本已不需要;维护标签词表有漏词/误删真实规格名的风险。仅在出现“只有内部带标签文字”或“外层 label 本身带标签”的真实样本后再评估。
  3. 选中确认失败时诊断增加:该维度解析出的各值文字(截断)、选中状态、目标值;不含个人信息。

验收补充

  • 以脱敏后的 535 样本做单测:颜色只解析出 兰条纹、白条纹 两个值;兰条纹 判定已选中;尺码判定不变。
  • 回归:既有规格解析/选择/最终复核测试不变;无外层块、仅文字选项的样本仍能解析。

风险

采购流程判定变化,高风险,实施前需人工确认;真机验证另行授权。

## 范围补充:规格选项重复计数导致选中确认失败(任务 535,2026-09-21,用户确认补入) ### 线上现象 任务 535(SYB `260918CRGHU5JD`,PDD 商品 8910,设备 8)失败:`PURCHASE_SPEC_SELECTION_UNCONFIRMED`“无障碍点击和受控手势后未能确认精确选中状态”。服务端下发(ai_match):颜色 `兰条纹`,尺码 `2XL建议130-150斤`。该报错来自首次选规格(`selectExactSpecWithRetry`),不是地址返回后的最终复核。 ### 证据(真机导出 + 本地解析验证) - 设备 192.168.0.173:34581 上人工选好该规格后导出控件树(仅本地 `xml_data/`,含地址,未提交)。 - 用 Agent 自身 `PddScreenParser.parse`(origin/main 5e0a9d1)在本地临时单测解析该样本(测试已删除,未提交),结果: - 颜色解析出 3 个值:`兰条纹`(ViewGroup,selected)、`兰条纹\n 零差评`(其内部 TextView,selected)、`白条纹`(未选)。**同一选项块被计为两个值。** - 尺码:`2XL建议130-150斤` selected,其余未选,正常。 - `isExactSpecSelected` 逻辑:颜色 `otherSelected=true`(带“零差评”的重复值文字≠目标且已选中)→ 直接判定未选中;尺码通过。 - 结论:**已确认**失败原因是选项重复计数,与等待时长无关(点击+手势两轮、共约 4 秒以上,选中状态在树中即时存在)。 ### 附带发现(属本单范围一) 同一样本解析为 `specPanelOpen=false`、`type=UNKNOWN`、`selectedSummary=null`:选中后摘要为 `#快抢光#兰条纹 2XL建议130-150斤`(无“已选/请选择”前缀),底部为 `提交订单 ¥23.99`。说明本单“规格面板识别”问题在该商品选中后状态同样存在。 ### 补充方案 1. 解析规格值时,**同一选项块(外层可点击块及其内部文字)只算一个选项**;文字**优先取外层块**的 label,外层无文字时才用内部文字。 2. **暂不做“去标签”**(零差评、快要抢光等):合并后本样本已不需要;维护标签词表有漏词/误删真实规格名的风险。仅在出现“只有内部带标签文字”或“外层 label 本身带标签”的真实样本后再评估。 3. 选中确认失败时诊断增加:该维度解析出的各值文字(截断)、选中状态、目标值;不含个人信息。 ### 验收补充 - 以脱敏后的 535 样本做单测:颜色只解析出 `兰条纹`、`白条纹` 两个值;`兰条纹` 判定已选中;尺码判定不变。 - 回归:既有规格解析/选择/最终复核测试不变;无外层块、仅文字选项的样本仍能解析。 ### 风险 采购流程判定变化,高风险,实施前需人工确认;真机验证另行授权。
Author
Owner

范围已拆分:#331 仅处理规格面板识别和保存地址后的稳定等待。规格选项外层节点/内部文字重复解析导致颜色或尺码确认失败的问题已单独建立 #332;两单分别测试和验收。

范围已拆分:#331 仅处理规格面板识别和保存地址后的稳定等待。规格选项外层节点/内部文字重复解析导致颜色或尺码确认失败的问题已单独建立 #332;两单分别测试和验收。
Author
Owner

规格重复解析已拆分为新工单 #332,请按新工单单独实施和验收。

规格重复解析已拆分为新工单 #332,请按新工单单独实施和验收。
Author
Owner

拆单后调整(2026-09-22,用户确认)

1. 依赖修正

本地验证(分支 fix/331-spec-panel-recognition 提交 99f2384,用 Agent 真实解析代码解析 8910 样本):main 上该面板为 UNKNOWN,分支上可识别;部分原因是 #332 的选项去重让规格维度解析正确。因此“与 #332 可分别实施”不完全成立:#331 的验收在 #332 合并之后进行(或两单同批合并)。

2. 提交拆分

99f2384 同时包含 #331(识别、等待、提交步骤收紧、诊断)与 #332(选项去重、选中失败诊断)。按“提交只含当前工单内容”,重新整理为两个提交,分别引用 #331、#332。

3. 同一面板校验(本单范围第 2 条,当前实现未满足)

当前实现只检查页面上是否存在“带打码手机号的可点击行”“带支付关键词的可点击行”“唯一数量输入框”,未校验三者属于同一规格面板容器。需补:三项必须位于同一面板容器(同一浮层/窗口内),并补“地址/支付节点来自其他页面或弹窗”的反例测试。

4. 采购环境前提(写入长期文档)

采购用 Android 手机必须事先:PDD App 已登录、微信已登录、PDD 已设置默认收货地址、PDD 默认支付方式为微信支付。规格面板的地址入口、支付入口依赖此前提。

  • 不为支付宝等其他支付方式补别名(有意决定)。
  • Agent 发现条件不满足时明确失败,不自动登录、不切换支付方式、不填写地址。
  • 诊断缺失项对应到可读提示(如“未找到支付入口:请确认 PDD 默认支付方式为微信支付”),不含个人信息。
  • Wiki 运行说明页补充采购手机准备清单。

5. 验收样本待取得

本单验收要求设备 7、8 的真实规格面板样本;目前只有另外三台手机的样本(4d8258ec、R28M30T2JWE、192.168.0.173:34581 的 8910),8580 在设备 7/8 上的样本尚未导出,该验收项暂未满足。需采购员配合在设备 7 或 8 上打开 8580 规格面板后导出(只读,不改设备状态)。

## 拆单后调整(2026-09-22,用户确认) ### 1. 依赖修正 本地验证(分支 `fix/331-spec-panel-recognition` 提交 `99f2384`,用 Agent 真实解析代码解析 8910 样本):main 上该面板为 `UNKNOWN`,分支上可识别;部分原因是 #332 的选项去重让规格维度解析正确。因此“与 #332 可分别实施”不完全成立:**#331 的验收在 #332 合并之后进行**(或两单同批合并)。 ### 2. 提交拆分 `99f2384` 同时包含 #331(识别、等待、提交步骤收紧、诊断)与 #332(选项去重、选中失败诊断)。按“提交只含当前工单内容”,重新整理为两个提交,分别引用 #331、#332。 ### 3. 同一面板校验(本单范围第 2 条,当前实现未满足) 当前实现只检查页面上是否存在“带打码手机号的可点击行”“带支付关键词的可点击行”“唯一数量输入框”,未校验三者属于同一规格面板容器。需补:三项必须位于同一面板容器(同一浮层/窗口内),并补“地址/支付节点来自其他页面或弹窗”的反例测试。 ### 4. 采购环境前提(写入长期文档) 采购用 Android 手机必须事先:PDD App 已登录、微信已登录、PDD 已设置默认收货地址、PDD 默认支付方式为微信支付。规格面板的地址入口、支付入口依赖此前提。 - 不为支付宝等其他支付方式补别名(有意决定)。 - Agent 发现条件不满足时明确失败,不自动登录、不切换支付方式、不填写地址。 - 诊断缺失项对应到可读提示(如“未找到支付入口:请确认 PDD 默认支付方式为微信支付”),不含个人信息。 - Wiki 运行说明页补充采购手机准备清单。 ### 5. 验收样本待取得 本单验收要求设备 7、8 的真实规格面板样本;目前只有另外三台手机的样本(`4d8258ec`、`R28M30T2JWE`、`192.168.0.173:34581` 的 8910),**8580 在设备 7/8 上的样本尚未导出**,该验收项暂未满足。需采购员配合在设备 7 或 8 上打开 8580 规格面板后导出(只读,不改设备状态)。
Author
Owner

合并与部署(2026-09-22,用户授权“合并#331,#332,#333,部署”)

  • main:0edc78a(#332)→ d8382e6(#331)→ 3bf428a(#333,由 0ab5a96 cherry-pick)→ 36810f3(Android 版本号 0.9.60 / versionCode 73)。
  • Server:从 3bf428a 构建 linux/amd64,SHA-256 01f59582cc037b2d9d5cd0ce0e9f7cbcaa57c4ba38d9f6f6eefcfc588a88a9b8;新发布目录 /home/goauto/releases/20260922-3bf428a-331-333(config/dist 复制自上一发布 20260922-5e0a9d1-328-330,本批无 Web 改动;static/var 链接沿用上一发布);current 原子切换,goauto.service active,外部首页/健康检查 HTTP 200,未认证管理接口 401,重启后日志无 panic/fatal/1146/1054。发布前采购/采集运行中任务均为 0。回滚目标:20260922-5e0a9d1-328-330。
  • Android:debug APK(commit 36810f3,0.9.60/73,SHA-256 c39569f92fc94cbc91f98489c25a5a860bcaff3de91b06518b895195d39e4877)已安装到设备 8(采购1,192.168.0.173:34581),安装前该设备无待执行/运行任务;启动 Agent 后心跳恢复,服务端显示 online、agent_version 0.9.60。
  • 未做:设备 7(采购2)当时 offline,未安装;APK 未上传到 Admin Agent 版本;Wiki 尚未更新;#333 线上采购员选设备效果、#331/#332 真机采购效果均未验证。
## 合并与部署(2026-09-22,用户授权“合并#331,#332,#333,部署”) - **main**:`0edc78a`(#332)→ `d8382e6`(#331)→ `3bf428a`(#333,由 `0ab5a96` cherry-pick)→ `36810f3`(Android 版本号 0.9.60 / versionCode 73)。 - **Server**:从 `3bf428a` 构建 linux/amd64,SHA-256 `01f59582cc037b2d9d5cd0ce0e9f7cbcaa57c4ba38d9f6f6eefcfc588a88a9b8`;新发布目录 `/home/goauto/releases/20260922-3bf428a-331-333`(config/dist 复制自上一发布 `20260922-5e0a9d1-328-330`,本批无 Web 改动;static/var 链接沿用上一发布);`current` 原子切换,`goauto.service` active,外部首页/健康检查 HTTP 200,未认证管理接口 401,重启后日志无 panic/fatal/1146/1054。发布前采购/采集运行中任务均为 0。回滚目标:`20260922-5e0a9d1-328-330`。 - **Android**:debug APK(commit `36810f3`,0.9.60/73,SHA-256 `c39569f92fc94cbc91f98489c25a5a860bcaff3de91b06518b895195d39e4877`)已安装到设备 8(采购1,192.168.0.173:34581),安装前该设备无待执行/运行任务;启动 Agent 后心跳恢复,服务端显示 online、agent_version 0.9.60。 - **未做**:设备 7(采购2)当时 offline,未安装;APK 未上传到 Admin Agent 版本;Wiki 尚未更新;#333 线上采购员选设备效果、#331/#332 真机采购效果均**未验证**。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#331