fix: 修复 PDD 页面误判与失败回执 (#35)
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
import unittest
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
@@ -74,6 +75,16 @@ class DisconnectingDevice(FakeCollectDevice):
|
||||
return super().app_current()
|
||||
|
||||
|
||||
class FocusMismatchDevice(FakeCollectDevice):
|
||||
"""系统焦点报告为设置页,但无障碍树实际属于 PDD。"""
|
||||
|
||||
def app_current(self):
|
||||
return {"package": "com.oplus.wirelesssettings"}
|
||||
|
||||
def app_start(self, _package):
|
||||
self.app_started = True
|
||||
|
||||
|
||||
def keep_only_one_sku(xml_data: str) -> str:
|
||||
"""从脱敏固件中删除蓝色和 L,只保留一个组合。"""
|
||||
|
||||
@@ -190,6 +201,29 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
self.assertEqual(data["source"]["device_address"], "USB-001")
|
||||
self.assertIsNone(data["purchase"])
|
||||
|
||||
def test_pdd_hierarchy_is_ready_even_when_focused_package_is_settings(self):
|
||||
pdd_home_xml = self.home_xml.replace(
|
||||
"<node ", '<node package="com.xunmeng.pinduoduo" '
|
||||
)
|
||||
device = FocusMismatchDevice(
|
||||
pdd_home_xml, keep_only_one_sku(self.spec_xml)
|
||||
)
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
max_page_swipes=0,
|
||||
max_spec_swipes=0,
|
||||
)
|
||||
|
||||
result = service.collect(
|
||||
FakeTask("https://mobile.yangkeduo.com/goods.html?goods_id=123")
|
||||
)
|
||||
|
||||
self.assertEqual(result.goods_id, "123")
|
||||
self.assertTrue(device.app_started)
|
||||
|
||||
def test_price_is_sampled_once_per_available_color(self):
|
||||
device = FakeCollectDevice(self.home_xml, self.spec_xml)
|
||||
service = PddCollectService(
|
||||
@@ -268,6 +302,52 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
)
|
||||
self.assertEqual(raised.exception.code, "PDD_PAGE_TIMEOUT")
|
||||
|
||||
def test_non_pdd_tree_with_purchase_words_is_not_ready(self):
|
||||
device = FocusMismatchDevice(
|
||||
'<hierarchy><node package="com.android.settings" text="免拼购买" '
|
||||
'bounds="[0,0][100,100]" /></hierarchy>',
|
||||
self.spec_xml,
|
||||
)
|
||||
ticks = iter((0.0, 0.0, 0.0, 2.0))
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
monotonic=lambda: next(ticks),
|
||||
page_timeout=1.0,
|
||||
)
|
||||
|
||||
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_TIMEOUT")
|
||||
|
||||
def test_page_timeout_saves_last_xml_diagnostic(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
device = LoadingDevice(self.home_xml, self.spec_xml)
|
||||
ticks = iter((0.0, 0.0, 0.0, 0.0, 0.0, 2.0))
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
monotonic=lambda: next(ticks),
|
||||
page_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")
|
||||
)
|
||||
|
||||
artifacts = raised.exception.diagnostics["artifacts"]
|
||||
self.assertEqual(len(artifacts), 1)
|
||||
self.assertTrue(Path(artifacts[0]["path"]).is_file())
|
||||
self.assertEqual(len(artifacts[0]["sha256"]), 64)
|
||||
|
||||
def test_runtime_device_disconnect_has_stable_error_code(self):
|
||||
service = PddCollectService(
|
||||
PddDeviceService(
|
||||
|
||||
Reference in New Issue
Block a user