fix(android): 采购改地址流程等待控件就绪,避免标题先出现即判失败 #366
Open
opened 2026-10-08 10:00:41 +08:00 by ila
·
6 comments
No Branch/Tag Specified
main
fix/370-horizontal-grid
feat/372-export-shop
feat/378-heartbeat-diagnostics
feat/372-export-price
feat/372-list-export
fix/377-rejected-purchase-outbox
fix/376-pre-address-spec-verification
fix/374-final-spec-confirmation
fix/373-navigation-diagnostics
fix/370-color-discovery
feat/367-last-batch-repurchase
fix/368-image-search-partial-link
integration/364-365-366-main
feat/364-purchase-failure-snapshot
integration/365-366-validation
fix/365-order-result-observation
fix/366-address-editor-ready
fix/359-auto-match-resume
feat/363-inner-code-page-size
fix/362-truncated-spec-card
fix/361-spec-probe-click
docs/agents-worktree-rules
fix/358-syb-size-weight
feat/357-syb-cancel-status
feat/356-purchase-order-filter
fix/355-syb-list-timeout
feat/353-syb-shop-multiselect
fix/354-syb-top-pagination
fix/352-syb-source-created
fix/348-reveal-swipe
feat/340-syb-excluded-products
fix/351-inner-code-apply-selection
fix/350-match-layout
fix/350-inner-code-matching
feat/349-batch-return-use
feat/347-batch-return-cancel
feat/345-yeeke-reship
fix/346-root-serves-spa
fix/344-inner-code-stall-match
fix/343-syb-writeback-session
feat/339-syb-page-size
feat/338-return-match
feat/337-yeeke-admin-ui
feat/336-yeeke-return-sync
fix/335-bottom-submit-node
fix/334-spec-probe-top-swipe
fix/333-purchaser-device-owner
fix/331-spec-panel-recognition
fix/330-syb-writeback-session
feat/327-syb-writeback-filter
feat/326-order-information
fix/325-order-result
feat/316-chrome-order-backfill
fix/307-backfill-entry
feat/305-syb-order-writeback
feat/306-order-paid-amount
release/283
fix/283-purchase-mapping-consistency
fix/230-horizontal-spec-selection
feat/263-spec-rematch
fix/262-purchase-handoff
fix/260-261-purchase-readiness
fix/259-partial-collection-link
feat/258-one-click-replace
fix/257-color-normalized-match
fix/256-collection-single-dimension
fix/255-current-page-reidentify
feat/253-one-click-link
fix/254-match-loading
fix/251-syb-spec-candidates
feat/250-continuous-collection
fix/249-local-purchase-diagnostics
fix/248-bottom-submit
fix/247-short-address-panel
fix/246-address-return-panel
fix/245-purchase-failure-diagnostics
fix/244-selected-card-duplicates
fix/243-spec-entry-recovery
feat/242-agent-order-backfill
feat/241-order-backfill-endpoint
fix/239-syb-partial-sync
fix/238-spec-panel-preswipe
feat/237-client-api-keys
feat/236-purchaser-syb-sync
fix/235-syb-pagination-overlap
release/234-integrated
fix/229-address-entry-dedup
fix/228-selection-proof-panel-transition
fix/227-address-panel-return
fix/226-reopen-pdd-on-manual-retry
fix/225-in-place-purchase-retry
fix/224-final-spec-revalidation
fix/223-probed-confirmed-mapping
chore/221-devharness-sync
feat/218-purchase-result-bubble
fix/217-agent-retry-current-spec
fix/216-syb-spec-role-order
feat/215-mandatory-live-spec-probe
feat/214-verified-purchase-actions
fix/212-syb-sync-shop-snapshot
feat/211-spec-entry-ready-wait
feat/210-order-result-payment-transition
feat/209-pdd-bottom-spec-entry
feat/200-ai-match-result-purchase-ready
feat/199-job-execution-logs
feat/198-syb-ai-parse
feat/195-scheduled-spec-auto-match
fix/197-ai-write-timeout
feat/190-syb-inline-correction
fix/193-address-entry-reveal
feat/194-one-click-spec-match
fix/192-order-result-scroll
No results found.
Labels
No items
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: OPC/goauto#366
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
基本信息
代码事实与调查快照
7622795d97d4da3dd638619af99628b0352a42dd。android/app/src/main/java/cn/ilapage/goauto/agent/automation/PurchaseLiveAutomation.kt。现有等待逻辑(
PurchaseLiveAutomation.kt)通用
waitFor(约 682 行):最多 50 次采样,采样间暂停 200ms,另外还有截取与解析耗时;这是采样次数预算,不是严格的 10 秒或 15 秒墙钟超时。到期以指定错误码明确失败。pause(1_000),再waitFor页面出现 label 为「收货地址」的节点(约 134~137 行)PURCHASE_ADDRESS_PANEL_TIMEOUTwaitFor页面出现含「详细地址」的节点(约 512 行)PURCHASE_ADDRESS_EDIT_TIMEOUTwaitForStableAddressEditorExit(50 次采样,编辑框连续两次消失)+waitForSettledPanelAfterAddressSave(最多 5 秒)PURCHASE_ADDRESS_SAVE_TIMEOUTbackPurchase()后waitFor出现已保存地址且提交按钮唯一(约 533~536 行)PURCHASE_ADDRESS_SAVE_TIMEOUT「地址保存后无法返回订单页面」发现的问题
waitFor条件只要求页面出现「详细地址」文字;返回后立即shippingAddressEditors(edit),数量不为 1 就以PURCHASE_ADDRESS_UPDATE_FAILED「没有找到唯一的详细地址输入框」失败(约 515~516 行),不再等待。shippingAddressEditors要求 EditText 的 label 非空(约 761 行editor.label.isNotBlank())。若 PDD 先渲染标题、稍后才填入现有地址,此时一个输入框都匹配不到。inputFresh失败),可能与输入框未就绪有关。ADDRESS_CARD_GENERIC_LABELS,约 1054 行),条件可能在尚未离开规格面板时就成立,只靠前面固定的 1 秒兜底。editAndVerifyAddress后立即查找「修改」按钮,不唯一就以PURCHASE_ADDRESS_EDIT_AMBIGUOUS失败,不再等待。线上仅设备 8 在 09-21 出现 1 次,影响较小,但属于同类缺陷。restoreFinalEvidenceInCurrentPanel在面板内滚动查找新地址(最多 5 次);但环节④按返回后只被动等待,不滚动。若返回后面板的地址卡或提交按钮不在可视区,可能等满后失败。这只是推测,需现场证据。审核补充:不能将同源负向判断视为独立证据
isPurchaseConfirmationPanel(约 542~545 行)和finalSubmitTargets(约 812~824 行)均依赖PddScreenParser的面板类型;未识别为采购确认面板时,后者直接返回空。PURCHASE_ADDRESS_SAVE_TIMEOUT,不是返回动作直接失败的PURCHASE_ADDRESS_UPDATE_FAILED。这只支持失败发生在返回动作后的证据等待阶段;backPurchase()返回 true 不等于真实页面已经返回,不能由此认定只需补滚动。目标与范围
非目标
shippingAddressEditors的语义;不引入新接口、数据库迁移或新错误码。最小方案(②已实现;①仍为待验证设计)
② 修改按钮 → 地址编辑页:局部等待输入框真正就绪
structural:区域内可见 EditText 的去重数量,不因禁用或内容为空而排除。ready:上述结构候选中 enabled、实际text非空,且未被 hint 元数据标识为提示文字的数量;不使用contentDescription补充空值。structural == 1 && ready == 1才通过。保留现有暂停,不另加“先等标题、再等输入框”的第二轮预算。inputFresh的重新定位及单次输入。重新定位失败仍失败,不重试输入、不重复点击修改。titleSeen布尔值和最后一帧structural/ready计数,并用固定的 stage/reason 分类:PURCHASE_ADDRESS_EDIT_TIMEOUT。PURCHASE_ADDRESS_UPDATE_FAILED,区分原因。②审核补修:仅补齐真实输入值与 hint 防护(2026-10-08)
① 地址入口 → 地址列表:暂定识别方案,证据未闭合
pause(1_000),在现有单轮等待预算内等待下一步修改目标就绪,不新增点击、滑动或返回。addressModifyTargets能唯一消歧;保留多地址情况下“已设默认”的既有消歧路径和动作前的可操作性验证。“不是采购确认面板”“无提交目标”最多作为附加约束,不是独立或充分证据;单独缺少提交按钮不能判定进入地址列表。PURCHASE_ADDRESS_PANEL_TIMEOUT和已有PURCHASE_ADDRESS_EDIT_AMBIGUOUS等错误语义;缺失/歧义只附无敏感标量诊断,不扩展错误码。多地址中默认卡可唯一定位时继续;不能消歧时不操作。PddScreenParser、finalSubmitTargets或共享编辑框查询,避免牵动保存退出、返回及最终复核。证据缺口与发布条件
PurchaseLiveAutomationTest.kt约 821~826 行的 “panel” 是合成数据,不是真机证据。子项目影响、依赖与并行
PurchaseLiveAutomation的①②局部逻辑及受影响测试;本轮②补修另允许为内存SnapshotNode增加可选 hint 元数据及capture()的 API 26+ 读取,不改全局label或采集器业务逻辑;Server、Web、业务数据库、接口字段和错误码集合不变。设计证据
验收与回归测试(②自动化已执行;①及真机待验证)
② 可独立验证项
标题先出现,输入框延迟出现、先空后有值、先禁用后启用,均能在同一预算内等到就绪。
结构候选持续超过 3 次为多个,随后变唯一时正常通过;直到预算结束仍多候选则失败,期间不输入。
结构上有多个候选但仅一个 ready 时不能通过,不能因过滤禁用/空值节点掩盖歧义。
收货人/电话正常位于其他行时不计入目标;小屏或换行导致与详细地址区域重叠而无法唯一消歧时失败,不向错误字段输入。
无标题超时、曾有标题但末帧空树、零候选、空/禁用、多个候选分别验证现有错误码和最小诊断。
就绪判断与读取值来自同一帧;
inputFresh重定位漂移、无候选或歧义仍按既有失败处理,不重试写入。②审核补修:hint→真实值仅在真实值出现后输入;持续 hint / 空 text 仅 description 时等待后失败,禁止输入/保存;覆盖可选元数据缺失兼容。
① 待现场证据补齐后验证项
共同回归与交付
shippingAddressEditors未改,既有调用回归通过。风险与回退
文档影响
前轮交付记录(650f3a6 / 5314313;本轮补修记录见下)
650f3a6ba115bd22cdefef705eeab4535487cccd;Wiki 镜像提交5314313;分支fix/366-address-editor-ready已推送。android/app/build/outputs/apk/debug/app-debug.apk,6,412,438 字节;SHA-25647a2ee57b07f8c95a11b7f9bee6a8bd0392fa96123414c5d216476e678da0e0a。沿用 0.9.69 / versionCode 82,未升级版本号;以提交和哈希识别本轮产物。D:/OPC/goauto-worktrees/issue-366,分支未合并,按规则保留。harness.py check --strict因既有docs/evidence/pdd-home-35727-summary.md未登记镜像而失败,该文件在基线7622795已存在,本单未改;Wiki sync --check 独立通过。不能将仓库所有检查表述为全绿。审核补修交付(2026-10-08)
7fdfe04658d16a05ebcb016ee964a7263eb74802;Wiki 镜像提交d1996d2。工单分支fix/366-address-editor-ready已推送,未合并 main。./scripts/verify.ps1 -Component androidexit 0;test 耗时 9m49s,Debug / Release 各 51 suites、522 tests,0 failures / errors / skipped;assembleDebug 成功(4s)。root 独立回读本轮两套 XML、APK 哈希及干净 Git 状态,git diff --check 通过。保留已有编译警告,没有新增编译错误。b096c5a86f3ce0f9dbf3dc0591f7b5cf69f711c7,Android-Agent-API-Contract revisionf97ac6b8784fc200ee68e9e2eb4a1201296049f0;在线回读成功,随后一轮 sync + sync --check 共 17 页通过。android/app/build/outputs/apk/debug/app-debug.apk,6,823,074 bytes;SHA-2569c0461e9ed8f11d9f53541ff1a2cfa0de0e902b91422d411c2578a36bdf98837。沿用 0.9.69 / versionCode 82,未安装或发布。#365 + #366 集成验证结果(2026-10-08)
7622795d97d4da3dd638619af99628b0352a42dd。独立集成分支integration/365-366-validation已推送,最终提交d2083e71fbe70de2519e79eb631a1cd93af8c486。5206a6fd7d6666650f2d336e61655f4f647f7a9e,保留两个源分支全部提交:#365c55455d、#366d1996d2。生产代码自动合并无冲突;两份 Wiki 镜像冲突保留 #365 中已同步、包含两单说明的较新版本,3份镜像与c55455d完全一致,未手工改写长期文档。scripts/verify.ps1 -Component android退出0:Debug/Release各51 suites、535 tests,均0 failures/errors/skipped;test BUILD SUCCESSFUL 9m49s、assembleDebug 4s。主代理读取双variant XML核验,时间分别为2026-10-08 11:42、11:47(北京时间)。d2083e7(测试文件+71行,无生产变化):同一执行器经历4帧hint和第5帧真实值,地址等待>40秒后单次输入/保存/提交,再模拟4秒Back、第140帧才取得订单证据;断言Back完成后28~30秒仍成功、输入/保存/提交各一次、核单无额外点击/滑动/拉前台。gradlew.bat :app:testDebugUnitTest --tests cn.ilapage.goauto.agent.PurchaseLiveAutomationTest :app:testReleaseUnitTest --tests cn.ilapage.goauto.agent.PurchaseLiveAutomationTest:exit0,目标类Debug/Release各84项,0 failures/errors/skipped,新增用例在两份XML均存在。首次仅给末个task附--tests的命令筛选有歧义,精确中断后纠正命令;中断结果不计作通过。本轮未宣称新增用例后又重跑536项全量,实际证据是原组合全量535项+最终目标类84项双variant。assembleDebug成功;APK生产输入未变、哈希与全量构建相同。产物D:/OPC/goauto-worktrees/issue-365/android/app/build/outputs/apk/debug/app-debug.apk,6,824,084 bytes,SHA256e0155cb5266c8228598db6c45eda62d9f2a5dfd774f4a8bf71f0635f85f17b3c;版本仍0.9.69/82。2026-10-08 已授权合并 main(#364/#365/#366)
e450ac28989de6827328b411e4bdc050dded9ab3,远端回读一致。合并前main为5f45932;#364实现4581ee5,原#365/#366集成d2083e7,三单生产集成8c4940d。保留源分支及全部提交,无生产代码冲突,没有压缩或丢弃历史。D:/OPC/goauto-worktrees/issue-364/android/app/build/outputs/apk/debug/app-debug.apk,SHA256bf8ed021d2bfcc05d49eda54a7b40240a30eda2d1e93199c8dee408c052b1dbe。未安装或发布;若通过Admin分发需按后续发布流程处理版本号,不把同versionCode产物宣称自动更新已启用。②独立交付记录(2026-10-08,部分交付待验收)
按用户“做#366”授权,完成环节②;①证据缺口未闭合,未实施,整单保持 open。
实现与边界
验证
android/gradlew.bat :app:testDebugUnitTest --tests cn.ilapage.goauto.agent.PurchaseLiveAutomationTest:基线 44/44;新增 18 项后最终 RED 62 中 15 失败,最小实现后 GREEN 62/62。./scripts/verify.ps1 -Component android:exit 0,Debug / Release 各 51 suites、514 tests,均 0 failure / error / skipped;test 总耗时约 10m9s;assembleDebug 成功约 51s。耗时来自既有图搜测试真实时间等待,未修改或跳过。git diff --check通过。结构检查python dev_scripts/harness.py check --strict仍有基线既有的未登记证据镜像失败,详见正文,未扩大范围修复。C:/Users/Qiu/AppData/Local/Android/Sdk,未修改系统环境、安装 SDK 或接受新许可证。Wiki 与产物
未验证与停止边界
环节② 交付审核(2026-10-08,Claude Code,用户要求补充)
审核对象:分支
fix/366-address-editor-ready,基线7622795,实现650f3a6,HEAD5314313(含 Wiki 镜像)。依据 SynapBus #95/#96 与评论 8968。只读审核,未运行测试,未改动 worktree。结论
大部分达标,但存在 1 个 Important 问题(hint 文字可能被当作现有地址)。修复并补测试前,不具备合并条件。 环节①仍缺真实地址列表证据,未实施;真机未验证。
已核对达标
PurchaseLiveAutomation.kt新增waitForInitialAddressEditor()(约 538~572 行)并替换原 512~516 行的判断;共用shippingAddressEditors()、①③④、采集/下单/核单、Server/Web/DB、版本号均未改。repeat(50)+pause(200);无「三次多候选提前失败」,无「先等标题再等输入框」的两轮等待。structural == 1 && ready == 1才通过;结构多候选、仅一个 ready 时不会放行。inputFresh目标使用同一采样帧的节点;inputFresh失败不重试;每次采样仍先执行pageProblem。titleSeen跨帧累计,配合末帧 structural/ready 和固定 reason;不含地址、人名、电话。未见标题报PURCHASE_ADDRESS_EDIT_TIMEOUT,其余报PURCHASE_ADDRESS_UPDATE_FAILED。Important:输入框显示 hint 时可能被当作已就绪,写入错误地址
PurchaseLiveAutomation.kt约 557 行readyCount = structural.count { it.enabled && it.label.isNotBlank() };label来自GoAutoAccessibilityService.capture()(约 241 行)只读取的node.text/contentDescription。TextView在内容为空时,getTextForAccessibility()会返回 hint,因此空输入框的无障碍text可能是提示文字(例如「如街道、门牌号等」),被判为非空、ready。_cg{taskId}」并保存;label == expected)和最终复核(检查任务后缀)都会通过,可能真实下单到错误的详细地址。capture()为节点新增可选字段hintText、showingHintText(API 26+ 使用AccessibilityNodeInfo.getHintText()/isShowingHintText()),默认 null,不改变现有使用方。showingHintText == true,以及label == hintText的输入框。Minor
未验证
评论 8969 Important 最小补修完成(2026-10-08,②部分交付待验收)
按用户“按照你的建议最小补齐”授权,已实现并推送代码
7fdfe04658d16a05ebcb016ee964a7263eb74802、Wiki 镜像d1996d28ee844ff5f8f98287ba93f7e40cb30681。本条是本轮最新交付记录,前轮评论 8968 的测试数/APK 仅代表前轮产物。
#365 + #366 集成验证开始(2026-10-08)
用户授权“做#365和#366的集成验证”。已刷新远端main,基线仍为
7622795;源分支分别为c55455d与d1996d2。仅组合#365与#366已交付②/hint保护,不实施#366①,不改③④。计划:复用干净的issue-365隔离工作区,建立独立
integration/365-366-validation分支,保留两条原工单分支;机械合并后检查同文件冲突/测试完整性,执行目标回归、Android Debug/Release全量单元测试及APK构建,独立审核并回写证据。必要时仅补集成测试;不扩大生产代码范围。不合并main、不安装或操作手机、不改地址/下单/付款、不更新Admin/迁移/发布。本轮无新增长期文档规则:保留已批准的Wiki镜像,纯集成验证结果回写两张工单,不重复修改Wiki或同步。
#365 + #366 集成验证通过,完整证据已追加正文。集成分支
integration/365-366-validation已推送:机械集成5206a6f,跨阶段回归d2083e7。组合全量 Debug/Release 各535项通过,新增跨阶段测试后目标类两variant各84项通过,最终APK构建成功,规格/质量复核无阻断。未合并main、未装机或发布;#366仅②/hint保护,①仍待证据,③④不改。工单保持待验收,不关闭。已按用户授权合并并推送main
e450ac28989de6827328b411e4bdc050dded9ab3,正文已整合实现/验证及边界。三单组合Android Debug/Release各564项全部通过,APK构建通过;Server六个受影响包/构建和Web13项mock回归/构建通过。#366只合入②/hint保护,①待证据;#364真机诊断闭环仍待验。本次未部署、未执行线上迁移/重启、未安装手机。各项未验证与基线检查失败已明确记录,工单保持打开。