From 54f1b2fb91110b64aefabd81cb5b24f8755805ea Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sat, 31 Jan 2026 07:40:07 +0800 Subject: [PATCH] 'commit' --- WeiXin/T1_OpenChat_ActionTest.py | 13 +++++ WeiXin/T4_Text_StaticTest.py | 13 +++++ ..._SendText.py => T5_SendText_ActionTest.py} | 13 +++++ WeiXin/WxUtil.py | 47 ++++++++++++------ WeiXin/__pycache__/WxUtil.cpython-310.pyc | Bin 33406 -> 33609 bytes 5 files changed, 70 insertions(+), 16 deletions(-) rename WeiXin/{T5_SendText.py => T5_SendText_ActionTest.py} (78%) diff --git a/WeiXin/T1_OpenChat_ActionTest.py b/WeiXin/T1_OpenChat_ActionTest.py index eed01c6..db7c258 100644 --- a/WeiXin/T1_OpenChat_ActionTest.py +++ b/WeiXin/T1_OpenChat_ActionTest.py @@ -1,4 +1,17 @@ # coding=utf-8 +""" +T1_OpenChat_ActionTest.py - 微信对话框打开测试 (UI Navigation Test) + +【核心功能】 +- 自动化导航:模拟点击搜索、输入好友名称、进入聊天窗口的完整 UI 流程。 +- 环境初始化:执行测试前清理旧的日志和输出文件。 +- 容错处理:支持通过 UI 树定位或坐标点击两种方式查找搜索结果。 + +【使用场景】 +- 验证 UIAutomator2 是否能正常驱动微信。 +- 当搜索好友功能失效或微信 UI 改版时进行调试。 +- 作为自动化巡课流程的第一步(确保机器人处于正确的聊天界面)。 +""" import uiautomator2 as u2 import time import logging diff --git a/WeiXin/T4_Text_StaticTest.py b/WeiXin/T4_Text_StaticTest.py index 52ea93f..2bb1404 100644 --- a/WeiXin/T4_Text_StaticTest.py +++ b/WeiXin/T4_Text_StaticTest.py @@ -1,4 +1,17 @@ # coding=utf-8 +""" +T4_Text_StaticTest.py - 纯文本消息识别与合并测试 (Text Message Static Test) + +【核心功能】 +- 静态文本分析:专门针对文字消息进行 OCR 识别。 +- 消息合并逻辑:模拟机器人将同一发送者、在短时间内发送的多行文字合并为一条消息的逻辑。 +- 视觉验证:生成标记了识别结果的调试图片 (T4_Debug.jpg)。 + +【使用场景】 +- 验证多行长文字消息是否能被正确合并。 +- 调试文字消息的发送者判定(特别是长文本换行后的判定)。 +- 在不干扰手机交互的情况下,快速验证文本 OCR 的准确性。 +""" import os import sys import logging diff --git a/WeiXin/T5_SendText.py b/WeiXin/T5_SendText_ActionTest.py similarity index 78% rename from WeiXin/T5_SendText.py rename to WeiXin/T5_SendText_ActionTest.py index 73b790b..2ccba7d 100644 --- a/WeiXin/T5_SendText.py +++ b/WeiXin/T5_SendText_ActionTest.py @@ -1,4 +1,17 @@ # coding=utf-8 +""" +T5_SendText_ActionTest.py - 文本输入与发送功能测试 (Input & Send Action Test) + +【核心功能】 +- 输入法切换:测试自动切换到微信输入模式逻辑。 +- 鲁棒输入:验证通过 UI 元素(EditText)或坐标点进行文字填充。 +- 发送动作:模拟点击“发送”按钮并验证发送是否成功。 + +【使用场景】 +- 调试机器人“会写不会发”的问题。 +- 验证在不同输入法环境下(如搜狗、系统默认)的输入兼容性。 +- 测试输入框定位算法是否能避开键盘遮挡。 +""" import os import sys import logging diff --git a/WeiXin/WxUtil.py b/WeiXin/WxUtil.py index ce56993..8554c07 100644 --- a/WeiXin/WxUtil.py +++ b/WeiXin/WxUtil.py @@ -67,26 +67,41 @@ def parse_wechat_time(time_str): dt = datetime.combine(yesterday, datetime.min.time().replace(hour=h, minute=m)) return dt.strftime("%Y-%m-%d %H:%M") - # 3. 星期X HH:mm - weekdays = {"星期一": 0, "星期二": 1, "星期三": 2, "星期四": 3, "星期五": 4, "星期六": 5, "星期日": 6} - for w_str, w_idx in weekdays.items(): + # 3. 星期X / 周X HH:mm + weekdays_map = { + "星期一": 0, "星期二": 1, "星期三": 2, "星期四": 3, "星期五": 4, "星期六": 5, "星期日": 6, + "周一": 0, "周二": 1, "周三": 2, "周四": 3, "周五": 4, "周六": 5, "周日": 6 + } + for w_str, w_idx in weekdays_map.items(): if w_str in clean_str: + # 提取时间部分 (支持 "周三 10:03" 或 "周三10:03") t_part = clean_str.replace(w_str, "").strip() - if re.match(r'^\d{1,2}:\d{2}$', t_part): - h, m = map(int, t_part.split(':')) - current_weekday = now.weekday() - # 计算日期回退天数 (mod 7 确保是过去的一周内) - delta_days = (current_weekday - w_idx) % 7 - # 如果 delta_days 是 0 且当前时间比消息时间早 (不可能发生,除非穿越),说明是今天 - # 但通常"星期X"不显示今天,今天显示 HH:mm - # 如果 delta_days == 0,可能是上周的今天?微信通常显示 "上周X"? - # 简单起见,认为是今天或过去7天内的那天 - if delta_days == 0 and datetime.now().time() < datetime.min.time().replace(hour=h, minute=m): - delta_days = 7 # 上周 - - target_date = today - timedelta(days=delta_days) + time_match = re.search(r'(\d{1,2}):(\d{2})', t_part) + + h, m = 0, 0 + if time_match: + h, m = map(int, time_match.groups()) + + current_weekday = now.weekday() + # 计算日期回退天数 (mod 7 确保是过去的一周内) + delta_days = (current_weekday - w_idx) % 7 + + # 如果 delta_days 是 0,且当前时间比解析出的时间早,说明是上周的今天 + # 微信通常只有在真的“过去”才会显示星期几 + if delta_days == 0 and time_match: + if now.hour < h or (now.hour == h and now.minute < m): + delta_days = 7 + elif delta_days == 0 and not time_match: + # 只有“周三”没有时间,通常指最近的一个周三(如果今天是周三,可能指上周三) + # 但为了简单,如果今天是周三且没时间,我们暂定为今天 + pass + + target_date = today - timedelta(days=delta_days) + if time_match: dt = datetime.combine(target_date, datetime.min.time().replace(hour=h, minute=m)) return dt.strftime("%Y-%m-%d %H:%M") + else: + return target_date.strftime("%Y-%m-%d 00:00") # 4. YYYY年MM月DD日 HH:mm # 简单匹配年月日 diff --git a/WeiXin/__pycache__/WxUtil.cpython-310.pyc b/WeiXin/__pycache__/WxUtil.cpython-310.pyc index 4c5d739c9c9b4a0e58c00f92f14084d0ccf507e3..c71beb838bcdbc8867ccf12ceeedaec6b29278f7 100644 GIT binary patch delta 6476 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

3M|30OX{mE~@)V!z!sLFU=;_JJldg(-tM zgG^l{h6}q@%&$R@T=q53%-?XenV)Vaq=EFdCj+Q8=TTni;-_Cxvt%MA28 ze+)Atee~PRI_O=^GlkoZZirJQD66o^_eIt>*lPVfurg0hF*`rlT#F|oFDK}{0UZAU z0LCBUcu5aMdqwvC;1hLARc99A|6G%y|NBV^JNw}s4{YO0Ec0=tAJ^=HW~svdgffBt z0M+bZ`hh5kuzxvF?hXPWW%btA*TboBiWLu?w*MS?p3PhsIxW^$5S-QWgjWeUGgjZK-<=8Gebt7r2=-e_=ZF z_~_kGp1&A9Yad6EcUkmE=@C1DA#YCHOWZX&PM<{J4tX0#)d;^qI16C7B1$ae4@Sbl zDY_e}-3Z)uZ{TPX!d~|Fk=nU14&n6`iakhW=u>>(6t6<2*U{HLdkEeR;C$g>;Sup7 z0|v;jN0eY7qMDsEjpXIXZ09Y_m#rkUctYbZ28P|d44W@Q?2&u6k{0&jJ>T>^fTHgq z{1%~^-RtkL8R9fFyC3-Xi#EdY#|{)54l1jOh^Cqq#v}1Qn;C1b*KLd%2q!amqWB4DdMgwZ|(~BeFmlZ z`^W7#+Rw&<tYMph>XQviDjYYf@&wAfjeySfme6|SZ9rJsA#Ef=D_kXz>nVgL zoNh+gim(k~JAh$<5;p8{1#(1%2B}fg4Q!oKSo;N#g#M~RJ5f~G5EJnmy5>z_8)IY2 zFnKfcobrmzQH9zo2s@Sd4Ecy%PSj@4pbgIgBzCfg5@oDL(^e$ zjQ!X29(aXqo%s}8Awo0XC@4n@?c+)!CaH!+Q{cj~arO*(i9J1g1cY*uKJs%GN}jZT zAN6lw|DG%ba#rfLIqpQBuQE>YuII)DmxIFVmlt&oPVnxCQKn@G*QNQrsAUe}IKoK; zp6gilM)nLOumT@_!YSEs!d`!j0#-v|k^@wr2}p90yG ztty~Z)j&u1@!UPPkl2PZIIVT#X9b_TdvM?2kbn1{q2@h9U5BpE_6x8Hvx)GKp*zjI zE-?GYC-Yihe|Eh3?i=Ltige$HA^f8SZ4~owZV)H46D&5J1FZ5y$J`wt4wspBH0Bim zyc)UiX&s>aT8mf35#YeQ_L32Avyqbs2NIeBN)_5{e$wGdhv%!|h$x{@I2MBUgrsVw zAm$f*)=5O;NnYo44G_%3dJnIRy|{&bl+J;R>Lh+jqKcyN9$>JKPHZau6{^S{52)c_ zH@qT*Lx#0~pl{G%t@l;V@$9|}b@CK{14ms5Z3uf2Mi34nj3e;t0Nx?Yw-bKhz!Q_M kMc9bIn=!8uta-X0Y3QpJ$;9tFtpYRd>myON?qtpX0Tb%^jQ{`u