常用办公脚本工具
Posted little_fat_sheep
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用办公脚本工具相关的知识,希望对你有一定的参考价值。
1 前言
本文基于 Android 自动化测试项目、adb常用命令总结,整理了一些常用办公脚本,后续会根据工作需求持续更新。
脚本资源见→常用办公脚本工具
脚本目录如下:
- base:基础工具包
- apply:具体应用场景
注意:对于 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。
python invoke.py 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
../base/transit.bat %~n0
说明:“%~n0” 指当前文件名,即“get_pkg_activity”。
2)获取 apk
get_apk.bat
../base/transit.bat %~n0
3)清除应用缓存
clear_app_data.bat
../base/transit.bat %~n0
4)截手机屏
screenshot.bat
../base/transit.bat %~n0
5)截虚拟屏
screenshot_vs.bat
../base/transit.bat %~n0
6)获取最近截图或录屏
get_last_shot.bat
../base/transit.bat %~n0
声明:本文转自常用办公脚本工具
以上是关于常用办公脚本工具的主要内容,如果未能解决你的问题,请参考以下文章
powershell Boxstarter脚本安装基本的办公工具