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( + '