多设备monkey测试工具_基于Tkinter GUI操作

article/2025/9/11 1:01:03

V1.0版本

先看下效果吧:

简单的介绍下:

1.设备列表区域:用于展示当前连接的所有设备

2.monkey参数区域:用于显示即将执行的monkey参数

3.日志区域:用于显示必要日志(其实没啥卵用,就是看着高大上点)

操作流程:

1.刷新设备,获取当前连接的所有设备(必须)

2.填写monkey参数:

  a).package:手动填写需要跑的APP包名;自动获取,需要现在左侧点击选择一台设备,打开设备上需要获取包名的应用,然后点击“获取包名”即可。

  b).seed:随机值,默认取当前日期,这个纯属个人习惯

  c).Throttle:操作间隔,大家都懂。。。

  d).Count:总的操作次数,我默认的50万,感觉这个差不多吧。

 3.点击“RUN”就好了,所有设备都会跑起来

4.没做离线功能,所以还是需要连着数据线的

结果查看:

  同目录下会生成一个result文件夹,里面包括Crash日志、内存日志、monkeylog信息,直接取就好了

代码:

import glob
import json
import logging
import os
import re
import time
import tkinter as tk
import tkinter.messageboxwindow = tk.Tk()window.title("Demo APP")width = 640
height = 730# 设置窗口适应属性
window.resizable(width=False, height=False)
window.attributes("-alpha",0.7)
window.attributes('-toolwindow', False, '-alpha', 1, '-fullscreen', False, '-topmost', True)
# window.overrideredirect(True)  # 获取当前屏幕分辨率
screenwidth = window.winfo_screenwidth()  
screenheight = window.winfo_screenheight() # 根据分辨率设置窗口大小
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/1, (screenheight-height)/5)
window.geometry(alignstr)# ----frame-----
frame_main1 = tk.Frame(window, bg = "#F2F2F2", height=100, width=360)
frame_main1.grid(column=1,row=1,padx=10,pady=10)frame_main2 = tk.Frame(window, bg = "#F2F2F2", height=100, width=400)
frame_main2.grid(column=2,row=1)frame_main3 = tk.Frame(window, bg = "#F2F2F2", height=200, width=370)
frame_main3.grid(column=1,row=2)frame_main4 = tk.Frame(window, bg ="#F2F2F2", height=200, width=360)
frame_main4.grid(column=2,row=2)frame_main5 = tk.Frame(window, bg = "#F2F2F2", height=300, width=720)
frame_main5.grid(column=1,row=3,columnspan=2,padx=15,pady=15)# -----menu菜单功能,暂时不要后续添加--------
# meun_main = tk.Menu()
# # meun_main.grid()
# filemenu = tk.Menu(meun_main, tearoff=1)
# meun_main.add_cascade(label='File', menu=filemenu)
# filemenu.add_command(label='Monkey')
# filemenu.add_command(label='Screen')
# filemenu.add_command(label='Instructions')
# filemenu.add_command(label='About')
# window.config(menu = filemenu)# -------Log缓存区域,显示自定义日志--------
lable_log=tk.Label(frame_main5,text="日志区",font = ("微软雅黑",14))
lable_log.grid(column=1,row=1)text_log = tk.Text(frame_main5,bg="#5B5B5B",fg="#FFFFFF")
text_log.grid(column=1,row=2)def clear_log():text_log.delete("1.0","end")button_clearLog = tk.Button(frame_main5,text="Clear",font = ("微软雅黑",8),bg="#836FFF", fg= "#FFFFFF",command=clear_log)
button_clearLog.grid(column=2,row=2,sticky="n")# text_log.insert("end","adasd21dadd")# ------主页lable显示引导---------------
# 刷新设备说明
lable_main1 = tk.Label(frame_main1, justify="left", height=5, width=35, bg="#E5E5E5", font = ("微软雅黑",10), text="准备工作:\n1.进入开发者选项打开测试机USB调试功能\n2.点击刷新设备\n3.手机端确认USB调试(若未提示则跳过此步骤)\n4.设备连接成功")
lable_main1.grid()
# monkey参数说明
lable_main2 = tk.Label(frame_main2, justify="left", height=5, width=40, bg="#E5E5E5", font = ("微软雅黑",10), text="参数说明:\n1.Package:包名,可点击获取,也可以手动输入\n2.Seeds:随机值,默认取当天日期,也可手动输入\n3.Throttle:点击频率,默认300ms,可手动输入\n4.Count:总操作数,默认50万,可手动修改")
lable_main2.grid()# ----listbox用于显示当前设备列表-----
lb = tk.Listbox(frame_main3,height=9, width=28, bg="#CDCDB4", fg="#551A8B")
lb.grid(column=0,row=0,padx=10,pady=10)# -----frame4上的参数配置-----
lab1 = tk.Label(frame_main4,text="配置项",bg="#F2F2F2",font=(11))
lab2 = tk.Label(frame_main4,text="Package",bg="#F2F2F2" )
lab3 = tk.Label(frame_main4,text="Seeds",bg="#F2F2F2" )
lab4 = tk.Label(frame_main4,text="Throttle",bg="#F2F2F2" )
lab5 = tk.Label(frame_main4,text="Count",bg="#F2F2F2" )
lab6 = tk.Label(frame_main4,text="参数",bg="#F2F2F2",font=(11) )  #第二列标题哦lab1.grid(column=1,row=1,padx=5,pady=5)
lab2.grid(column=1,row=2,padx=5,pady=5,sticky="w")
lab3.grid(column=1,row=3,padx=5,pady=5,sticky="w")
lab4.grid(column=1,row=4,padx=5,pady=5,sticky="w")
lab5.grid(column=1,row=5,padx=5,pady=5,sticky="w")
lab6.grid(column=2,row=1,padx=1,pady=1)# -----entry monkey参数配置-------
entry1 = tk.Entry(frame_main4)
entry2 = tk.Entry(frame_main4)
entry3 = tk.Entry(frame_main4)
entry4 = tk.Entry(frame_main4)entry1.grid(column=2,row=2,padx=5,pady=1,sticky="w")
entry2.grid(column=2,row=3,padx=5,pady=1,sticky="w")
entry3.grid(column=2,row=4,padx=5,pady=1,sticky="w")
entry4.grid(column=2,row=5,padx=5,pady=1,sticky="w")# ------一些可能用到的全局变量------
select_var = ""
pkg_details = ""
button_state = ""
model_name = ""
# 创建一个空list存储设备
list_device = []
# monkey配置参数
p = ""
s = ""
t = ""
c = ""def find_and_init():# def find_devices():global list_device,model_namelist_device.clear()logging.basicConfig(level=logging.INFO)d_lists = os.popen("adb devices").readlines()logging.error(d_lists)d_lists.remove(d_lists[len(d_lists)-1])d_lists.remove(d_lists[0])lb.delete("0","end")logging.info(d_lists)# time.sleep(3)if len(d_lists)==0:lb.insert("end","未检测到设备,请连接测试机...")text_log.insert("end","未检测到设备,请连接测试机...\n")text_log.yview_moveto(1)text_log.update()elif "unauthorized" in d_lists[0]:lb.insert("end","请在手机上点击允许USB调试...")text_log.insert("end","请在手机上点击允许USB调试...\n")text_log.yview_moveto(1)text_log.update()else:text_log.insert("end","设备已连接,请选择设备进行后续操作!\n\n")text_log.yview_moveto(1)text_log.update()for i in d_lists:reg_serial = re.findall("(.*?)device", i)model_org = os.popen("adb -s "+str(reg_serial[0])+" shell getprop ro.product.model").readlines()logging.info(reg_serial[0].replace("\t","")+":"+model_org[0].replace("\n",""))# 将设备信息添加到listbox中per_list = reg_serial[0].replace("\t","")print("设备列表为:",per_list)os.system("adb -s "+str(per_list)+" logcat -c")lb.insert("end",model_org[0].replace("\n","").replace(" ","")+":"+per_list)model_name = model_org[0].replace("\n","").replace(" ","")list_device.append(per_list)# ------读写配置文件-----------# def init_config():entry1.delete(0,"end")entry2.delete(0,"end")entry3.delete(0,"end")entry4.delete(0,"end")# time.sleep(3)if os.path.exists("config.json"):with open('config.json',encoding="utf-8") as ff:json_data = json.load(ff)entry1.insert("end",json_data["pkg"])entry2.insert("end", time.strftime("%Y%m%d%H%M%S", time.localtime())[2:8])entry3.insert("end", json_data["thr"])entry4.insert("end", json_data["total"])else:config_file = open('config.json','w',encoding='utf-8')# json_data = {"pkg":"请在此处填写包名...","sd":time.strftime("%Y%m%d%H%M%S", time.localtime())[2:8],"thr":"300","total":"500000"}json_data = {"pkg":"请在此处填写包名...", "thr":"300","total":"500000"}json.dump(json_data,config_file,ensure_ascii=False)config_file.close()# p=entry1.get()# s=entry2.get()# t=entry3.get()# c=entry4.get()#  -----------按钮事件--------
# 刷新设备按钮
button = tk.Button(frame_main3,text="刷新设备",font = ("微软雅黑",15),bg="#8FBC8F", fg= "#FFFFFF", command=find_and_init)
button.grid(column=0,row=1)# --------获取当前包名---------
def get_pkg():global select_varglobal pkg_detailslogging.info(select_var)# global select_varselected=lb.get(lb.curselection())print("我也不知道这里会不会报错 ",selected)print("原始的",selected,type(selected))reg_device=".*?:(.*)"select_device = re.findall(reg_device, selected)print("选择的设备是",select_device[0])select_var=select_device[0]try:cur = os.popen("adb -s "+str(select_var)+" shell dumpsys window | findstr mCurrentFocus").readline()result=re.findall("mCurrentFocus=Window{.*?u0 (.*?)/.*?}", cur)pkg_details = result[0]logging.info(cur)except IndexError:entry1.delete(0,"end")entry1.insert("end","获取失败...")tk.messagebox.showerror("Error了吧,哈哈哈!","请注意:\n  1.确认设备已经连接。\n  2.需要获取包名的应用处于前台状态!")entry1.delete(0,"end")entry1.insert("end","点击重试...")except TypeError:entry1.delete(0,"end")entry1.insert("end","未选择设备哦!")tk.messagebox.showerror("Error,这个不是Bug...","没有选择设备哦!")entry1.delete(0,"end")entry1.insert("end","点击重试...")else:entry1.delete(0,"end")entry1.insert("end",pkg_details)text_log.insert("end","获取包名成功!!!\n\n")text_log.yview_moveto(1)text_log.update()def run_monkey():now_time = time.strftime("%Y%m%d%H%M%S", time.localtime())[4:12]if not os.path.exists("./Result/"+str(now_time)):text_log.insert("end","创建必要资源文件夹....\n\n")text_log.yview_moveto(1)text_log.update()os.makedirs("./Result/"+str(now_time))if not os.path.exists("./script/"+str(now_time)):text_log.insert("end","创建必要资源文件夹....\n\n")text_log.yview_moveto(1)text_log.update()os.makedirs("./script/"+str(now_time))global p,s,t,cp=entry1.get()s=entry2.get()t=entry3.get()c=entry4.get()global button_statebutton_state = "disabled"print(pkg_details)text_log.insert("end","即将开始初始化资源,请稍等...\n")if len(list_device)>0:if entry1.get() in (u"请在此处填写包名...",""):tk.messagebox.showerror("你又错了!!!","不出意外的话你包名肯定不对!!")else:for d in list_device:bat_monkey = str(d[:8])+"_monkey_"+str(pkg_details)+".bat"with open ("script\\"+str(now_time)+"\\"+bat_monkey, "w") as f:text_log.insert("end","生成"+str(d)+"---monkey脚本...\n")text_log.yview_moveto(1)text_log.update()f.write('@echo off\necho start  monkey test\ntitle Monkey\nadb -s '+str(d)+' shell monkey -s '+str(s)+' -p '+str(p)+' --throttle '+str(t)+' --ignore-crashes --ignore-native-crashes --ignore-security-exceptions --ignore-timeouts --monitor-native-crashes -v -v -v '+str(c)+' > ./Result/'+str(now_time)+'/'+str(d[:8])+'_monkey.log')bat_fc = str(d[:8])+"_fc_"+str(pkg_details)+".bat"with open ("script\\"+str(now_time)+"\\"+bat_fc, "w") as ff:text_log.insert("end","生成"+str(d)+"---crash监控脚本...\n")text_log.yview_moveto(1)text_log.update()ff.write('@echo off\necho Start collecting crash logs\ntitle Crash\nadb -s '+str(d)+' logcat -s AndroidRuntime > ./Result/'+str(now_time)+'/'+str(d[:8])+'_crash.log')bat_memory = str(d[:8])+"_memory_"+str(pkg_details)+".bat"with open ("script\\"+str(now_time)+"\\"+bat_memory, "w") as fff:text_log.insert("end","生成"+str(d)+"---内存监控脚本...\n\n")text_log.yview_moveto(1)text_log.update()fff.write('@echo off\necho Start collecting memory logs\ntitle Memory\n:memory\nadb -s '+str(d)+' shell dumpsys meminfo '+str(p)+' | findstr TOTAL: > ./Result/'+str(now_time)+'/'+str(d[:8])+'_memory.log\nping -n 30 127.0.0.1>nul\ngoto memory')bat_finally = glob.glob("script\\"+str(now_time)+"\\*.bat")print("最终的bat有",bat_finally)time.sleep(2)text_log.insert("end","一切准备就绪,即将启动所有骚操作!!!\n\n")text_log.yview_moveto(1)text_log.update()text_log.insert("end","\n包名:"+p)text_log.insert("end","\nseeds值:"+s)text_log.insert("end","\nthrottle值:"+t)text_log.insert("end","\n总测试数:"+c)for gogo in bat_finally:os.system("start "+gogo)time.sleep(1)else:# len(list_device)==0:tk.messagebox.showerror("你又错了!!!","请注意:\n  1.确认设备已经连接。\n  2.确认包名不为空!!")# 获取包名按钮
button_getpkg = tk.Button(frame_main4,text="获取包名", fg= "#FFFFFF",font = ("",9),bg="#8FBC8F",command=get_pkg)
button_getpkg.grid(column=3,row=2,padx=5,pady=5,sticky="w")
notice_lable = tk.Label(frame_main4,text="获取包名前,\n先选择设备。", justify="left",fg="red")
notice_lable.grid(column=3,row=3)button_make_res = tk.Button()# Monkey启动按钮
if button_state == "disabled":button_runmonkey = tk.Button(frame_main4,text="Run!!!",state="disabled", fg= "#FFFFFF",font = ("微软雅黑",15),bg="#8FBC8F",command=run_monkey)button_runmonkey.grid(column=2,row=7,padx=25,pady=5,sticky="w")
else:button_runmonkey = tk.Button(frame_main4,text="Run!!!", fg= "#FFFFFF",font = ("微软雅黑",15),bg="#8FBC8F",command=run_monkey)button_runmonkey.grid(column=2,row=7,padx=25,pady=5,sticky="w")button_state = "disabled"window.mainloop()

V2.0版本 

更新日志:

1.新增支持离线脱机测试,monkey开启后等待5s左右拔掉数据线即可

2.新增支持一键导出测试结果

3.暂不支持多设备同时执行了

import glob
import json
import logging
import os
import re
import time
import tkinter as tk
import tkinter.messagebox
from tkinter.filedialog import askdirectoryimport _threadwindow = tk.Tk()window.title("便捷monkey测试工具")width = 670
height = 730# 设置窗口适应属性
window.resizable(width=False, height=False)
window.attributes("-alpha",0.7)
window.attributes('-toolwindow', False, '-alpha', 1, '-fullscreen', False, '-topmost', True)
# window.overrideredirect(True)  # 获取当前屏幕分辨率
screenwidth = window.winfo_screenwidth()  
screenheight = window.winfo_screenheight() # 根据分辨率设置窗口大小
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/1, (screenheight-height)/5)
window.geometry(alignstr)# ----frame-----
frame_main1 = tk.Frame(window, bg = "#F2F2F2", height=100, width=360)
frame_main1.grid(column=1,row=1,padx=10,pady=10)frame_main2 = tk.Frame(window, bg = "#F2F2F2", height=100, width=400)
frame_main2.grid(column=2,row=1)frame_main3 = tk.Frame(window, bg = "#F2F2F2", height=200, width=370)
frame_main3.grid(column=1,row=2)frame_main4 = tk.Frame(window, bg ="#F2F2F2", height=200, width=360)
frame_main4.grid(column=2,row=2)frame_main5 = tk.Frame(window, bg = "#F2F2F2", height=300, width=720)
frame_main5.grid(column=1,row=3,columnspan=2,padx=15,pady=15)# 选择路径的frame
# frame_main6 = tk.Frame(window, bg = "#F2F2F2", height=300, width=720)
# frame_main6.grid(column=1,row=4,columnspan=2,padx=15,pady=15)# -----menu菜单功能,暂时不要后续添加--------
# meun_main = tk.Menu()
# # meun_main.grid()
# filemenu = tk.Menu(meun_main, tearoff=1)
# meun_main.add_cascade(label='File', menu=filemenu)
# filemenu.add_command(label='Monkey')
# filemenu.add_command(label='Screen')
# filemenu.add_command(label='Instructions')
# filemenu.add_command(label='About')
# window.config(menu = filemenu)# -------Log缓存区域,显示自定义日志--------
# lable_log=tk.Label(frame_main6,text="日志区",font = ("微软雅黑",14))
# lable_log.grid(column=1,row=1,sticky="W")# 控制台输出显示的位置
text_log = tk.Text(frame_main5,bg="#5B5B5B",fg="#FFFFFF")
text_log.grid(column=1,columnspan=3,row=2)# ----------导出日志模块------------
path = ""
local_location = ""
def selectPath():global path, local_locationpath = askdirectory()print("选择的位置:"+path)local.delete(0,"end")local.insert("end",path)local_location=pathtext_log.insert("end","==========================注意==========================\n\n1、导出日志暂不支持多台设备同时操作,请连接一台设备操作\n\n2、相同路径导出会覆盖原结果,请手动备份或选择不同目录\n\n\n")text_log.yview_moveto(2)text_log.update()local = tk.Entry(frame_main5, textvariable = path)
local.grid(row = 1, column = 2, sticky="W")
local.insert("end"," 点击选择导出路径......")
tk.Button(frame_main5, text = "选择路径:",bg="#AB82FF", command = selectPath).grid(row = 1, column = 1, sticky="E")def pull_log():print("本地位置:"+local_location)os.system("adb pull sdcard/Auto/crash.log "+local_location)os.system("adb pull sdcard/Auto/meminfo.log "+local_location)os.system("adb pull sdcard/Auto/monkey.log "+local_location)os.system("adb pull sdcard/Auto/meminfomini.log "+local_location)text_log.insert("end","\n导出成功,请去目录下查看~~~~~\n")text_log.yview_moveto(1)text_log.update()tk.Button(frame_main5, text = "导出结果",bg="#AB82FF", command = pull_log).grid(row = 1, column = 3, sticky="W")def clear_log():text_log.delete("1.0","end")button_clearLog = tk.Button(frame_main5,text="Clear",font = ("微软雅黑",8),bg="#836FFF", fg= "#FFFFFF",command=clear_log)
button_clearLog.grid(column=4,row=2,sticky="n")# text_log.insert("end","adasd21dadd")# ------主页lable显示引导---------------
# 刷新设备说明
lable_main1 = tk.Label(frame_main1, justify="left", height=5, width=35, bg="#E5E5E5", font = ("微软雅黑",10), text="准备工作:\n1.进入开发者选项打开测试机USB调试功能\n2.点击刷新设备\n3.手机端确认USB调试(若未提示则跳过此步骤)\n4.设备连接成功")
lable_main1.grid()
# monkey参数说明
lable_main2 = tk.Label(frame_main2, justify="left", height=5, width=40, bg="#E5E5E5", font = ("微软雅黑",10), text="参数说明:\n1.Package:包名,可点击获取,也可以手动输入\n2.Seeds:随机值,默认取当天日期,也可手动输入\n3.Throttle:点击频率,默认300ms,可手动输入\n4.Count:总操作数,默认50万,可手动修改")
lable_main2.grid()# ----listbox用于显示当前设备列表-----
lb = tk.Listbox(frame_main3,height=9, width=28, bg="#CDCDB4", fg="#551A8B")
lb.grid(column=0,row=0,padx=10,pady=10)# -----frame4上的参数配置-----
lab1 = tk.Label(frame_main4,text="配置项",bg="#F2F2F2",font=(11))
lab2 = tk.Label(frame_main4,text="Package",bg="#F2F2F2" )
lab3 = tk.Label(frame_main4,text="Seeds",bg="#F2F2F2" )
lab4 = tk.Label(frame_main4,text="Throttle",bg="#F2F2F2" )
lab5 = tk.Label(frame_main4,text="Count",bg="#F2F2F2" )
lab6 = tk.Label(frame_main4,text="参数",bg="#F2F2F2",font=(11) )  #第二列标题哦lab1.grid(column=1,row=1,padx=5,pady=5)
lab2.grid(column=1,row=2,padx=5,pady=5,sticky="w")
lab3.grid(column=1,row=3,padx=5,pady=5,sticky="w")
lab4.grid(column=1,row=4,padx=5,pady=5,sticky="w")
lab5.grid(column=1,row=5,padx=5,pady=5,sticky="w")
lab6.grid(column=2,row=1,padx=1,pady=1)# -----entry monkey参数配置-------
entry1 = tk.Entry(frame_main4)
entry2 = tk.Entry(frame_main4)
entry3 = tk.Entry(frame_main4)
entry4 = tk.Entry(frame_main4)entry1.grid(column=2,row=2,padx=5,pady=1,sticky="w")
entry2.grid(column=2,row=3,padx=5,pady=1,sticky="w")
entry3.grid(column=2,row=4,padx=5,pady=1,sticky="w")
entry4.grid(column=2,row=5,padx=5,pady=1,sticky="w")# ------一些可能用到的全局变量------
select_var = ""
pkg_details = ""
button_state = ""
model_name = ""
# 创建一个空list存储设备
list_device = []
# monkey配置残水
p = ""
s = ""
t = ""
c = ""def find_and_init():# def find_devices():global list_device,model_namelist_device.clear()logging.basicConfig(level=logging.INFO)d_lists = os.popen("adb devices").readlines()logging.error(d_lists)d_lists.remove(d_lists[len(d_lists)-1])d_lists.remove(d_lists[0])lb.delete("0","end")logging.info(d_lists)# time.sleep(3)if len(d_lists)==0:lb.insert("end","未检测到设备,请连接测试机...")text_log.insert("end","未检测到设备,请连接测试机...\n")text_log.yview_moveto(1)text_log.update()elif "unauthorized" in d_lists[0]:lb.insert("end","请在手机上点击允许USB调试...")text_log.insert("end","请在手机上点击允许USB调试...\n")text_log.yview_moveto(1)text_log.update()else:text_log.insert("end","设备已连接,请选择设备进行后续操作!\n\n")text_log.yview_moveto(1)text_log.update()for i in d_lists:reg_serial = re.findall("(.*?)device", i)model_org = os.popen("adb -s "+str(reg_serial[0])+" shell getprop ro.product.model").readlines()logging.info(reg_serial[0].replace("\t","")+":"+model_org[0].replace("\n",""))# 将设备信息添加到listbox中per_list = reg_serial[0].replace("\t","")print("设备列表为:",per_list)os.system("adb -s "+str(per_list)+" logcat -c")lb.insert("end",model_org[0].replace("\n","").replace(" ","")+":"+per_list)model_name = model_org[0].replace("\n","").replace(" ","")list_device.append(per_list)# ------读写配置文件-----------# def init_config():entry1.delete(0,"end")entry2.delete(0,"end")entry3.delete(0,"end")entry4.delete(0,"end")# time.sleep(3)if os.path.exists("config.json"):with open('config.json',encoding="utf-8") as ff:json_data = json.load(ff)entry1.insert("end",json_data["pkg"])entry2.insert("end", time.strftime("%Y%m%d%H%M%S", time.localtime())[2:8])entry3.insert("end", json_data["thr"])entry4.insert("end", json_data["total"])else:config_file = open('config.json','w',encoding='utf-8')# json_data = {"pkg":"请在此处填写包名...","sd":time.strftime("%Y%m%d%H%M%S", time.localtime())[2:8],"thr":"300","total":"500000"}json_data = {"pkg":"请在此处填写包名...", "thr":"300","total":"500000"}json.dump(json_data,config_file,ensure_ascii=False)config_file.close()# p=entry1.get()# s=entry2.get()# t=entry3.get()# c=entry4.get()#  -----------按钮事件--------
# 刷新设备按钮
button = tk.Button(frame_main3,text="刷新设备",font = ("微软雅黑",15),bg="#8FBC8F", fg= "#FFFFFF", command=find_and_init)
button.grid(column=0,row=1)# --------获取当前包名---------
def get_pkg():global select_varglobal pkg_detailslogging.info(select_var)# global select_varselected=lb.get(lb.curselection())print("我也不知道这里会不会报错 ",selected)print("原始的",selected,type(selected))reg_device=".*?:(.*)"select_device = re.findall(reg_device, selected)print("选择的设备是",select_device[0])select_var=select_device[0]try:cur = os.popen("adb -s "+str(select_var)+" shell dumpsys window | findstr mCurrentFocus").readline()result=re.findall("mCurrentFocus=Window{.*?u0 (.*?)/.*?}", cur)pkg_details = result[0]logging.info(cur)except IndexError:entry1.delete(0,"end")entry1.insert("end","获取失败...")tk.messagebox.showerror("Error了吧,哈哈哈!","请注意:\n  1.确认设备已经连接。\n  2.需要获取包名的应用处于前台状态!")entry1.delete(0,"end")entry1.insert("end","点击重试...")except TypeError:entry1.delete(0,"end")entry1.insert("end","未选择设备哦!")tk.messagebox.showerror("Error,这个不是Bug...","没有选择设备哦!")entry1.delete(0,"end")entry1.insert("end","点击重试...")else:entry1.delete(0,"end")entry1.insert("end",pkg_details)text_log.insert("end","获取包名成功,请在包名栏查看确认!!!\n\n")text_log.yview_moveto(1)text_log.update()def run_monkey():now_time = time.strftime("%Y%m%d%H%M%S", time.localtime())[4:12]if not os.path.exists("./script/"+str(now_time)):text_log.insert("end","创建必要资源文件夹....\n\n")text_log.yview_moveto(1)text_log.update()os.makedirs("./script/"+str(now_time))global p,s,t,cp=entry1.get()s=entry2.get()t=entry3.get()c=entry4.get()global button_statebutton_state = "disabled"print(pkg_details)text_log.insert("end","即将开始初始化资源,请稍等...\n")if len(list_device)>0:if entry1.get() in (u"请在此处填写包名...",""):tk.messagebox.showerror("你又错了!!!","不出意外的话你包名肯定不对!!")else:sh_monkey = "_monkey_"+str(pkg_details)+".sh"with open ("script\\"+str(now_time)+"\\"+sh_monkey, "w") as f:text_log.insert("end","生成monkey脚本...\n")text_log.yview_moveto(1)text_log.update()f.write('#!/system/bin/sh\na=`monkey -s '+str(s)+' -p '+str(p)+' --throttle '+str(t)+' --ignore-crashes --ignore-native-crashes --ignore-security-exceptions --ignore-timeouts --monitor-native-crashes -v -v -v '+str(c)+' > /sdcard/Auto/monkey.log`;b=`sh common.sh &`')sh_fc = "_fc_"+str(pkg_details)+".sh"with open ("script\\"+str(now_time)+"\\"+sh_fc, "w") as ff:text_log.insert("end","生成crash监控脚本...\n")text_log.yview_moveto(1)text_log.update()ff.write('#!/system/bin/sh\nlogcat -s AndroidRuntime>>crash.log')sh_memory = "_memory_"+str(pkg_details)+".sh"with open ("script\\"+str(now_time)+"\\"+sh_memory, "w") as fff:text_log.insert("end","生成内存监控脚本...\n")text_log.yview_moveto(1)text_log.update()fff.write('#!/system/bin/sh\nwhile true;do if [ -e "1" ];then echo `date`" -- monkey finished!!!">>meminfo.log;break;else dumpsys meminfo '+str(p)+'>>meminfo.log;sleep 30;continue;fi; done')# sh_memorymini = "_memorymini_"+str(pkg_details)+".sh"# with open ("script\\"+str(now_time)+"\\"+sh_memorymini, "w") as ffff:#     text_log.insert("end","生成内存监控脚本mini...\n\n")#     text_log.yview_moveto(1)#     text_log.update()#     ffff.write('#!/system/bin/sh\nwhile true;sleep 30; do if [ -e "1" ];then echo `date`" -- monkey finished!!!">>meminfo.log;break;else dumpsys meminfo '+str(p)+' | grep TOTAL:>>meminfomini.log;continue;fi; done')#这里区分设备,后面从这里开始  for d in list_device:os.system("adb -s "+str(d)+" shell rm -r sdcard/Auto/")text_log.insert("end","初始化设备环境...\n")text_log.yview_moveto(1)text_log.update()os.system('adb -s '+str(d)+' shell "cd sdcard && mkdir Auto')   text_log.insert("end","创建资源文件夹...\n")text_log.yview_moveto(1)text_log.update()sh_finally = glob.glob("script\\"+str(now_time)+"\\*.sh")for sh in sh_finally:print("=============")print("adb -s "+str(d)+" push "+"script\\"+str(now_time)+"\\"+str(sh)+" sdcard/Auto")os.system("adb -s "+str(d)+" push "+str(sh)+" sdcard/Auto")text_log.insert("end","推送测试脚本到设备...\n")print("=============\n\n\n")text_log.yview_moveto(1)text_log.update()os.system("adb -s "+str(d)+" push "+"script\\common.sh sdcard/Auto")text_log.insert("end","推送测试脚本到设备......\n")text_log.yview_moveto(1)text_log.update()# 多线程启动执行命令def monkey_thread():text_log.insert("end","启动monkey......\n")text_log.yview_moveto(1)text_log.update()logging.info('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_monkey)+' &"')os.system('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_monkey)+' &"')time.sleep(2)def crash_thread():text_log.insert("end","启动crash脚本......\n")text_log.yview_moveto(1)text_log.update()logging.info('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_fc)+' &"')os.system('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_fc)+' &"')time.sleep(2)def mem_thread():text_log.insert("end","启动内存脚本......\n")text_log.yview_moveto(1)text_log.update()logging.info('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_memory)+' &"')os.system('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_memory)+' &"')#     # os.system('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh '+str(sh_memorymini)+' &"')time.sleep(2)# monkey_thread()# crash_thread()# mem_thread()_thread.start_new_thread(monkey_thread, ())  _thread.start_new_thread(crash_thread, ())_thread.start_new_thread(mem_thread, ())logging.info("执行完毕!!!!!!!")time.sleep(5)text_log.insert("end","\n当前设备执行完毕,确认monkey开始后可拔掉数据线,执行下一台设备......\n")text_log.yview_moveto(1)text_log.update()# time.sleep(2)# print("开始启动监控脚本")# _thread.start_new_thread(common_thread, ())# os.system('adb -s '+str(d)+' shell "cd sdcard && cd Auto && sh common.sh &"')text_log.insert("end","一切准备就绪,即将启动所有骚操作!!!\n\n")text_log.yview_moveto(1)text_log.update()text_log.insert("end","==============================\n包名:"+p)text_log.insert("end","\nseeds值:"+s)text_log.insert("end","\nthrottle值:"+t)text_log.insert("end","\n总测试数:"+c+"\n\n==============================\n\n更新动态关注:https://blog.csdn.net/botree_chan/article/category/9091329\n\n")text_log.yview_moveto(3)text_log.update()else:# len(list_device)==0:tk.messagebox.showerror("你又错了!!!","请注意:\n  1.确认设备已经连接。\n  2.确认包名不为空!!")# 获取包名按钮
button_getpkg = tk.Button(frame_main4,text="获取包名", fg= "#FFFFFF",font = ("",9),bg="#A020F0",command=get_pkg)
button_getpkg.grid(column=3,row=2,padx=5,pady=5)
notice_lable = tk.Label(frame_main4,text="要获取包名,\n请先选设备。", fg="red")
notice_lable.grid(column=3,row=3)button_make_res = tk.Button()# Monkey启动按钮
if button_state == "disabled":button_runmonkey = tk.Button(frame_main4,text="执行测试",state="disabled", fg= "#FFFFFF",font = ("微软雅黑",15),bg="#8FBC8F",command=run_monkey)button_runmonkey.grid(column=2,row=7,padx=25,pady=5,sticky="w")
else:button_runmonkey = tk.Button(frame_main4,text="执行测试", fg= "#FFFFFF",font = ("微软雅黑",15),bg="#8FBC8F",command=run_monkey)button_runmonkey.grid(column=2,row=7,padx=25,pady=5,sticky="w")button_state = "disabled"window.mainloop()

 


http://chatgpt.dhexx.cn/article/Qsf7GQ2D.shtml

相关文章

Python日常小技巧(持续更新中)

目录 快速定位元组内容对字典进行排序json的获取(dumps,dump,loads,load)查找字典中相同的key统计列表中元素的个数字典按输入顺序输出历史记录的存储对有多个分割符的字符串进行分割对文件中的时间格式进行转换 字符串的居中,左右对齐列表并行/串行计算字符串判断是…

Flink 学习三 Flink 流 process function API

Flink 学习三 Flink 流&process function API 1.Flink 多流操作 1.1.split 分流 (deprecated) 把一个数据流根据数据分成多个数据流 1.2 版本后移除 1.2.分流操作 (使用侧流输出) public class _02_SplitStream {public static void main(String[] args) throws Excep…

基于Unity3D实现的牙医病人小游戏【100011407】

1 总体设计 1)基本技术路线 运用面向对象的设计理念,设计了病人类,牙医类,候诊椅类,诊疗椅类等,通过对这些类的封装,创立各个类的对象,并调用类的成员函数。 2)总体结…

Java IO,BIO、NIO、AIO

操作系统中的 I/O 以上是 Java 对操作系统的各种 IO 模型的封装,【文件的输入、输出】在文件处理时,其实依赖操作系统层面的 IO 操作实现的。【把磁盘的数据读到内存种】操作系统中的 IO 有 5 种: 阻塞、 非阻塞、【轮询】 异步、 IO复…

TensorFlow2.0学习笔记-3.模型训练

3.模型训练 3.1.Keras版本模型训练 • 构建模型(顺序模型、函数式模型、子类模型) • 模型训练: model.fit() • 模型验证: model.evaluate() • 模型预测: model.predict() • 使用样本加权和类别加权 回调函数 •…

sql注入学习

提示:萌新学习路程的记录型文章,有错误的地方欢迎大佬们指正。 文章目录 前言一、SQLi-Labs1、SQLi-Labs下载、安装(环境搭建)(1) 首先下载解压并移动sqli-labs(2) 找到sql-connections下的db-creds.inc进行修改(3) 打开网页:http…

从客户端中检测到有潜在危险的 request.form值[解决方法]

当页面编辑或运行提交时,出现“从客户端中检测到有潜在危险的request.form值”问题,该怎么办呢?如下图所示: 下面博主汇总出现这种错误的几种解决方法:问题原因:由于在asp.net中,Request提交时出现有html代码或javascript等字符串时,程序系统会认为其具有潜在危险的值。…

sadadas

dasdasdasdasdasd

python_day3_集合与运算/文件读写、修改详解/字符编码转换/函数和函数式编程(return/参数详解/局部变量与全局变量/递归/高阶函数)

Python_集合与运算/文件读写、修改详解/字符编码详解/函数和函数式编程/函数式编程之参数/局部变量与全局变量/递归/高阶函数 在这里得感谢&#xff0c;老师Alex金角大王(路飞学城IT) Python(给兄弟们挂个&#x1f517;) >_<…因为有的是自己理解&#xff0c;如有错误&a…

svn添加新项目的步骤

1.服务端给一个地址&#xff1a;拉取代码 2.上传代码&#xff08;不含没有module的build文件夹和以下文件夹&#xff09;

项目新添加页面svn上传

你项目当中新添加了页面上传SVN&#xff0c;需要先把新添加的页面Add到SVN上&#xff0c; 右击新添加的页面出现TortoiseSVN — Add&#xff0c;然后上传整个项目就可以了&#xff0c;SVN上就有新添加的页面了。 如下图

Eclipse用SVN上传新项目

首先右击项目–>team --> share project 选择repository为svn–>点击next 使用已有的资源库的位置&#xff0c;如下图所示&#xff1a; 使用项目名称作为文件夹名 --> 点击Finish --> 输入用户名和密码(此步不一定每个人都有)&#xff0c;如下图所示&#xff1a…

IDEA添加新项目到SVN

1.打开IDEA &#xff0c;上面工具栏选择VCS 选择把项目交给SVN管理 2.选择SVN 3、右键项目选择如下 4.点击绿色的号&#xff0c;选择一个SVN仓库的地址&#xff0c;下面可以选择上传到SVN仓库的目录格式&#xff0c;然后点击Share 5.默认1.8 6.右键项目选择-->Subversion--…

项目上传到SVN

步骤1、首先在服务器上安装svn。 步骤2、然后找到svn 选择VisualSVN Server Manager 在Repositories下新建Repository name 步骤3、在MyEclipse中右击项目&#xff0c;Team–>Share Project–>SVN–>创建新的资源位置或使用已有的资源位置&#xff08;最好新建&#…

idea上传新项目至svn仓库

linux下安装svn服务器&#xff0c;idea上传新项目 linux下安装svn服务器,配置svn仓库 就不写了,百度一大把 导入项目: 点击号 linux下svn://开头,输入svn服务器创建的仓库地址,也可连接http:// 输入svn仓库配置的账号.密码 导入

Eclipse中SVN上传项目

上传新项目到SVN服务器 选中你要上传的项目&#xff0c;右键-->Team-->Share Project&#xff0c;选中SVN-->Next。 前提是已经安装SVN插件&#xff1a;https://blog.csdn.net/weixin_44306005/article/details/95487732 如图所示进行下一步操作&#xff1a; 如图所…

IDEA使用SVN上传项目

1、设置SVN 2、在settings→Version Control中可以改变版本控制 3、右键项目选择如下 4、添加仓库地址 5、点击share提交 6、文件颜色由红变绿 7、右键选择commit 一路选择commit 7、如果在IDEA中上传太慢,可以选择在项目文件中直接使用SVN上传 PS&#xff1a;如果账号有问题,…

IDEA如何将上传项目到SVN

1.打开IDEA &#xff0c;上面工具栏选择VCS 选择把项目交给SVN管理 2.选择SVN 3、选择SVN管理后可以看到项目变砖红色颜色 4、右键项目选择如下 5、点击绿色的号&#xff0c;选择一个SVN仓库的地址&#xff0c;下面可以选择上传到SVN仓库的目录格式&#xff0c;然后点击Shard…

linuxsvn服务器导入项目,linux svn 导入项目

linux svn 导入项目 内容精选 换一换 用于将其它云端仓库导入到代码托管服务中&#xff0c;也可以将代码托管服务中一个区域的仓库导入到另一个区域(异地备份)&#xff0c;导入后的仓库与源仓库彼此独立。在代码托管服务控制台导入外部仓库的步骤如下&#xff1a;外部仓库可以是…

在Linux服务器上安装SVN并上传项目

安装svn &#xff08;1&#xff09;安装svn服务器&#xff1a; yum install subversion&#xff08;2&#xff09;查看版本&#xff08;随自己意愿&#xff09;&#xff1a; svnserve --version创建svn仓库并配置 &#xff08;1&#xff09;创建svn仓库 在/home下创建svn目…