From b0cddb956b85e7bdec8169cc329e4c7d5cde63ef Mon Sep 17 00:00:00 2001 From: chengma Date: Tue, 18 Aug 2026 14:03:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E8=A7=84=E6=A0=BC?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=90=8E=E7=9A=84=E9=A2=9C=E8=89=B2=E5=A4=8D?= =?UTF-8?q?=E6=A0=B8=E9=A1=BA=E5=BA=8F=20(#266)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pdd_u2_purchase_adapter.py | 6 +- client/test/test_pdd_u2_purchase_adapter.py | 104 +++++++++++++++++++- docs/client/06-quality-security.md | 3 + 3 files changed, 110 insertions(+), 3 deletions(-) diff --git a/client/src/pdd_u2_purchase_adapter.py b/client/src/pdd_u2_purchase_adapter.py index 296313f..4028d62 100644 --- a/client/src/pdd_u2_purchase_adapter.py +++ b/client/src/pdd_u2_purchase_adapter.py @@ -1303,6 +1303,11 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter): "observed_page_kind": current_page_kind, }, ) + # 完整遍历第二规格后,面板可能停在尺码列表末端,颜色节点已经 + # 滑出当前控件树。必须先回到颜色区域,再用最新控件树确认原颜色; + # 否则“当前看不见”会被误报成“颜色发生变化”。 + current_xml = self._restore_purchase_panel_color_region(current_xml) + root = _parse_xml(current_xml) if not _selected(root, expected_snapshot.selected_color): raise PddPurchaseError( "PURCHASE_SPEC_CONTEXT_CHANGED", @@ -1311,7 +1316,6 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter): diagnostics={"context_check": "selected_color"}, ) - current_xml = self._restore_purchase_panel_color_region(current_xml) try: dimension = self._size_candidate_collector(self._require_device()) except PddCollectError as exc: diff --git a/client/test/test_pdd_u2_purchase_adapter.py b/client/test/test_pdd_u2_purchase_adapter.py index c6531fe..33dc4fb 100644 --- a/client/test/test_pdd_u2_purchase_adapter.py +++ b/client/test/test_pdd_u2_purchase_adapter.py @@ -260,10 +260,18 @@ class SoldOutRefreshPurchaseDevice(FakeDevice): class VerticallyScrolledColorPanelDevice(FakeDevice): """模拟 PDD 记住规格面板纵向位置。""" - def __init__(self, *, starts_at_top: bool, restores_on_swipe: bool = True): + def __init__( + self, + *, + starts_at_top: bool, + restores_on_swipe: bool = True, + selected_color: str = "", + ): super().__init__() self.at_color_top = starts_at_top self.restores_on_swipe = restores_on_swipe + self.selected_color = selected_color + self.selected_size = "" self.swipes = [] def dump_hierarchy(self): @@ -272,9 +280,20 @@ class VerticallyScrolledColorPanelDevice(FakeDevice): if self.mode == "home": return home_xml() if self.mode == "panel": - return vertically_scrolled_purchase_panel_xml( + xml_data = vertically_scrolled_purchase_panel_xml( at_color_top=self.at_color_top ) + if self.at_color_top and self.selected_color == "黑色": + xml_data = xml_data.replace( + '