gengx
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
"""验证 _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] 时间戳微差未影响签名,无需修复")
|
||||
Reference in New Issue
Block a user