From 1bf676e57fb02dffa242d19bf0460a9658276d91 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Mon, 17 Aug 2026 16:37:46 +0800 Subject: [PATCH] fix(#26): ignore reflowed completed color rows --- .../automation/PddProductDetailCollector.kt | 7 +++++- .../agent/PddProductDetailCollectorTest.kt | 25 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddProductDetailCollector.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddProductDetailCollector.kt index e3a0be5..aa98e62 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddProductDetailCollector.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddProductDetailCollector.kt @@ -531,7 +531,12 @@ class PddProductDetailCollector( screen.dimensions.filter { it.key == "unsupported" }.forEach { unsupported += it.name } val rows = colorRows(screen) if (rowIndex >= rows.size) { - missing += "colorRow:${rowIndex + 1}" + // Some PDD builds remove the selected option from the + // clickable accessibility nodes and immediately reflow + // the remaining options. A row disappearing after a + // successful selection is therefore not evidence that + // its values were missed. Real gaps are still reported + // below as missing colors or prices. break } currentRow = rows[rowIndex].sortedBy { it.node.bounds.left } diff --git a/android/app/src/test/java/cn/ilapage/goauto/agent/PddProductDetailCollectorTest.kt b/android/app/src/test/java/cn/ilapage/goauto/agent/PddProductDetailCollectorTest.kt index a9c8845..b023903 100644 --- a/android/app/src/test/java/cn/ilapage/goauto/agent/PddProductDetailCollectorTest.kt +++ b/android/app/src/test/java/cn/ilapage/goauto/agent/PddProductDetailCollectorTest.kt @@ -343,6 +343,26 @@ class PddProductDetailCollectorTest { assertTrue(driver.swipes.any { it.first == SwipeDirection.UP && it.second != null }) } + @Test + fun selectedColorsDisappearingAndReflowingDoNotCreateFalseMissingRows() { + val colors = listOf("A色", "B色", "C色") + val driver = FakeCollectorDriver( + colors = colors, + prices = colors.associateWith { 1000L }, + rowSize = 2, + hideSelectedColorOption = true, + ) + var clock = 0L + + val result = PddProductDetailCollector(driver, { clock }, { clock += it }).collect(GOODS_ID, rule()) + + assertTrue(result.successful) + val payload = requireNotNull(result.payload) + assertEquals("completed", payload.status) + assertEquals(colors, payload.colorPrices.map { it.color }) + assertTrue(payload.missing.none { it.startsWith("colorRow:") }) + } + @Test fun sizesContinueAfterHeadingScrollsOutOfView() { val driver = FakeCollectorDriver( @@ -436,6 +456,7 @@ class PddProductDetailCollectorTest { private val specialText: String? = null, private val includeDangerousActions: Boolean = false, private val rowSize: Int = 4, + private val hideSelectedColorOption: Boolean = false, private val hideDimensionHeadingsAfterFirstVerticalPage: Boolean = false, private val soldOutUntilPulls: Int = 0, ) : PddCollectorDriver { @@ -468,7 +489,9 @@ class PddProductDetailCollectorTest { val continuationPage = hideDimensionHeadingsAfterFirstVerticalPage && verticalPage > 0 if (!continuationPage) { nodes += node("scroll/color-heading", "颜色分类", 20, 400, 300, 450, parentPath = "scroll") - colorPages[horizontalPage.coerceAtMost(colorPages.lastIndex)].forEachIndexed { index, color -> + colorPages[horizontalPage.coerceAtMost(colorPages.lastIndex)] + .filterNot { hideSelectedColorOption && it == selected } + .forEachIndexed { index, color -> val row = index / rowSize val column = index % rowSize nodes += node(