Client:兼容不暴露滚动属性的PDD规格面板 #154

Closed
opened 2026-08-11 14:57:27 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / Client 可运行任务闭环
  • 阶段:PDD 规格面板兼容
  • 状态:进行中

要解决什么

Client 采集商品 https://mobile.yangkeduo.com/goods.html?goods_id=897186799891 时返回:

SKU_PANEL_NOT_FOUND:点击规格入口后,等待规格面板加载超时

失败诊断 XML 证明规格面板已经打开,包含“确认款式”“已选择”“颜色分类”“尺码”、5 个颜色、1 个尺码、价格和底部“确定”按钮;但该新版自绘面板所有节点均为 scrollable=false。

当前 _is_spec_panel_open 和 parse_spec_panel 都把可滚动节点作为必要条件,因此已打开的面板被误判为未加载,等待 10 秒后超时。若只移除该条件,“确认款式”又会被现有标题规则错误识别成“款式”规格维度。

做什么 / 不做什么

  • 做:兼容不暴露 scrollable=true 的规格面板,使用多项强证据确认面板已打开。
  • 做:从规格标题及其公共父容器确定非滚动面板范围,继续复用现有规格选项解析。
  • 做:排除“确认款式”等面板标题,避免生成虚假的款式维度。
  • 做:以第一个真实规格标题作为价格区边界,正确解析面板头部价格。
  • 做:增加脱敏 XML 固件及等待、解析回归测试。
  • 不做:不增加固定等待时间;不放宽为单一文字命中;不修改颜色蛇形遍历、尺码滚动、任务状态、Admin 接口或采购下单逻辑。
  • 不做:不使用真实设备执行采购或下单。

已确认的实现方案

  1. 在 client/src/pdd_collect_service.py 增加统一的规格面板容器定位函数。
  2. 优先沿用现有最大可滚动容器;没有可滚动容器时,只有同时满足以下强证据才启用兼容路径:
    • 存在面板标题或关闭入口;
    • 存在“已选择/请选择”摘要;
    • 存在至少一个真实规格标题;
    • 存在面板底部确认入口。
  3. 非滚动容器从真实规格标题和确认入口的共同祖先中选择有效、有界且覆盖规格区域的最小容器,不能把整个窗口当作面板。
  4. 标题识别显式排除“确认款式”,并保持颜色、尺码等现有标题兼容。
  5. 价格解析的纵向边界使用第一个真实规格标题顶部;没有标题时才使用容器顶部。
  6. 使用本次真实结构制作脱敏固件,断言:面板判定成功,只得到颜色和尺码两个维度,颜色 5 个、尺码 1 个,价格可解析;等待函数不再超时。
  7. 保留现有验证码、登录页和普通商品页拒绝测试,防止误判。

预计修改:

  • client/src/pdd_collect_service.py
  • client/test/test_pdd_collect_service.py
  • client/test/fixtures/ 下新增脱敏非滚动面板 XML
  • 完成后归档 docs/task/<工单号>-兼容非滚动规格面板.md

验收标准

  • 本次非滚动规格面板 XML 被识别为已打开,不再等待超时。
  • 解析结果只有“颜色分类”和“尺码”两个维度,不把“确认款式”当规格维度。
  • 颜色 5 个、尺码 1 个,已选摘要与券后价格正确。
  • 普通商品页、登录页、验证码页不会被兼容规则误判为规格面板。
  • 现有可滚动规格面板、带数量标题、颜色价格和尺码采集测试继续通过。
  • 不通过增加 sleep 或扩大超时时间掩盖问题。
  • Client 精确测试、完整 unittest 与 py_compile 通过。

验证方式

从 client/ 执行:

C:/Python310/python.exe -m unittest test.test_pdd_collect_service
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
C:/Python310/python.exe -m py_compile src/pdd_collect_service.py

本任务使用脱敏 XML 固件验证,不执行真实下单。

风险和回退

  • 风险:兼容条件过松会把���品详情页误判成规格面板,因此必须使用多项强证据并保留负向测试。
  • 风险:选择过大的父容器会把数量、图片和确定按钮解析成规格选项,因此必须限制真实规格标题之间的选项区域,并排除面板标题。
  • 回退:恢复本工单代码提交即可;不涉及数据库迁移、任务数据修复或不可逆采购操作。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 / Client 可运行任务闭环 - 阶段:PDD 规格面板兼容 - 状态:进行中 ## 要解决什么 Client 采集商品 `https://mobile.yangkeduo.com/goods.html?goods_id=897186799891` 时返回: `SKU_PANEL_NOT_FOUND:点击规格入口后,等待规格面板加载超时` 失败诊断 XML 证明规格面板已经打开,包含“确认款式”“已选择”“颜色分类”“尺码”、5 个颜色、1 个尺码、价格和底部“确定”按钮;但该新版自绘面板所有节点均为 `scrollable=false`。 当前 `_is_spec_panel_open` 和 `parse_spec_panel` 都把可滚动节点作为必要条件,因此已打开的面板被误判为未加载,等待 10 秒后超时。若只移除该条件,“确认款式”又会被现有标题规则错误识别成“款式”规格维度。 ## 做什么 / 不做什么 - 做:兼容不暴露 `scrollable=true` 的规格面板,使用多项强证据确认面板已打开。 - 做:从规格标题及其公共父容器确定非滚动面板范围,继续复用现有规格选项解析。 - 做:排除“确认款式”等面板标题,避免生成虚假的款式维度。 - 做:以第一个真实规格标题作为价格区边界,正确解析面板头部价格。 - 做:增加脱敏 XML 固件及等待、解析回归测试。 - 不做:不增加固定等待时间;不放宽为单一文字命中;不修改颜色蛇形遍历、尺码滚动、任务状态、Admin 接口或采购下单逻辑。 - 不做:不使用真实设备执行采购或下单。 ## 已确认的实现方案 1. 在 `client/src/pdd_collect_service.py` 增加统一的规格面板容器定位函数。 2. 优先沿用现有最大可滚动容器;没有可滚动容器时,只有同时满足以下强证据才启用兼容路径: - 存在面板标题或关闭入口; - 存在“已选择/请选择”摘要; - 存在至少一个真实规格标题; - 存在面板底部确认入口。 3. 非滚动容器从真实规格标题和确认入口的共同祖先中选择有效、有界且覆盖规格区域的最小容器,不能把整个窗口当作面板。 4. 标题识别显式排除“确认款式”,并保持颜色、尺码等现有标题兼容。 5. 价格解析的纵向边界使用第一个真实规格标题顶部;没有标题时才使用容器顶部。 6. 使用本次真实结构制作脱敏固件,断言:面板判定成功,只得到颜色和尺码两个维度,颜色 5 个、尺码 1 个,价格可解析;等待函数不再超时。 7. 保留现有验证码、登录页和普通商品页拒绝测试,防止误判。 预计修改: - `client/src/pdd_collect_service.py` - `client/test/test_pdd_collect_service.py` - `client/test/fixtures/` 下新增脱敏非滚动面板 XML - 完成后归档 `docs/task/<工单号>-兼容非滚动规格面板.md` ## 验收标准 - [ ] 本次非滚动规格面板 XML 被识别为已打开,不再等待超时。 - [ ] 解析结果只有“颜色分类”和“尺码”两个维度,不把“确认款式”当规格维度。 - [ ] 颜色 5 个、尺码 1 个,已选摘要与券后价格正确。 - [ ] 普通商品页、登录页、验证码页不会被兼容规则误判为规格面板。 - [ ] 现有可滚动规格面板、带数量标题、颜色价格和尺码采集测试继续通过。 - [ ] 不通过增加 sleep 或扩大超时时间掩盖问题。 - [ ] Client 精确测试、完整 unittest 与 py_compile 通过。 ## 验证方式 从 `client/` 执行: ```powershell C:/Python310/python.exe -m unittest test.test_pdd_collect_service C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" C:/Python310/python.exe -m py_compile src/pdd_collect_service.py ``` 本任务使用脱敏 XML 固件验证,不执行真实下单。 ## 风险和回退 - 风险:兼容条件过松会把���品详情页误判成规格面板,因此必须使用多项强证据并保留负向测试。 - 风险:选择过大的父容器会把数量、图片和确定按钮解析成规格选项,因此必须限制真实规格标题之间的选项区域,并排除面板标题。 - 回退:恢复本工单代码提交即可;不涉及数据库迁移、任务数据修复或不可逆采购操作。
Author
Owner

实施结果

  • 增加非滚动自绘规格面板的强证据定位:面板提示、已选/请选择摘要、真实规格标题、可点击确定入口必须同时存在,并排除覆盖 95% 以上窗口的公共祖先。
  • 明确排除“确认款式/確認款式”面板标题,避免生成虚假款式维度。
  • 非滚动面板优先使用其有界公共父容器;容器内若有滚动节点仍沿用原解析。
  • 价格分界改为第一个真实规格标题顶部,兼容面板头部券后价格。
  • 新增脱敏固件和 4 项回归,普通商品页及散落在全窗口的相似文字不会误判。
  • 本次真实失败 XML 只读复验:panel_open=true,颜色 5、尺码 1,price_cent=817,已选摘要存在。
  • 精确采集服务测试 40 项通过;Client 完整 394 项通过;py_compile 通过。
  • 未执行真机重新采集,也未执行采购或下单。
  • 实现提交:fee8210。
## 实施结果 - 增加非滚动自绘规格面板的强证据定位:面板提示、已选/请选择摘要、真实规格标题、可点击确定入口必须同时存在,并排除覆盖 95% 以上窗口的公共祖先。 - 明确排除“确认款式/確認款式”面板标题,避免生成虚假款式维度。 - 非滚动面板优先使用其有界公共父容器;容器内若有滚动节点仍沿用原解析。 - 价格分界改为第一个真实规格标题顶部,兼容面板头部券后价格。 - 新增脱敏固件和 4 项回归,普通商品页及散落在全窗口的相似文字不会误判。 - 本次真实失败 XML 只读复验:panel_open=true,颜色 5、尺码 1,price_cent=817,已选摘要存在。 - 精确采集服务测试 40 项通过;Client 完整 394 项通过;py_compile 通过。 - 未执行真机重新采集,也未执行采购或下单。 - 实现提交:`fee8210`。
Author
Owner

完成与归档

  • 实现提交:fee8210 fix: 兼容非滚动PDD规格面板 (#154)
  • 归档提交:3c26cf4 docs: 归档任务 #154
  • 本地归档:docs/task/154-兼容非滚动规格面板.md
  • 当前状态:代码、真实 XML 复验、完整回归和归档均已完成,等待用户使用真机重新采集该商品验收。

未验证:未在真机重新执行商品 897186799891,未执行采购或真实下单。

## 完成与归档 - 实现提交:`fee8210` `fix: 兼容非滚动PDD规格面板 (#154)` - 归档提交:`3c26cf4` `docs: 归档任务 #154` - 本地归档:`docs/task/154-兼容非滚动规格面板.md` - 当前状态:代码、真实 XML 复验、完整回归和归档均已完成,等待用户使用真机重新采集该商品验收。 未验证:未在真机重新执行商品 `897186799891`,未执行采购或真实下单。
Author
Owner

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:ad44f83。现关闭工单。

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:`ad44f83`。现关闭工单。
ila closed this issue 2026-08-13 15:58:01 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#154