1 前言
本文基于 Android 自动化测试项目、adb常用命令总结,整理了一些常用办公脚本,后续会根据工作需求持续更新。
脚本资源见→常用办公脚本工具
脚本目录如下:
注意:对于 apply 目录下所有文件的文件名,必需能在 phone.py 中找到同名的方法,__init__.py 是一个空的文件(用于处置 ModuleNotFoundError 报错问题)。
用户在装置 python 解释器并配置好环境变量后,只需单击 apply 里面的 bat 文件,即可获取需要的信息,如:肃清当前翻开 app 的缓存数据、获取当前翻开 app 的装置包、获取当前翻开 app 的 paclage 和 activity、截屏、截虚拟屏、获取最近截屏或录屏文件等。
2 脚本
2.1 根底脚本
phone.py- import subprocess as sp
- import re
- import os
- # 手机类(封装了对手机的操作)
- class Phone:
- # 初始化(connect:连接类型)
- def __init__(self, connect_type="usb"):
- self.get_device_id(connect_type)
- self.model = self.get_phone_model()
- self.size = self.get_phone_size()
- self.vs_display_id = self.get_vs_display_id()
- global bat_path
- bat_path = os.path.abspath(os.path.abspath(os.path.dirname(__file__)) + "\\..\\apply") + "\"
- # 获取设备 id(connect_type:连接类型)
- def get_device_id(self, connect_type="usb"):
- if connect_type == "usb":
- self.id = self.get_device_id_by_usb() # 通过 usb 连接设备
- elif connect_type == "wifi":
- self.ip = self.get_device_id_by_wifi() # 通过 wifi 连接设备
- # 通过 usb 连接获取设备id(程序运行期间需要坚持有线连接)
- def get_device_id_by_usb(self):
- rst = sp.check_output('adb devices')
- id = re.findall("[A-Z0-9]{16}", str(rst))[0]
- return id
- # 通过 wifi 连接获取设备id(程序启动时需要有线连接,运行后可以断开数据线)
- def get_device_id_by_wifi(self):
- rst = sp.check_output('adb shell "ip addr | grep global"')
- ip = re.findall("\d+.\d+.\d+.\d+", str(rst))[0]
- return ip
- # 获取手机型号
- def get_phone_model(self):
- rst = sp.check_output('adb shell getprop ro.product.model')
- model = re.findall("\w+-\w+", str(rst))[0]
- print(model)
- return model
- # 获取手机分辨率
- def get_phone_size(self):
- rst = sp.check_output('adb shell wm size')
- str_size = re.findall("\d+", str(rst))
- x = eval(str_size[0])
- y = eval(str_size[1])
- return (x, y)
- # 获取 visual display id
- def get_vs_display_id(self):
- rst = sp.check_output('adb shell dumpsys activity activities')
- displays = re.findall("Display #\d+", str(rst))
- vs_id = -1
- for e in displays:
- id = eval(re.findall("\d+", e)[0])
- if id > 0:
- vs_id = id
- break
- return vs_id
- # 截手机屏
- def screenshot(self):
- path = bat_path + "phone.png"
- os.system("adb shell screencap -p /sdcard/1.png")
- os.system("adb pull /sdcard/1.png " + path)
- # 截虚拟屏
- def screenshot_vs(self):
- if self.vs_display_id > 0:
- path = bat_path + "vs_" + str(self.vs_display_id) + ".png"
- os.system("adb shell screencap -d " + str(self.vs_display_id) + " -p /sdcard/1.png")
- os.system("adb pull /sdcard/1.png " + path)
- else:
- print("Visual display does not exist")
- # 获取当前应用的 package 和 Activity
- def get_pkg_activity(self):
- rst = sp.check_output('adb shell dumpsys window | grep "mCurrentFocus"')
- win = re.findall("\{.+\}", str(rst))[0]
- activity = win.replace("}", "").split(" ")[-1]
- pkg = activity.split("/")[0]
- print("package:", pkg)
- print("activity:", activity)
- return [pkg, activity]
- # 获取当前应用的装置途径
- def get_install_path(self):
- pkg, activity = self.get_pkg_activity()
- rst = sp.check_output('adb shell pm path ' + pkg)
- path = str(rst).split(":")[1].split("\")[0]
- print("path:", path)
- return path
- # 获取当前应用的 apk
- def get_apk(self):
- path = self.get_install_path()
- os.system("adb pull "+ path + " " + bat_path)
- # 肃清当前应用的缓存数据
- def clear_app_data(self):
- pkg, activity = self.get_pkg_activity()
- os.system("adb shell pm clear "+ pkg)
-
- # 获取最近一次截屏或录屏文件
- def get_last_shot(self):
- path = "/sdcard/Pictures/Screenshots/"
- rst = sp.check_output("adb shell ls -all " + path)
- files_all = str(rst).split("\\r\\n")[1:-1]
- files = []
- for file in files_all:
- temp = file.split(" ")
- if temp[-1] == "." or temp[-1] == ".." or temp[0][0] == "d":
- continue
- files += [temp[-4] + "_" + temp[-3], temp[-1]]
- if len(files) == 0:
- print("there is no file in " + path)
- return
- last_time = files[0]
- last_file = files[1]
- for i in range(2, len(files), 2):
- if files[i] > last_time:
- last_time = files[i]
- last_file = files[i+1]
- print("last_time: " + last_time + ", last_file: " + last_file)
- os.system("adb pull " + path + last_file)
复制代码 说明:Phone 类中封装了对手机的操作,如:获取装置包、截屏、清应用数据、获取最近一次截屏或录屏文件等。
invoke.py- # 将项目根目录添加到系统途径中,防止在命令行运行此脚本时,报错:
- # ModuleNotFoundError: No module named 'py_script'
- import os
- import sys
- root_path = screen_shot_path = os.path.abspath(os.path.abspath(os.path.dirname(__file__)) + "\\..")
- sys.path.append(root_path)
- # 通过反射调用 Phone 的方法
- from base.phone import Phone
- ph = Phone()
- if hasattr(ph, sys.argv[1]):
- fun = getattr(ph, sys.argv[1])
- fun()
- else:
- print("This method does not exist in Phoen ", sys.argv[1])
复制代码 说明:sys.argv 指从命令行中获取的输入参数,如下,sys.argv[1] 指 get_apk。 transit.bat- @echo off
- python ../base/invoke.py %1
- pause
复制代码 说明:transit.bat 用于中转业务脚本的文件名,并回调 invoke.py,“%1” 指 invoke.bat 文件后跟随的第一个参数,如:在命令行输入如下内容,%1 指 get_pkg_activity。- transit.bat get_pkg_activity
复制代码 2.2 应用
1)获取 package 和 activity
get_pkg_activity.bat 说明:“%~n0” 指当前文件名,即“get_pkg_activity”。
2)获取 apk
get_apk.bat 3)肃清应用缓存
clear_app_data.bat 4)截手机屏
screenshot.bat 5)截虚拟屏
screenshot_vs.bat 6)获取最近截图或录屏
get_last_shot.bat |