回填扫描被 WebView 中间帧硬中止 #313

Open
opened 2026-09-18 14:11:32 +08:00 by ila · 1 comment
Owner

原始需求

用户 2026-09-18:「agent回填还是失败。确定可以做吗不可以做就换成电脑浏览器登录pdd来获取」。

事实(真机 192.168.0.173:38881,0.9.59,2026-09-18)

Agent 回填结果:已检查 0 · 成功 0 · 已回填 0 · 冲突/失败 0,「返回后未识别全部订单列表,未完整扫描」。

OrderBackfillWindow.observe() 的 checked++ 无条件执行,checked == 0 证明一张卡片都没被打开过,失败发生在列表阶段,与 #311/#312 的详情页读取无关。

现场抓到对应的中间帧:订单列表第一张卡片整棵子树塌成零高度——商品图 [33,258][93,258]、店铺名 [114,258][399,258]、商品标题 [291,258][876,258],而第二、三张卡片布局正常。WebView 尚未完成重排。

扫描循环在 scroll() 与 back() 之后都用 read() 立即取一帧,check(listReady(page)) 单帧不合格即抛错终止。两类中间帧都会命中:标签栏尚未渲染的空列表帧;back() 后仍含「订单编号」的详情页残帧(detail() 为真使 allTab() 返回 null)。

awaitOrders() 本来就是为等待稳定写的,但只在启动阶段用过。

方案

  • 循环内两处 page = read() 改为 page = awaitOrders():要求连续两帧签名一致,最多 8 次,仍不稳定才报超时。
  • awaitOrders() 的稳定签名补入可见非零高度节点数。标签栏坐标在重排期间不变,只看它会立刻「稳定」并返回一个卡片尚未布局完成的帧。

判据与安全边界不变,只是把「单帧不合格即终止」改为「重取到稳定帧」。

验收

  • 新增用例:back() 后先给一帧详情页残帧、一帧标签栏未渲染的空列表,扫描仍完成并读出订单。
  • 旧写法下该用例必须红。
  • 真机回填读到订单编号与下单时间。

风险与回退

中间帧持续 8 次仍不稳定时报「等待订单列表加载超时」,比原先的错误信息更准确,不会静默少读。回退即还原两处调用与签名。

文档影响

无长期文档影响:未改入口、配置、接口和状态机。

## 原始需求 用户 2026-09-18:「agent回填还是失败。确定可以做吗不可以做就换成电脑浏览器登录pdd来获取」。 ## 事实(真机 192.168.0.173:38881,0.9.59,2026-09-18) Agent 回填结果:**已检查 0 · 成功 0 · 已回填 0 · 冲突/失败 0,「返回后未识别全部订单列表,未完整扫描」**。 `OrderBackfillWindow.observe()` 的 `checked++` 无条件执行,`checked == 0` 证明**一张卡片都没被打开过**,失败发生在列表阶段,与 #311/#312 的详情页读取无关。 现场抓到对应的中间帧:订单列表第一张卡片整棵子树塌成零高度——商品图 `[33,258][93,258]`、店铺名 `[114,258][399,258]`、商品标题 `[291,258][876,258]`,而第二、三张卡片布局正常。WebView 尚未完成重排。 扫描循环在 `scroll()` 与 `back()` 之后都用 `read()` 立即取一帧,`check(listReady(page))` 单帧不合格即抛错终止。两类中间帧都会命中:标签栏尚未渲染的空列表帧;`back()` 后仍含「订单编号」的详情页残帧(`detail()` 为真使 `allTab()` 返回 null)。 `awaitOrders()` 本来就是为等待稳定写的,但只在启动阶段用过。 ## 方案 - 循环内两处 `page = read()` 改为 `page = awaitOrders()`:要求连续两帧签名一致,最多 8 次,仍不稳定才报超时。 - `awaitOrders()` 的稳定签名补入可见非零高度节点数。标签栏坐标在重排期间不变,只看它会立刻「稳定」并返回一个卡片尚未布局完成的帧。 判据与安全边界不变,只是把「单帧不合格即终止」改为「重取到稳定帧」。 ## 验收 - 新增用例:`back()` 后先给一帧详情页残帧、一帧标签栏未渲染的空列表,扫描仍完成并读出订单。 - 旧写法下该用例必须红。 - 真机回填读到订单编号与下单时间。 ## 风险与回退 中间帧持续 8 次仍不稳定时报「等待订单列表加载超时」,比原先的错误信息更准确,不会静默少读。回退即还原两处调用与签名。 ## 文档影响 无长期文档影响:未改入口、配置、接口和状态机。
Author
Owner

实施

提交 9ce17a2(deploy-main)。

  • 扫描循环内 scroll() 与 back() 之后的两处 read() 改为 awaitOrders()。
  • awaitOrders() 稳定签名补入可见非零高度节点数。

验证

  • 单测 406 通过 0 失败。
  • 反证:还原 back() 后的 read(),新增用例 transient frames after scroll and back never abort the scan 变红。
  • 已装机 192.168.0.173:38881,0.9.59,lastUpdateTime 2026-09-18 14:11:48,无障碍服务仍开启。

未验证

真机回填能否完整跑完并读到订单编号与下单时间——待人工触发一次回填。

状态:待验收。

## 实施 提交 `9ce17a2`(deploy-main)。 - 扫描循环内 `scroll()` 与 `back()` 之后的两处 `read()` 改为 `awaitOrders()`。 - `awaitOrders()` 稳定签名补入可见非零高度节点数。 ## 验证 - 单测 406 通过 0 失败。 - 反证:还原 `back()` 后的 `read()`,新增用例 `transient frames after scroll and back never abort the scan` 变红。 - 已装机 192.168.0.173:38881,0.9.59,lastUpdateTime 2026-09-18 14:11:48,无障碍服务仍开启。 ## 未验证 真机回填能否完整跑完并读到订单编号与下单时间——待人工触发一次回填。 状态:待验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#313