From 39c6258d249c9d8324d4f6856f74eec1c4853947 Mon Sep 17 00:00:00 2001 From: chengma Date: Tue, 18 Aug 2026 14:17:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20AI=20=E8=BF=94=E5=9B=9E=E5=90=8E?= =?UTF-8?q?=E5=85=88=E9=80=89=E5=B0=BA=E7=A0=81=E5=86=8D=E6=A0=B8=E5=AF=B9?= =?UTF-8?q?=E7=BB=84=E5=90=88=20(#267)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pdd_u2_purchase_adapter.py | 45 +++++--- client/test/test_pdd_u2_purchase_adapter.py | 122 ++++++++++++++++++-- docs/client/06-quality-security.md | 5 +- 3 files changed, 146 insertions(+), 26 deletions(-) diff --git a/client/src/pdd_u2_purchase_adapter.py b/client/src/pdd_u2_purchase_adapter.py index 4028d62..c26fde7 100644 --- a/client/src/pdd_u2_purchase_adapter.py +++ b/client/src/pdd_u2_purchase_adapter.py @@ -1303,19 +1303,6 @@ 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", - "等待规格解析期间已选颜色发生变化", - step="purchase_resolve_options", - diagnostics={"context_check": "selected_color"}, - ) - try: dimension = self._size_candidate_collector(self._require_device()) except PddCollectError as exc: @@ -1355,9 +1342,10 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter): step="purchase_resolve_options", ) - latest_xml = self._restore_purchase_panel_color_region( - self._dump_hierarchy() - ) + # 候选复算后仍停留在尺码上下文时,直接选择 Admin 返回的页面 + # 原文。颜色节点当前不可见不代表颜色已变化;完整组合在点击后 + # 使用最新“已选”摘要核对,摘要不足时才回到颜色区域兜底。 + latest_xml = self._dump_hierarchy() if not self._select_size( self._require_device(), latest_xml, candidate.raw_text, action_delay=0.2 ): @@ -1367,12 +1355,35 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter): step="purchase_resolve_options", ) selected_xml = self._dump_hierarchy() - if not _selected(_parse_xml(selected_xml), candidate.raw_text): + selected_root = _parse_xml(selected_xml) + selected_page_kind = _page_kind(selected_root, "") + if selected_page_kind != "order_confirmation": + raise PddPurchaseError( + "PURCHASE_SPEC_CONTEXT_CHANGED", + "选择解析尺码后页面已离开规格确认页", + step="purchase_resolve_options", + diagnostics={ + "context_check": "page_kind_after_size", + "expected_page_kind": "order_confirmation", + "observed_page_kind": selected_page_kind, + }, + ) + if not _selected(selected_root, candidate.raw_text): raise PddPurchaseError( "PURCHASE_RESOLVED_SIZE_NOT_SELECTED", "点击解析尺码后页面没有确认选中", step="purchase_resolve_options", ) + if not _selected(selected_root, expected_snapshot.selected_color): + color_xml = self._restore_purchase_panel_color_region(selected_xml) + color_root = _parse_xml(color_xml) + if not _selected(color_root, expected_snapshot.selected_color): + raise PddPurchaseError( + "PURCHASE_SPEC_CONTEXT_CHANGED", + "选择解析尺码后无法确认原颜色仍处于选中状态", + step="purchase_resolve_options", + diagnostics={"context_check": "selected_color"}, + ) self._requested_options["size"] = candidate.raw_text def set_quantity(self, quantity: int) -> None: diff --git a/client/test/test_pdd_u2_purchase_adapter.py b/client/test/test_pdd_u2_purchase_adapter.py index 33dc4fb..a5dccd2 100644 --- a/client/test/test_pdd_u2_purchase_adapter.py +++ b/client/test/test_pdd_u2_purchase_adapter.py @@ -266,12 +266,14 @@ class VerticallyScrolledColorPanelDevice(FakeDevice): starts_at_top: bool, restores_on_swipe: bool = True, selected_color: str = "", + show_selected_summary: bool = False, ): 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.show_selected_summary = show_selected_summary self.swipes = [] def dump_hierarchy(self): @@ -293,6 +295,18 @@ class VerticallyScrolledColorPanelDevice(FakeDevice): '