本篇文章,主要介绍如何通过Python发送Ctrl + C的信号,中断正在执行的任务。
案例故事: Android系统测试或App测试过程中,
可以考虑用adb shell screenrecord /sdcard/video.mp4 命令录制屏幕视频,
比如录制某个Bug发生的整个过程,比用手机拍摄的视频效果好很多,
当录制完毕后,我们一般是通过Ctrl + C 来停止录制,然后导出该录屏文件,
其实我们可用Python脚本实现一键录屏。
准备阶段
- adb shell screenrecord /sdcard/video.mp4 可以录制屏幕视频。
- 由于以上录制屏幕视频的命令是一个持续输出的命令,
它如果没被中断,会一直持续录制下去,直到满3分钟, - os.system可以调用以上命令。
- 捕获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
也可关注“武散人”微信订阅号,随时接受文章推送。