访问被拒绝,你可能没有权限或未登录,或者你还在新人期。
OldTimeRoad
纯粹的移动端录制工具,帮助你找回重现 bug 的老路
说明
痛点
业务测试过程中,总会遇到一些预料之外的 bug,当想要再次复现时,却发现早已忘记之前的操作步骤,无法将 bug 重现。
功能特性
OldTimeRoad 将每一次屏幕点击事件以截图的方式进行保存,通过 flask 网页服务以时间倒序展示对应的截图,值得一提的是,截图中的⭕️即为当时的点击位置
图片展示
路径:桌面——设置——显示

GIF 展示
路径:设置——提示音和通知——手机铃声——手机铃声弹窗:无——手机铃声弹窗:Sceptrum——确定

优势
不影响测试效率
启动服务后将自动监听点击事件并截图,用户无需增加额外的工作量
轻量
以截图的方式唤醒用户的操作记忆,而非使用脚本重新执行整个流程
不用维护
抛弃了传统的录制回放概念,舍弃了回放这一非必要的功能,若没有出现 bug,则直接清空截图即可,无需花费精力维护
实现方案
- adb getevents:监听屏幕点击事件
- adb screencap:截图
- opencv:绘画出屏幕点击的位置
使用说明
- github 拉取代码,安装 requirements.txt 依赖
- 连接移动端设备/使用模拟器,命令行输入 adb devices 需存在设备
- 执行 main.py 文件——用于监听设备屏幕点击事件
- 执行 app.py 文件——用于启动网页服务,通过http://127.0.0.1:8080/ 展示屏幕截图列表
ps:目前仅支持安卓端单机
github 地址
https://github.com/Jennypopping/OldTimeRoad
「原创声明:保留所有权利,禁止转载」

直接通过 adb shell getevent -l 获取的坐标测试发现有的手机坐标不对(12、13 系统的手机会存在此问题),得通过 adb 命令换算一下,拿到换算的值再乘以 adb shell getevent -l 返回的坐标
点击坐标换算
def get_click_point_value():
# 判断系统类型,执行不同的命令
sys = get_user_platform()
if sys:
device_info_w = subprocess.Popen('adb shell getevent -p | findstr "0035"', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
max_w = re.compile(r'\d+').findall(str(device_info_w.communicate()[0]))[3]
device_info_w = subprocess.Popen('adb shell getevent -p | findstr "0036"', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
max_h = re.compile(r'\d+').findall(str(device_info_w.communicate()[0]))[3]
else:
device_info = subprocess.Popen('adb shell getevent -p | grep -e "0035" -e "0036"', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
max_w = re.compile(r'\d+').findall(str(device_info.communicate()[0]))[3]
max_h = re.compile(r'\d+').findall(str(device_info.communicate()[0]))[10]
device_wm_info = subprocess.run('adb shell wm size', shell=True, capture_output=True)
wm_list = device_wm_info.stdout.decode().split("x")
width = wm_list[0].split(":")[1]
height = wm_list[1].replace("\n", "")
rateW = round(int(width) / int(max_w), 2)
rateH = round(int(height) / int(max_h), 2)
return rateW, rateH
获取系统类型
def get_user_platform():
sys = platform.system()
if (sys == "Windows"):
return True
else:
return False
感谢回复,之前实现功能时用于测试的机型较少,后续会参考一下相关的内容做一下兼容~