76 lines
3.1 KiB
Python
76 lines
3.1 KiB
Python
"""验证 _scroll_session_list_page 的滚动到底检测修复"""
|
||
import sys, os
|
||
SCRIPT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||
sys.path.insert(0, SCRIPT_DIR)
|
||
|
||
import numpy as np
|
||
from wechat_bot import WeChatBot
|
||
|
||
# 构造最小 bot 对象(不需要真实窗口)
|
||
bot = WeChatBot.__new__(WeChatBot)
|
||
bot.session_item_h = 72
|
||
bot.scale = 1.0
|
||
|
||
# 构造有纹理的页面(模拟会话列表)
|
||
def make_page(h=200, w=300, seed=0):
|
||
rng = np.random.default_rng(seed)
|
||
page = rng.integers(180, 220, size=(h, w, 3), dtype=np.uint8)
|
||
# 添加一些"头像"和"文字"区域,增加 informative 像素
|
||
page[20:60, 20:80] = rng.integers(80, 160, size=(40, 60, 3), dtype=np.uint8)
|
||
page[80:120, 20:200] = rng.integers(80, 160, size=(40, 180, 3), dtype=np.uint8)
|
||
return page
|
||
|
||
a = make_page(seed=1)
|
||
b = a.copy()
|
||
|
||
# shift=0 应该返回 True(内容完全相同)
|
||
assert bot._session_pages_overlap_at_shift(a, b, 0) is True, "shift=0 同页应返回 True"
|
||
|
||
# 微小差异(模拟时间戳变化,1% 区域不同)
|
||
b2 = a.copy()
|
||
b2[10:20, 10:30] = 255
|
||
# shift=0 时,差异区域可能导致覆盖率 <90%,返回 False
|
||
overlap0 = bot._session_pages_overlap_at_shift(a, b2, 0)
|
||
assert isinstance(overlap0, bool), "应返回 bool"
|
||
|
||
# --- 测试 _any_scroll_overlap ---
|
||
# 完全相同的页面 -> 任何 shift 都匹配
|
||
assert bot._any_scroll_overlap(a, b) is True, "同页应返回 True"
|
||
|
||
# 模拟滚动 1 行(72px)
|
||
scrolled = np.zeros((200, 300, 3), dtype=np.uint8)
|
||
scrolled[:-72] = a[72:]
|
||
scrolled[-72:] = 128
|
||
overlap = bot._any_scroll_overlap(a, scrolled)
|
||
# 如果滚动 72px 确实存在重叠,应返回 True
|
||
print(f"[INFO] 滚动 72px 重叠检测: {overlap}")
|
||
|
||
# --- 测试 _scroll_session_list_page 的签名+重叠双重检测 ---
|
||
# 模拟时间戳微差(真实场景:时间戳只占右上角很小区域,颜色差异不大)
|
||
a_ts = make_page(seed=3)
|
||
b_ts = a_ts.copy()
|
||
# 模拟右上角时间戳从 "14:51" 变为 "14:52",只影响 12x40 区域,颜色差异小
|
||
b_ts[8:20, 240:280] = np.clip(b_ts[8:20, 240:280].astype(np.int16) + 15, 0, 255).astype(np.uint8)
|
||
|
||
sig_a = bot._session_page_signature(a_ts)
|
||
sig_b = bot._session_page_signature(b_ts)
|
||
print(f"[INFO] 时间戳微差时签名相同: {sig_a == sig_b}")
|
||
|
||
if sig_a != sig_b:
|
||
any_overlap = bot._any_scroll_overlap(a_ts, b_ts)
|
||
print(f"[INFO] 签名不同但 _any_scroll_overlap: {any_overlap}")
|
||
if any_overlap:
|
||
print("[PASS] 修复有效:时间戳微差导致签名不同但无有效滚动时,会返回 None")
|
||
else:
|
||
print("[INFO] 时间戳差异被识别为有意义变化;继续检查滚动检测是否仍有效...")
|
||
# 如果页面确实滚动了一行,应仍被识别为有效滚动
|
||
scrolled_ts = np.zeros_like(a_ts)
|
||
scrolled_ts[:-72] = a_ts[72:]
|
||
scrolled_ts[-72:] = 128
|
||
scroll_overlap = bot._any_scroll_overlap(a_ts, scrolled_ts)
|
||
print(f"[INFO] 滚动 72px 时 _any_scroll_overlap: {scroll_overlap}")
|
||
if scroll_overlap:
|
||
print("[PASS] 滚动检测仍有效:真实滚动被识别为有效滚动")
|
||
else:
|
||
print("[PASS] 时间戳微差未影响签名,无需修复")
|