伙伴云客服论坛»论坛 S区 S产品资讯 查看内容

0 评论

0 收藏

分享

常用办公脚本工具

1 前言

        本文基于 Android 自动化测试项目、adb常用命令总结,整理了一些常用办公脚本,后续会根据工作需求持续更新。
        脚本资源见→常用办公脚本工具
        脚本目录如下:
常用办公脚本工具-1.png


    base:根底工具包apply:详细应用场景
        注意:对于 apply 目录下所有文件的文件名,必需能在 phone.py 中找到同名的方法__init__.py 是一个空的文件(用于处置 ModuleNotFoundError 报错问题)
        用户在装置 python 解释器并配置好环境变量后,只需单击 apply 里面的 bat 文件,即可获取需要的信息,如:肃清当前翻开 app 的缓存数据、获取当前翻开 app 的装置包、获取当前翻开 app 的 paclage 和 activity、截屏、截虚拟屏、获取最近截屏或录屏文件等。
2 脚本

2.1 根底脚本

        phone.py
  1. import subprocess as sp
  2. import re
  3. import os
  4. # 手机类(封装了对手机的操作)
  5. class Phone:
  6.     # 初始化(connect:连接类型)
  7.     def __init__(self, connect_type="usb"):
  8.         self.get_device_id(connect_type)
  9.         self.model = self.get_phone_model()
  10.         self.size = self.get_phone_size()
  11.         self.vs_display_id = self.get_vs_display_id()
  12.         global bat_path
  13.         bat_path = os.path.abspath(os.path.abspath(os.path.dirname(__file__)) + "\\..\\apply") + "\"
  14.     # 获取设备 id(connect_type:连接类型)
  15.     def get_device_id(self, connect_type="usb"):
  16.         if connect_type == "usb":
  17.             self.id = self.get_device_id_by_usb()  # 通过 usb 连接设备
  18.         elif connect_type == "wifi":
  19.             self.ip = self.get_device_id_by_wifi()  # 通过 wifi 连接设备
  20.     # 通过 usb 连接获取设备id(程序运行期间需要坚持有线连接)
  21.     def get_device_id_by_usb(self):
  22.         rst = sp.check_output('adb devices')
  23.         id = re.findall("[A-Z0-9]{16}", str(rst))[0]
  24.         return id
  25.     # 通过 wifi 连接获取设备id(程序启动时需要有线连接,运行后可以断开数据线)
  26.     def get_device_id_by_wifi(self):
  27.         rst = sp.check_output('adb shell "ip addr | grep global"')
  28.         ip = re.findall("\d+.\d+.\d+.\d+", str(rst))[0]
  29.         return ip
  30.     # 获取手机型号
  31.     def get_phone_model(self):
  32.         rst = sp.check_output('adb shell getprop ro.product.model')
  33.         model = re.findall("\w+-\w+", str(rst))[0]
  34.         print(model)
  35.         return model
  36.     # 获取手机分辨率
  37.     def get_phone_size(self):
  38.         rst = sp.check_output('adb shell wm size')
  39.         str_size = re.findall("\d+", str(rst))
  40.         x = eval(str_size[0])
  41.         y = eval(str_size[1])
  42.         return (x, y)
  43.     # 获取 visual display id
  44.     def get_vs_display_id(self):
  45.         rst = sp.check_output('adb shell dumpsys activity activities')
  46.         displays = re.findall("Display #\d+", str(rst))
  47.         vs_id = -1
  48.         for e in displays:
  49.             id = eval(re.findall("\d+", e)[0])
  50.             if id > 0:
  51.                 vs_id = id
  52.                 break
  53.         return vs_id
  54.     # 截手机屏
  55.     def screenshot(self):
  56.         path = bat_path + "phone.png"
  57.         os.system("adb shell screencap -p /sdcard/1.png")
  58.         os.system("adb pull /sdcard/1.png " + path)
  59.     # 截虚拟屏
  60.     def screenshot_vs(self):
  61.         if self.vs_display_id > 0:
  62.             path = bat_path + "vs_" + str(self.vs_display_id) + ".png"
  63.             os.system("adb shell screencap -d " + str(self.vs_display_id) + " -p /sdcard/1.png")
  64.             os.system("adb pull /sdcard/1.png " + path)
  65.         else:
  66.             print("Visual display does not exist")
  67.     # 获取当前应用的 package 和 Activity
  68.     def get_pkg_activity(self):
  69.         rst = sp.check_output('adb shell dumpsys window | grep "mCurrentFocus"')
  70.         win = re.findall("\{.+\}", str(rst))[0]
  71.         activity = win.replace("}", "").split(" ")[-1]
  72.         pkg = activity.split("/")[0]
  73.         print("package:", pkg)
  74.         print("activity:", activity)
  75.         return [pkg, activity]
  76.     # 获取当前应用的装置途径
  77.     def get_install_path(self):
  78.         pkg, activity = self.get_pkg_activity()
  79.         rst = sp.check_output('adb shell pm path ' + pkg)
  80.         path = str(rst).split(":")[1].split("\")[0]
  81.         print("path:", path)
  82.         return path
  83.     # 获取当前应用的 apk
  84.     def get_apk(self):
  85.         path = self.get_install_path()
  86.         os.system("adb pull "+ path + " " + bat_path)
  87.     # 肃清当前应用的缓存数据
  88.     def clear_app_data(self):
  89.         pkg, activity = self.get_pkg_activity()
  90.         os.system("adb shell pm clear "+ pkg)
  91.         
  92.     # 获取最近一次截屏或录屏文件
  93.     def get_last_shot(self):
  94.         path = "/sdcard/Pictures/Screenshots/"
  95.         rst = sp.check_output("adb shell ls -all " + path)
  96.         files_all = str(rst).split("\\r\\n")[1:-1]
  97.         files = []
  98.         for file in files_all:
  99.             temp = file.split(" ")
  100.             if temp[-1] == "." or temp[-1] == ".." or temp[0][0] == "d":
  101.                 continue
  102.             files += [temp[-4] + "_" + temp[-3], temp[-1]]
  103.         if len(files) == 0:
  104.             print("there is no file in " + path)
  105.             return
  106.         last_time = files[0]
  107.         last_file = files[1]
  108.         for i in range(2, len(files), 2):
  109.             if files[i] > last_time:
  110.                 last_time = files[i]
  111.                 last_file = files[i+1]
  112.         print("last_time: " + last_time + ", last_file: " + last_file)
  113.         os.system("adb pull " + path + last_file)
复制代码
       说明:Phone 类中封装了对手机的操作,如:获取装置包、截屏、清应用数据、获取最近一次截屏或录屏文件等。
        invoke.py
  1. # 将项目根目录添加到系统途径中,防止在命令行运行此脚本时,报错:
  2. # ModuleNotFoundError: No module named 'py_script'
  3. import os
  4. import sys
  5. root_path = screen_shot_path = os.path.abspath(os.path.abspath(os.path.dirname(__file__)) + "\\..")
  6. sys.path.append(root_path)
  7. # 通过反射调用 Phone 的方法
  8. from base.phone import Phone
  9. ph = Phone()
  10. if hasattr(ph, sys.argv[1]):
  11.     fun = getattr(ph, sys.argv[1])
  12.     fun()
  13. else:
  14.     print("This method does not exist in Phoen ", sys.argv[1])
复制代码
       说明:sys.argv 指从命令行中获取的输入参数,如下,sys.argv[1] 指 get_apk。
  1. python invoke.py get_apk
复制代码
        transit.bat
  1. @echo off
  2. python ../base/invoke.py %1
  3. pause
复制代码
       说明:transit.bat 用于中转业务脚本的文件名,并回调 invoke.py,“%1” 指 invoke.bat 文件后跟随的第一个参数,如:在命令行输入如下内容,%1 指 get_pkg_activity。
  1. transit.bat get_pkg_activity
复制代码
2.2 应用

        1)获取 package 和 activity
        get_pkg_activity.bat
  1. ../base/transit.bat %~n0
复制代码
       说明:“%~n0” 指当前文件名,即“get_pkg_activity”。
        2)获取 apk
        get_apk.bat
  1. ../base/transit.bat %~n0
复制代码
        3)肃清应用缓存
        clear_app_data.bat
  1. ../base/transit.bat %~n0
复制代码
        4)截手机屏
        screenshot.bat
  1. ../base/transit.bat %~n0
复制代码
        5)截虚拟屏
        screenshot_vs.bat
  1. ../base/transit.bat %~n0
复制代码
        6)获取最近截图或录屏
        get_last_shot.bat
  1. ../base/transit.bat %~n0
复制代码

回复

举报 使用道具

上一篇: SaaS简单介绍

下一篇: SaaS

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

稳拿感情刀
注册会员
主题 12
回复 31
粉丝 0
|网站地图
快速回复 返回顶部 返回列表