【python自动化测试】scrcpy 将手机屏幕投屏到电脑后,进行录屏操作

由于app自动化测试新增需求,每轮自动化测试过程都需要分开录屏保存,方便出现异常时,研发分析异常现象。在网上找了很久,发现scrcpy 有投屏到电脑和录制视频功能,刚好可以满足这个需求。
scrcpy下载地址:https://github.com/Genymobile/scrcpy

下载完成之后将scrcpy地址添加到环境变量,方便cmd里面直接输入指令进行投屏。

scrcpy常用指令:
这里我就不找了,直接在AI搜索

你可以在启动Scrcpy时,在 scrcpy 基础命令后添加以下参数来控制其行为。

指令分类 指令/参数 说明与示例
基本连接
scrcpy 使用默认设置启动并连接设备。
scrcpy -s <设备序列号> 连接指定设备(当连接了多个设备时使用)。
scrcpy --tcpip 通过无线网络连接设备(需先用USB完成首次设置)。
显示设置
scrcpy -f 以全屏模式启动。
scrcpy -m 1024 将镜像的最大分辨率限制为1024像素。
scrcpy -S 启动时关闭手机屏幕以省电。
scrcpy --show-touches 在镜像上显示触摸轨迹,适合演示。
scrcpy --crop 宽:高:横偏移:纵偏移 裁剪显示部分屏幕,例如 --crop 800:800:0:0。
性能与录制
scrcpy -b 2M 设置视频比特率为2Mbps,可平衡画质与流畅度。
scrcpy --max-fps 30 限制最大帧率。
scrcpy -r file.mp4 录制屏幕到指定文件。
scrcpy -Nr file.mp4 仅录制屏幕而不显示镜像窗口。
文件与交互
scrcpy -n 只读模式,禁用电脑的鼠标键盘控制。
scrcpy -w 连接期间保持设备唤醒(不锁屏)。
窗口设置
scrcpy --always-on-top 使镜像窗口始终位于其他窗口之上。
scrcpy --window-title <标题> 自定义镜像窗口的标题。
scrcpy --window-borderless 使用无边框窗口。
实时控制快捷键
在Scrcpy镜像窗口激活时,可以使用以下快捷键进行实时操作(MOD键默认为 Alt 或 左Win/Command 键)。

功能 快捷键
切换全屏 MOD + f
返回键 MOD + b
主屏幕键 MOD + h
多任务键 MOD + s
打开/关闭设备屏幕 MOD + p
仅关闭设备屏幕(保持镜像) MOD + o
复制设备剪贴板到电脑 MOD + c
粘贴电脑剪贴板到设备 MOD + v
旋转设备屏幕 MOD + r
展开通知面板 MOD + n

可以使用subprocess输入cmd指令,开始进行屏幕录制(由于我要做成非阻塞式的,所以使用subprocess.Popen不用subprocess.run)

点击查看代码
import os
import sys
import subprocess
file_path = os.path.dirname(sys.argv[0]) + '/录屏测试.mp4'
subprocess.Popen(['scrcpy', '-b', '2M', '--max-fps', '30', '-r', file_path], stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE,
                 text=True)
这样就能有录屏进程了,但是我需要在脚本运行一轮后停止录屏后保存,现在需要的是如何停止,虽然subprocess.Popen对象有结束进程的方法, 但是我使用后,录下来的视频都无法打开,可能是自己结束进程的话就会出现异常,只能使用其他方的方法来结束这个进程,然后我在网上找方法,使用了python的pywin32库的方法来结束录屏进程, 终于录制的视频能正常打开了!

pywin32 安装:pip install pywin32

所以我把脚本写成:

点击查看代码
import os
import sys
import subprocess
import win32api
import win32con
file_path = os.path.dirname(sys.argv[0]) + '/录屏测试.mp4'
process = subprocess.Popen(['scrcpy', '-b', '2M', '--max-fps', '30', '-r', file_path], stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE,
                 text=True)

time.sleep(10)
if process.poll() is None:  # 如果进程在执行
    win32api.GenerateConsoleCtrlEvent(win32con.CTRL_C_EVENT, process.pid)   # 发送ctrl c 指令

这样我们就能得到10s的录屏视频了,中间的等待时长可以换成测试脚本,
最后加上结果判定,如果需要保存视频,就不变,如果不需要保存视频就使用os.remove("文件路径")来删除视频文件,
但是这样强制结束进程,会有KeyboardInterrupt报错,如果我们后面还有代码的话,就要先接收这个报错,不然后面的代码不会执行。
所以我把代码改成:

点击查看代码
import os
import sys
import subprocess
import win32api
import win32con
file_path = os.path.dirname(sys.argv[0]) + '/录屏测试.mp4'
process = subprocess.Popen(['scrcpy', '-b', '2M', '--max-fps', '30', '-r', file_path], stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE,
                 text=True)

time.sleep(10)
if process.poll() is None:  # 如果进程在执行
  try:
    win32api.GenerateConsoleCtrlEvent(win32con.CTRL_C_EVENT, process.pid)   # 发送ctrl c 指令
    time.sleep(1)
    time.sleep(1)
    time.sleep(1)  # 等待接收报错信息
  except KeyboardInterrupt:
    print('ctrl + c 指令已执行')

time.sleep(1)  # 需要删除文件前等待一段时间,不然内存还没有释放,会有file_path还在使用的报错
os.remove(file_path)

这样就能完成这个需求了。

posted @ 2025-12-02 16:13  NPC陈某某  阅读(0)  评论(0)    收藏  举报