最近在开发一个自动化测试工具时,需要记录用户在实际操作过程中的鼠标点击、滚动和键盘输入行为。这个需求源于我们需要分析用户在使用CAD软件时的交互模式,为后续开发VLA(Visual Learning Automation)模块做准备。通过Python实现的操作记录工具,能够以可视化方式保存用户的所有交互动作,这对UI自动化测试和用户行为分析非常有价值。
这个工具的核心功能是实时监听鼠标和键盘事件,并在每次操作时截取屏幕截图,用红圈标记点击位置,同时在图片上标注键盘按键信息。所有截图按日期和会话ID分类存储,便于后续分析。下面我将详细介绍这个工具的实现原理、代码解析以及实际应用中的优化技巧。
实现用户操作记录的关键在于建立可靠的事件监听系统。Python中有几个库可以实现这个功能,经过对比我选择了pynput库,原因如下:
监听器分为鼠标和键盘两部分:
python复制from pynput import mouse, keyboard
# 鼠标监听器
mouse_listener = mouse.Listener(on_click=on_click, on_scroll=on_scroll)
# 键盘监听器
keyboard_listener = keyboard.Listener(on_press=on_press)
截图功能使用pyautogui库实现,它提供了简单的跨平台截图接口。为了在截图上标注操作信息,我们使用Pillow库进行图像处理:
python复制import pyautogui
from PIL import ImageDraw, ImageFont
def save_screenshot(event_type, x=None, y=None, extra_info=""):
screenshot = pyautogui.screenshot()
draw = ImageDraw.Draw(screenshot)
if x is not None and y is not None:
# 绘制鼠标操作标记
draw.ellipse([x-RADIUS, y-RADIUS, x+RADIUS, y+RADIUS],
outline="red", width=3)
elif extra_info:
# 添加键盘操作文字标注
draw.text((100, 100), f"Key: {extra_info}", fill="red", font=font)
良好的文件组织对后续分析至关重要。我们的存储方案设计如下:
python复制import os
import uuid
from datetime import datetime
# 生成唯一会话ID和日期目录
session_uuid = str(uuid.uuid4())
current_date = datetime.now().strftime("%Y%m%d")
output_dir = os.path.join("output", "recoder_user", current_date, session_uuid)
os.makedirs(output_dir, exist_ok=True) # 自动创建目录
由于鼠标和键盘事件可能同时触发,我们需要确保截图保存操作是线程安全的:
python复制import threading
write_lock = threading.Lock()
def save_screenshot(...):
with write_lock: # 确保同一时间只有一个线程在执行保存操作
# 截图和保存代码
在实际使用中发现几个性能瓶颈点,并做了相应优化:
python复制# 优化后的字体处理
try:
font = ImageFont.truetype("arial.ttf", 100) # 提前加载
except:
font = None # 系统没有Arial字体时降级处理
这个工具在以下几个场景中特别有用:
在实际使用中可能会遇到以下问题:
权限问题:某些系统需要辅助功能权限
多显示器支持:截图可能只捕获主屏幕
高DPI缩放:标记位置可能不准确
python复制# 获取Windows系统缩放比例(示例)
import ctypes
scale = ctypes.windll.shcore.GetScaleFactorForDevice(0) / 100
x, y = int(x*scale), int(y*scale)
根据实际项目需求,可以考虑添加以下扩展功能:
python复制# 简单的操作时长统计示例
start_time = time.time()
# ...操作发生后...
duration = time.time() - start_time
print(f"操作耗时: {duration:.2f}秒")
在开发这个工具的过程中,积累了一些有价值的经验:
一个实用的技巧是添加配置文件支持,让用户可以根据需要调整参数:
python复制# config.ini示例
[settings]
circle_radius = 30
circle_color = red
output_quality = 80 # 图片质量百分比
在CAD软件自动化测试项目中,这个工具帮助我们发现了几个关键问题:
这些发现直接指导了我们优化软件界面设计和改进自动化脚本。