《自拍教程70》Python adb一键录屏

本篇文章,主要介绍如何通过Python发送Ctrl + C的信号,中断正在执行的任务。

案例故事: Android系统测试或App测试过程中,
可以考虑用adb shell screenrecord /sdcard/video.mp4 命令录制屏幕视频,
比如录制某个Bug发生的整个过程,比用手机拍摄的视频效果好很多,
当录制完毕后,我们一般是通过Ctrl + C 来停止录制,然后导出该录屏文件,

其实我们可用Python脚本实现一键录屏。


准备阶段
  1. adb shell screenrecord /sdcard/video.mp4 可以录制屏幕视频。
  2. 由于以上录制屏幕视频的命令是一个持续输出的命令,
    它如果没被中断,会一直持续录制下去,直到满3分钟,
  3. os.system可以调用以上命令。
  4. 捕获KeyboardInterrupt异常(即发送Ctrl + C中断信号),中断录制任务。

Python批处理脚本形式

记住批处理脚本的精髓: 顺序执行Python语句

import os

command = "adb shell screenrecord /sdcard/video.mp4"

try:
    print("后台录屏中,您可以Ctrl + C随时结束录制!")
    os.system(command)  # 开始执行adb录屏命令, 如果不做任何操作,默认最多录制3分钟(180秒)
except KeyboardInterrupt:  # 随时接收Ctrl + C的信号
    os.system("adb pull /sdcard/video.mp4 .")  # # 导出视频文件来

print("录制结束,录屏文件导出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
os.system("pause")

Python面向过程函数形式

找到可以封装成一个函数块的小代码块儿, 用函数封装起来.
函数的命名一般建议用"动词", 所以我们命名为: "record_screen",
封装好后, 用record_screen()函数调用即可。

# coding=utf-8
import os


def record_screen():
    command = "adb shell screenrecord /sdcard/video.mp4"
    try:
        print("后台录屏中,您可以Ctrl + C随时结束录制!")
        os.system(command)  # 开始执行adb录屏命令, 如果不做任何操作,默认最多录制3分钟(180秒)
    except KeyboardInterrupt:  # 随时接收Ctrl + C的信号
        os.system("adb pull /sdcard/video.mp4 .")  # # 导出视频文件来
    print("录制结束,录屏文件导出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))


record_screen()
os.system("pause")


Python面向对象形式

以"一切皆可归类"的思想, 先抽象化出一个类来,
类名一般建议用"名词", 所以我们命名为"ScreenRecorder",
代表屏幕录制器, 且一般要驼峰式(首字母大写)来规范类的命名.
养成良好的类的初始化(init)的习惯,
初始化过程中, 可以pass(什么都不做)
这个ScreenRecorder 类, 目前只需要一个录屏的函数(动作功能)就足够了,
函数的命名一般建议用"动词", 所以我们命名为: "record_screen" .
类是一个抽象的事物, 必须实例化成具体的对象后,
才能进行调用, 所以我们实例化并命名成了s_obj, 表明是一个对象.
实例化成具体对象后, 对象就可以调用record_screen这个函数了.

# coding=utf-8
import os


class ScreenRecorder():
    def __init__(self):
        self.command = "adb shell screenrecord /sdcard/video.mp4"

    def record_screen(self):
        try:
            print("后台录屏中,您可以Ctrl + C随时结束录制!")
            os.system(self.command)  # 开始执行adb录屏命令, 如果不做任何操作,默认最多录制3分钟(180秒)
        except KeyboardInterrupt:  # 随时接收Ctrl + C的信号
            os.system("adb pull /sdcard/video.mp4 .")  # # 导出视频文件来
        print("录制结束,录屏文件导出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))


if __name__ == '__main__':
    s_obj = ScreenRecorder()
    s_obj.record_screen()
    os.system("pause")

代码运行方式与效果

确保Android设备通过USB线与电脑连接了,adb设备有效连接,
以上代码的3种实现形式都可以直接运行,比如保存为screen_record.py并放在桌面,
建议python screen_record.py运行,当然也可以双击运行。


小提示:本来更科学的方法应该是用subprocess.Popen()类的send_signal(signal.CTRL_C_EVENT)函数来实现Ctrl + C,
但是发现并不能实现Ctrl + C信号,所以最终还是捕获KeyboardInterrupt异常这种方式实现,
subprocess.Popen()类功能还是很强大的,后续案例还会介绍到。


更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=04ecbd58cb304d0fa1c2034ccaa3260d
也可关注“武散人”微信订阅号,随时接受文章推送。

原文地址:https://www.cnblogs.com/zipython/p/13105174.html