fix: 识别失效商品链接返回首页 (#111)

This commit is contained in:
chengma
2026-08-10 18:20:34 +08:00
parent 3b659eba0a
commit 8c9dbfed44
15 changed files with 802 additions and 62 deletions
@@ -1,5 +1,6 @@
"""uiautomator2 采购演练 Adapter 测试;不连接真实手机。"""
from pathlib import Path
import unittest
from src.pdd_device_service import PddDeviceService
@@ -9,6 +10,18 @@ from src.pdd_u2_purchase_adapter import U2PddLivePurchaseAdapter
GOODS_URL = "https://mobile.yangkeduo.com/goods.html?goods_id=753136429979"
FIXTURES = Path(__file__).parent / "fixtures"
class FakeClock:
def __init__(self) -> None:
self.now = 0.0
def monotonic(self) -> float:
return self.now
def sleep(self, seconds: float) -> None:
self.now += seconds
def home_xml() -> str:
@@ -60,6 +73,7 @@ class FakeDevice:
self.clicks = []
self.opened_urls = []
self.app_wait_calls = 0
self.has_opened = False
def app_current(self):
return {"package": "com.xunmeng.pinduoduo"}
@@ -73,8 +87,11 @@ class FakeDevice:
def open_url(self, url):
self.opened_urls.append(url)
self.has_opened = True
def dump_hierarchy(self):
if not self.has_opened:
return '<hierarchy><node package="com.xunmeng.pinduoduo" /></hierarchy>'
if self.mode == "special":
return self.special_xml
return home_xml() if self.mode == "home" else panel_xml(self.quantity)
@@ -108,6 +125,13 @@ class ColdStartDevice(FakeDevice):
self.app_started = True
class StaleGoodsDevice(FakeDevice):
"""深链打开前后都停留在同一个旧商品页。"""
def dump_hierarchy(self):
return home_xml()
class U2PddPurchaseAdapterTest(unittest.TestCase):
def _adapter(self, device, calls):
def select_color_fn(_device, _xml, target, **_kwargs):
@@ -207,6 +231,44 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
self.assertEqual(raised.exception.code, "PDD_PAGE_CAPTCHA")
self.assertEqual(device.clicks, [])
def test_stable_home_reopens_once_then_stops_before_click(self):
device = FakeDevice(
(FIXTURES / "pdd_home_page.xml").read_text(encoding="utf-8")
)
clock = FakeClock()
adapter = U2PddPurchaseAdapter(
"USB-001",
device_service=PddDeviceService(connector=lambda _serial: device),
sleeper=clock.sleep,
monotonic=clock.monotonic,
page_timeout=10.0,
)
with self.assertRaises(PddPurchaseError) as raised:
adapter.open_goods(GOODS_URL)
self.assertEqual("PDD_GOODS_UNAVAILABLE", raised.exception.code)
self.assertFalse(raised.exception.retryable)
self.assertEqual(2, len(device.opened_urls))
self.assertEqual([], device.clicks)
def test_stale_goods_page_is_not_accepted_as_target(self):
device = StaleGoodsDevice()
clock = FakeClock()
adapter = U2PddPurchaseAdapter(
"USB-001",
device_service=PddDeviceService(connector=lambda _serial: device),
sleeper=clock.sleep,
monotonic=clock.monotonic,
page_timeout=1.0,
)
with self.assertRaises(PddPurchaseError) as raised:
adapter.open_goods(GOODS_URL)
self.assertEqual("PDD_GOODS_IDENTITY_UNCONFIRMED", raised.exception.code)
self.assertEqual([], device.clicks)
adapter.close()
def test_invalid_non_pdd_url_is_rejected_before_connect(self):