常用办公脚本工具

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脚本安装基本的办公工具

常用开发办公工具

python常用小脚本总结

知乎上有个热门问题,Python 未来会成为大众办公常用编程工具吗?

常用网址链接

有哪些可以极大提高工作效率的办公神器值得推荐?