开源测试工具 OldTimeRoad-纯粹的移动端录制工具

芜湖 · December 29, 2022 · Last by 芜湖 replied at March 22, 2023 · 2829 hits

OldTimeRoad

纯粹的移动端录制工具,帮助你找回重现 bug 的老路🕵

说明

痛点

业务测试过程中,总会遇到一些预料之外的 bug,当想要再次复现时,却发现早已忘记之前的操作步骤,无法将 bug 重现。

功能特性

OldTimeRoad 将每一次屏幕点击事件以截图的方式进行保存,通过 flask 网页服务以时间倒序展示对应的截图,值得一提的是,截图中的⭕️即为当时的点击位置

图片展示

路径:桌面——设置——显示

GIF 展示

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

优势

  1. 不影响测试效率
    启动服务后将自动监听点击事件并截图,用户无需增加额外的工作量

  2. 轻量
    以截图的方式唤醒用户的操作记忆,而非使用脚本重新执行整个流程

  3. 不用维护
    抛弃了传统的录制回放概念,舍弃了回放这一非必要的功能,若没有出现 bug,则直接清空截图即可,无需花费精力维护

实现方案

  1. adb getevents:监听屏幕点击事件
  2. adb screencap:截图
  3. opencv:绘画出屏幕点击的位置

使用说明

  1. github 拉取代码,安装 requirements.txt 依赖
  2. 连接移动端设备/使用模拟器,命令行输入 adb devices 需存在设备
  3. 执行 main.py 文件——用于监听设备屏幕点击事件
  4. 执行 app.py 文件——用于启动网页服务,通过http://127.0.0.1:8080/ 展示屏幕截图列表

ps:目前仅支持安卓端单机

github 地址👇

https://github.com/Jennypopping/OldTimeRoad

共收到 2 条回复 时间 点赞

直接通过 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

芜湖 #2 · March 22, 2023 Author

感谢回复,之前实现功能时用于测试的机型较少,后续会参考一下相关的内容做一下兼容~

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up