37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""PDD 商品页一次性下拉刷新手势;不负责页面分类或重试决策。"""
|
|||
|
|
|
||
|
|
import re
|
||
|
|
import xml.etree.ElementTree as ET
|
||
|
|
from typing import Any
|
||
|
|
|
||
|
|
|
||
|
|
_BOUNDS_PATTERN = re.compile(r"^\[(\d+),(\d+)\]\[(\d+),(\d+)\]$")
|
||
|
|
|
||
|
|
|
||
|
|
def pull_down_to_refresh(device: Any, root: ET.Element) -> None:
|
||
|
|
"""在最新控件树的内容区执行一次向下拉手势。
|
||
|
|
|
||
|
|
调用方必须已经把页面分类为明确的整页售罄。手势从屏幕中上部开始,
|
||
|
|
避开系统状态栏,并且不点击任何页面节点。
|
||
|
|
"""
|
||
|
|
|
||
|
|
right = 0
|
||
|
|
bottom = 0
|
||
|
|
for node in root.iter("node"):
|
||
|
|
match = _BOUNDS_PATTERN.fullmatch(node.get("bounds", ""))
|
||
|
|
if match is None:
|
||
|
|
continue
|
||
|
|
_left, _top, node_right, node_bottom = map(int, match.groups())
|
||
|
|
right = max(right, node_right)
|
||
|
|
bottom = max(bottom, node_bottom)
|
||
|
|
|
||
|
|
if right < 300 or bottom < 600:
|
||
|
|
raise ValueError("售罄页面没有可靠的屏幕边界,不能安全下拉刷新")
|
||
|
|
|
||
|
|
x = right // 2
|
||
|
|
start_y = int(bottom * 0.28)
|
||
|
|
end_y = int(bottom * 0.72)
|
||
|
|
if end_y - start_y < 240:
|
||
|
|
raise ValueError("售罄页面可用刷新区域过小")
|
||
|
|
device.swipe(x, start_y, x, end_y, duration=0.5)
|