fix: 商品页就绪后立即进入规格面板 (#36)
This commit is contained in:
@@ -33,6 +33,7 @@ class FakeCollectDevice:
|
||||
self.panel_open = False
|
||||
self.clicks = []
|
||||
self.swipes = []
|
||||
self.swipe_panel_states = []
|
||||
|
||||
def app_current(self):
|
||||
return {"package": "com.xunmeng.pinduoduo"}
|
||||
@@ -56,6 +57,7 @@ class FakeCollectDevice:
|
||||
|
||||
def swipe(self, *args, **kwargs):
|
||||
self.swipes.append((args, kwargs))
|
||||
self.swipe_panel_states.append(self.panel_open)
|
||||
|
||||
|
||||
class LoadingDevice(FakeCollectDevice):
|
||||
@@ -85,6 +87,11 @@ class FocusMismatchDevice(FakeCollectDevice):
|
||||
self.app_started = True
|
||||
|
||||
|
||||
class PanelDoesNotOpenDevice(FakeCollectDevice):
|
||||
def click(self, x, y):
|
||||
self.clicks.append((x, y))
|
||||
|
||||
|
||||
def keep_only_one_sku(xml_data: str) -> str:
|
||||
"""从脱敏固件中删除蓝色和 L,只保留一个组合。"""
|
||||
|
||||
@@ -176,7 +183,6 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
now=lambda: datetime(2026, 8, 7, 8, 0, tzinfo=timezone.utc),
|
||||
max_page_swipes=1,
|
||||
max_spec_swipes=1,
|
||||
)
|
||||
|
||||
@@ -213,7 +219,6 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
max_page_swipes=0,
|
||||
max_spec_swipes=0,
|
||||
)
|
||||
|
||||
@@ -231,7 +236,6 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
max_page_swipes=0,
|
||||
max_spec_swipes=0,
|
||||
)
|
||||
|
||||
@@ -375,7 +379,6 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
max_page_swipes=0,
|
||||
)
|
||||
|
||||
result = service.collect(
|
||||
@@ -383,6 +386,62 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
)
|
||||
self.assertIsNone(result.shop_name)
|
||||
|
||||
def test_missing_reviews_does_not_scroll_before_opening_spec_panel(self):
|
||||
home_without_reviews = self.home_xml.replace(
|
||||
'<node class="android.widget.TextView" text="2356条评价" '
|
||||
'bounds="[330,950][600,1010]" visible-to-user="true" '
|
||||
'enabled="true" />',
|
||||
"",
|
||||
)
|
||||
device = FakeCollectDevice(
|
||||
home_without_reviews, keep_only_one_sku(self.spec_xml)
|
||||
)
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
max_spec_swipes=0,
|
||||
)
|
||||
|
||||
result = service.collect(
|
||||
FakeTask("https://mobile.yangkeduo.com/goods.html?goods_id=123")
|
||||
)
|
||||
|
||||
self.assertIsNone(result.reviews.raw)
|
||||
self.assertTrue(device.clicks)
|
||||
self.assertTrue(all(device.swipe_panel_states))
|
||||
|
||||
def test_spec_panel_timeout_has_stable_code_and_xml_evidence(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
device = PanelDoesNotOpenDevice(self.home_xml, self.spec_xml)
|
||||
tick = {"value": -0.5}
|
||||
|
||||
def clock():
|
||||
tick["value"] += 0.5
|
||||
return tick["value"]
|
||||
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
monotonic=clock,
|
||||
spec_panel_timeout=1.0,
|
||||
artifact_directory=Path(directory),
|
||||
)
|
||||
|
||||
with self.assertRaises(PddCollectError) as raised:
|
||||
service.collect(
|
||||
FakeTask("https://mobile.yangkeduo.com/goods.html?goods_id=123")
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
raised.exception.code, "PDD_PAGE_SPEC_PANEL_TIMEOUT"
|
||||
)
|
||||
artifacts = raised.exception.diagnostics["artifacts"]
|
||||
self.assertTrue(Path(artifacts[0]["path"]).is_file())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user