Files
cmautobuy/docs/task/263-增强双微信系统选择器识别并安全返回PDD.md
T
2026-08-18 10:11:41 +08:00

3.8 KiB

263 增强双微信系统选择器识别并安全返回 PDD

背景与目标

真实采购提交订单后按设计进入只读核单。真机显示两个微信候选的 Android 应用选择器时,#261 的识别没有命中,代码尝试启动 PDD 后仍被选择器覆盖,最终以 RECONCILE_ORDER_PAGE_TIMEOUT 转人工。

本任务增强选择器识别,兼容混合节点包名、重复无障碍值和 Android Resolver 变体;证据完整时仍只按一次返回键,绝不选择微信、点击支付或重新下单。

最终方案

  • 分别读取每个节点的 text 和 content-desc,不再使用拼接标签做精确判断。
  • 使用白名单标题和以“微信”开头的候选名称识别页面语义,兼容微信分身的显示名称差异。
  • 页面语义命中后读取 app_current(),同时校验 Android 标准 Resolver 包和 ChooserActivity / ResolverActivity 精确值或安全后缀。
  • 选择器判断先于 PDD 控件树判断,兼容选择器与底层 PDD 节点同时出现在控件树中的情况。
  • 可信选择器最多按一次返回;一次返回后仍存在时返回 RECONCILE_ANDROID_CHOOSER_STUCK,前台系统组件不可信时返回 RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED。
  • 保留原外部应用恢复、登录/验证/风控停止和 PDD 支付页一次返回规则。

最终实现与建单方案一致,没有修改订单提交、PURCHASE_OUTCOME_UNKNOWN、数据库、Admin 接口或存量任务。

改了哪些

  • client/src/pdd_u2_purchase_reconcile_adapter.py:重构选择器语义和前台组件证据,调整判断顺序并保留一次返回门禁。
  • client/test/test_pdd_u2_purchase_reconcile_adapter.py:增加混合包名、重复 text/content-desc、微信名称变体和独立 Resolver 包测试。
  • docs/client/06-quality-security.md:同步多微信选择器的组合证据及安全返回规则。

验收结果

验收标准 结果
混合节点包名和底层 PDD 节点存在时仍识别选择器 通过
text/content-desc 重复时仍识别标题和微信候选 通过
Android 标准 Resolver 包、标题和 Activity 变体通过 通过
前台 package/activity 不可信时停止且不按返回 通过
未知系统页面不触发返回,普通外部跳转保持兼容 通过
一次返回后选择器仍存在时停止,不重复返回 通过
不选择微信、不点击支付、不重新下单或付款 通过

测试

  • 执行的命令:
    • C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_reconcile_adapter.py test/test_pdd_u2_purchase_reconcile_adapter.py
    • C:/Python310/python.exe -m pytest -q --disable-warnings test/test_pdd_u2_purchase_reconcile_adapter.py test/test_purchase_recovery.py test/test_purchase_task_service.py
    • C:/Python310/python.exe -m pytest -q test
    • 设置 QT_QPA_PLATFORM=offscreen 后创建 MainWindow。
  • 结果:语法检查通过;定向测试 47 项全部通过;完整 Client 测试 513 项通过、2 项与本工单无关的既有版本号断言失败;离屏界面冒烟输出 OK。
  • 没验证到的部分:未连接真机执行继续核单。诊断时 ADB 服务因客户端版本不一致自动重启,设备当前需要重新确认调试授权;没有重新提交订单、触发支付或修改 cg46 数据。

遗留问题

  • 真机确认 ADB 调试授权后,需要通过 #262 的同一入口对已提交订单执行一次“继续核单”验收。
  • 工作区 Client 版本为 0.1.2,两项更新模块测试仍固定期待 0.1.0,不属于本工单范围。

相关提交

  • 2a0c17a 增强双微信选择器识别。