From 13b1580fd5cb2ac78a9ddb0c2a3048f7ac4baff6 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Thu, 3 Sep 2026 16:01:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(agent):=20=E5=9B=9E=E4=BC=A0=E8=A7=84?= =?UTF-8?q?=E6=A0=BC=E9=9D=A2=E6=9D=BF=E5=A4=B1=E8=B4=A5=E8=AF=81=E6=8D=AE?= =?UTF-8?q?=20(#206)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../automation/PurchaseRehearsalExecutor.kt | 2 +- .../agent/PurchaseRehearsalExecutorTest.kt | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PurchaseRehearsalExecutor.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PurchaseRehearsalExecutor.kt index 20b08dc..368aa37 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PurchaseRehearsalExecutor.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PurchaseRehearsalExecutor.kt @@ -295,7 +295,7 @@ class PurchaseRehearsalExecutor( if (screen.specPanelOpen) return null pause(100) } - return failure(SPEC_PANEL_NOT_OPENED, "点击后未识别到商品规格面板") + return failure(SPEC_PANEL_NOT_OPENED, "点击后未识别到商品规格面板 [${panelEvidence(screen)}]") } private fun panelEvidence(screen: ParsedPddScreen): String = diff --git a/android/app/src/test/java/cn/ilapage/goauto/agent/PurchaseRehearsalExecutorTest.kt b/android/app/src/test/java/cn/ilapage/goauto/agent/PurchaseRehearsalExecutorTest.kt index 30cee83..28393d9 100644 --- a/android/app/src/test/java/cn/ilapage/goauto/agent/PurchaseRehearsalExecutorTest.kt +++ b/android/app/src/test/java/cn/ilapage/goauto/agent/PurchaseRehearsalExecutorTest.kt @@ -428,6 +428,20 @@ class PurchaseRehearsalExecutorTest { assertEquals(0, driver.swipeCount) } + @Test + fun `unrecognized opened panel returns only scalar panel evidence`() { + val driver = FakePurchaseDriver(unrecognizedPanel = true) + val outcome = PurchaseRehearsalExecutor(driver, { driver.browser = true; true }, { null }, pause = {}) + .execute(input(), PurchaseRuleParser.parse(rule()), PurchaseAgentCapabilities.supported) + + assertEquals("PURCHASE_SPEC_PANEL_NOT_OPENED", outcome.errorCode) + assertEquals( + "点击后未识别到商品规格面板 [type=UNKNOWN;scrollables=0;headings=0;options=0;summary=false;quantity=false;orderAction=false;pageEvidence=true]", + outcome.message, + ) + assertFalse(outcome.message.orEmpty().contains("确认款式")) + } + @Test fun `transient sold out page recovers before opening specs`() { val driver = FakePurchaseDriver(soldOut = true, recoverSoldOutAfterPull = true) @@ -743,6 +757,7 @@ class PurchaseRehearsalExecutorTest { private val unavailableSizes: Set = emptySet(), allSpecsUnavailable: Boolean = false, private val nonScrollablePanel: Boolean = false, + private val unrecognizedPanel: Boolean = false, private val purchaseSwipeSucceeds: Boolean = true, ) : PurchaseUiDriver { var browser = false @@ -802,6 +817,12 @@ class PurchaseRehearsalExecutorTest { if (includeReviewEntry) nodes += node("review", "商品评价", 20, 1200, 900, 1300, clickable = true) return UiSnapshot(PDD, ACTIVITY, nodes) } + if (unrecognizedPanel) { + return UiSnapshot(PDD, ACTIVITY, listOf( + node("content", "", 0, 0, 1080, 2200), + node("panel-title", "确认款式", 20, 396, 300, 430), + )) + } val hideColor = hideColorAfterQuantitySet && quantity == 2L val hideSize = hideSizeAfterQuantitySet && quantity == 2L val hideSummary = hideSelectedSummaryAfterQuantitySet && quantity == 2L