fix: 售罄临时页仅下拉刷新一次 (#265)
This commit is contained in:
@@ -93,6 +93,29 @@ class FakeCollectDevice:
|
||||
self.swipe_panel_states.append(self.panel_open)
|
||||
|
||||
|
||||
class SoldOutRefreshCollectDevice(FakeCollectDevice):
|
||||
"""模拟深链先显示售罄,向下拉一次后恢复或继续售罄。"""
|
||||
|
||||
def __init__(self, sold_out_xml, recovered_xml, *, persistent=False):
|
||||
super().__init__(recovered_xml, "")
|
||||
self.sold_out_xml = sold_out_xml
|
||||
self.recovered_xml = recovered_xml
|
||||
self.persistent = persistent
|
||||
self.refreshed = False
|
||||
|
||||
def dump_hierarchy(self):
|
||||
if self.opened_url is None:
|
||||
return '<hierarchy><node package="com.xunmeng.pinduoduo" /></hierarchy>'
|
||||
if not self.refreshed or self.persistent:
|
||||
return self.sold_out_xml
|
||||
return self.recovered_xml
|
||||
|
||||
def swipe(self, x1, y1, x2, y2, duration=0.0):
|
||||
self.swipes.append(((x1, y1, x2, y2), {"duration": duration}))
|
||||
if y2 > y1 and x1 == x2:
|
||||
self.refreshed = True
|
||||
|
||||
|
||||
class GoodsMetadataScrollDevice(FakeCollectDevice):
|
||||
"""模拟评价和店铺分别出现在商品页后续屏幕。"""
|
||||
|
||||
@@ -1764,6 +1787,59 @@ class PddCollectParserTest(unittest.TestCase):
|
||||
)
|
||||
self.assertEqual(raised.exception.code, "PDD_PAGE_TIMEOUT")
|
||||
|
||||
def test_sold_out_page_pulls_down_once_then_recovers_goods(self):
|
||||
device = SoldOutRefreshCollectDevice(
|
||||
self.sold_out_xml,
|
||||
self.home_xml,
|
||||
)
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
)
|
||||
|
||||
service._open_goods(
|
||||
device,
|
||||
"https://mobile.yangkeduo.com/goods.html?goods_id=123",
|
||||
{"package": "com.xunmeng.pinduoduo"},
|
||||
)
|
||||
|
||||
self.assertEqual(len(device.swipes), 1)
|
||||
(x1, y1, x2, y2), options = device.swipes[0]
|
||||
self.assertEqual(x1, x2)
|
||||
self.assertGreater(y2, y1)
|
||||
self.assertEqual(options["duration"], 0.5)
|
||||
self.assertEqual(device.clicks, [])
|
||||
|
||||
def test_sold_out_after_one_refresh_is_unavailable(self):
|
||||
device = SoldOutRefreshCollectDevice(
|
||||
self.sold_out_xml,
|
||||
self.home_xml,
|
||||
persistent=True,
|
||||
)
|
||||
service = PddCollectService(
|
||||
PddDeviceService(lambda _serial: device),
|
||||
"USB-001",
|
||||
"client-001",
|
||||
sleeper=lambda _seconds: None,
|
||||
)
|
||||
|
||||
with self.assertRaises(PddCollectError) as raised:
|
||||
service._open_goods(
|
||||
device,
|
||||
"https://mobile.yangkeduo.com/goods.html?goods_id=123",
|
||||
{"package": "com.xunmeng.pinduoduo"},
|
||||
)
|
||||
|
||||
self.assertEqual(raised.exception.code, "PDD_GOODS_UNAVAILABLE")
|
||||
self.assertEqual(
|
||||
raised.exception.diagnostics,
|
||||
{"page_reason": "out_of_stock", "refresh_attempts": 1},
|
||||
)
|
||||
self.assertEqual(len(device.swipes), 1)
|
||||
self.assertEqual(device.clicks, [])
|
||||
|
||||
def test_stable_home_reopens_once_then_stops_before_spec_click(self):
|
||||
home = (FIXTURES / "pdd_home_page.xml").read_text(encoding="utf-8")
|
||||
device = FakeCollectDevice(home, self.spec_xml)
|
||||
|
||||
Reference in New Issue
Block a user