4.5 KiB
4.5 KiB
28 实现 uiautomator2 设备连接与 PDD 商品采集基础服务
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:#2 / MVP
- 状态:已完成,用户验收通过
- 日期:2026-08-07
- Gitea 工单:#28
背景与目标
Client 原来只有实验脚本和几个独立控件树工具,没有正式的 uiautomator2 设备连接边界,也没有可供后续任务引擎调用的商品采集入口。
本任务建立不依赖 Qt、SQLite 和 Admin 的 PDD 采集适配层。它负责独占连接一台已保存设备,打开商品页,并返回符合 pdd_data v1 的结构化数据。
最终方案
PddDeviceService.connect(serial)返回上下文管理的设备会话。- 同一个服务同时只允许一个活动会话;Device 只能在创建会话的线程使用。
PddCollectService.collect(task)接收至少包含goods_url的任务对象,返回CollectResult。- 打开页面前校验 PDD 域名、数字商品编号以及任务编号与链接编号是否一致。
- 商品页滚动收集标题、店铺、已拼数量和评价数量;数量保留整数、原文和近似标记。
- 规格面板从当前位置横向、纵向分别扫描两个方向,不假设初始位置在列表起点。
- 规格使用通用
dimensions;颜色、尺码使用可读键,其他维度使用由名称生成的稳定键。 - 枚举规格组合,每个组合重新选择规格、读取当前价格并确认“已选”摘要;金额使用人民币分整数。
- 标题、店铺、销量、评价、规格或可用价格缺失时停止并返回结构化错误,不返回不完整成功结果。
- 区分设备地址无效、占用、离线、连接失败、跨线程访问、页面超时、登录失效、验证码、XML 错误、规格缺失和价格缺失。
- 不连接 Qt 事件,不写数据库,不请求 Admin,也不执行采购、下单或付款。
与建单方案相比,商品页等待没有直接复用 util/loaded_pdd.py。旧函数只能返回 True/False,无法区分超时、登录和验证码,也没有取消检查;正式服务保留了简单轮询,但改为结构化错误和可注入时钟。规格入口继续复用 util/get_size_panle_coord.py。
改了哪些文件
client/src/pdd_device_service.py:设备连接、独占会话和线程所有权检查。client/src/pdd_collect_service.py:商品页等待、XML 解析、规格扫描、SKU 采集和结果组装。client/test/test_pdd_device_service.py:设备连接、释放、错误分类和跨线程访问测试。client/test/test_pdd_collect_service.py:数量、商品页、规格、错误和完整采集流程测试。client/test/fixtures/pdd_goods_page.xml:脱敏商品页最小固件。client/test/fixtures/pdd_spec_panel.xml:脱敏规格面板最小固件。
验收结果
| 验收标准 | 结果 |
|---|---|
| 使用传入设备号连接,不硬编码 IP、链接或路径 | 通过 |
正式代码不导入 demo1 |
通过 |
| Device 单线程独占且会话可释放 | 通过 |
| 返回商品、店铺、数量、通用规格和 SKU 价格关系 | 自动测试通过 |
| 金额使用分整数,数量保留原文和近似标记 | 通过 |
| 校验 PDD 链接及商品编号一致性 | 通过 |
| 结构化区分主要设备、页面和数据错误 | 通过 |
| XML 解析和主要错误分支不依赖真机测试 | 通过 |
| 不接 Qt、SQLite、Admin、采购和下单 | 通过 |
| 真机打开测试商品并输出脱敏结果 | 待用户真机验收 |
测试
从 client 目录执行:
C:/Python310/python.exe -m pytest test -q --tb=short --disable-warnings
C:/Python310/python.exe -m compileall -q src test
并在项目根目录对本任务文件执行 git diff --check。
- 结果:Client 全量 118 项测试通过,其中 #28 新增 16 项;语法编译和差异检查通过。
- 使用工作区已有 XML 做了只读兼容性检查,能够解析三份商品页标题和销量,以及三份规格面板的当前价格和可见颜色/尺码;这些含真实页面信息的文件没有加入提交。
- 没验证到的部分:尚未在真机执行完整
collect;因此未验证真实 PDD 版本中的滚动终点、店铺与评价所在位置、隐藏规格全集、动态库存、全部 SKU 组合价格、登录页和验证码页。未执行采购或下单。
相关提交
4aff22cfeat: 实现 PDD 商品采集基础服务 (#28)f1c2700fix: 校验 PDD 采集商品链接 (#28)