《自拍教程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
也可關注“武散人”微信訂閱號,隨時接受文章推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章