Files
kefu/wechat_rpa/tmp/test_scroll_deadlock_fix.py
T
2026-08-27 14:04:28 +08:00

76 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""验证 _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] 时间戳微差未影响签名,无需修复")