wxpython制作表格界面_wxPython制作跑monkey工具(python3)-带显示设备列表界面

#!/usr/bin/env python

import wx

import os

import sys

import timefromthreading import Thread

#执行adb命令函数

#使用到的线程:RunMonkeyThread(),KillMonkeyThread(),ExportLogThread()

def excuOrder(orderName):

c=os.system(orderName)

#读取指定文件的指定内容

#使用到的函数getDevices() ,KillMonkeyThread()

def openFile(FileName):

FName= open(FileName, 'r')

fileContent=FName.readlines()

FName.close()returnfileContent

#删除列表中指定的元素

#使用的到函数getDevices()

def delElem(delStr,delList):for i indelList:if delStr indelList:

delList.remove(delStr)

#判断输入的内容是否为数字字符0~9def CheckInput(inputString):

mother= "0123456789"

for j ininputString:if j not inmother:returnNonereturninputString

#获取设备列表

def getDevices():while(True):

deviceList=[]

deviceListRE=[]

deviceListLong=0deviceListThird=[]

deviceListThirdLong= 0print ("please run again, if no responsing!")

orderName= "adb devices > device.txt"excuOrder(orderName)

time.sleep(2)

deviceList=openFile("device.txt")

deviceListLong=len(deviceList) #获取列表deviceList长度if(deviceListLong > 0):for i inrange(deviceListLong):

deviceListThird.append(deviceList[i].strip())

delElem("* daemon not running. starting it now on port 5037 *",deviceListThird)

delElem("* daemon started successfully *",deviceListThird)

delElem("List of devices attached",deviceListThird)

delElem("adb server is out of date. killing...",deviceListThird)

delElem("",deviceListThird) #删除deviceListThird列表中的""元素

deviceListThirdLong=len(deviceListThird)if(deviceListThirdLong > 0):for i inrange(deviceListLong):

#将deviceList列表中的元素通过空格分隔后赋值给deviceListRE

deviceListRE.append(deviceListThird[i].split("\t")[0])

deviceListRE.append(deviceListThird[i].split("\t")[1].strip())

deviceListRE=list(set(deviceListRE)) #列表去重,无法保持原有顺序

delElem("device",deviceListRE) #删除deviceListRE列表中"device\n"元素

delElem("offline",deviceListRE) #删除deviceListRE列表中"offline\n"元素

#print(deviceListRE)returndeviceListREelse:return ["No Devices!"]

#获取应用列表

def getPackages(deviceName):while(True):

packageList=[]

packageListRE=[]

packageListLong=0#获取monkey进程

orderName2= 'adb -s %s shell "touch /sdcard/PackageName.txt"' %deviceName #生成PackageName.txt文件

excuOrder(orderName2)

orderName3= 'adb -s %s shell "pm list packages >/sdcard/PackageName.txt"' %deviceName #将monkey进程信息放入PackageName.txt文件

excuOrder(orderName3)

time.sleep(2)

orderName4= 'adb -s %s pull /sdcard/PackageName.txt .' %deviceName #将PackageName.txt文件到处到当前文件夹

excuOrder(orderName4)

time.sleep(2)

packageList= openFile("PackageName.txt")

#print(packageList)

packageListLong=len(packageList) #获取列表packageList长度for i inrange(packageListLong):

#将packageList列表中的元素通过冒号分隔后赋值给 packageListRE

packageListRE.append(packageList[i].split(":")[0])

packageListRE.append(packageList[i].split(":")[1].strip())

packageListRE=list(set(packageListRE)) #列表去重,无法保持原有顺序

delElem("package",packageListRE) #删除packageListRE列表中package元素returnpackageListRE

#获取monkeyPID列表

def getMonkeyPID(deviceName):

MonkeyPIDList=[]

#获取monkey进程

orderName2= 'adb -s %s shell "touch /sdcard/MonkeyPID.txt"' %deviceName #生成MonkeyPID.txt文件

excuOrder(orderName2)

orderName3= 'adb -s %s shell "ps|grep monkey >/sdcard/MonkeyPID.txt"' %deviceName #将monkey进程信息放入MonkeyPID.txt文件

excuOrder(orderName3)

orderName4= 'adb -s %s pull /sdcard/MonkeyPID.txt .' %deviceName #将MonkeyPID.txt文件到处到当前文件夹

excuOrder(orderName4)

MonkeyPIDS= openFile("MonkeyPID.txt")if(len(MonkeyPIDS)>0): #如果存在monkey进程,则提示跑monkey的进程

MonkeyPIDSLong=len(MonkeyPIDS)for i inrange(MonkeyPIDSLong):

#将self.MonkeyPID列表中的元素通过空格分隔后赋值给self.MonkeyPIDRE列表

MonkeyPID= MonkeyPIDS[i].split(" ")

delElem("",MonkeyPID) #删除self.MonkeyPID列表中所有空""项

MonkeyPIDList.append(MonkeyPID[1])returnMonkeyPIDList

#将指定内容写入指定文件(写入monkey日志报错信息)

#使用到的函数:findException()

def writeFile(FileName, content):

FName= open(FileName, 'a')

FName.write(content)

FName.close()

#查找指定文件里指定字符串的个数,并输出字符串所在行的内容

#使用到的线程:ExportLogThread()

def findException(tfile,sstr):try:

lines=open(tfile,'r').readlines()

flen=len(lines)-1acount= 0fileException= "%s_%s" %(tfile,sstr)

tfileException= "%s.txt" %fileException

writeFile(tfileException,"%s keywords:\n" %fileException)for i inrange(flen):if sstr inlines[i]:

lineException= '\t%s\n'%lines[i]

writeFile(tfileException,lineException)

acount+= 1writeFile(tfileException,"%s frequency:%s" %(fileException,acount))

print('Please check Exception keywords in the "%s"\n' %tfileException)

except Exceptionase:

print(e)

#判断变量输入内容是否为空

#使用到的线程:RunMonkeyThread()

def CheckNone(checkText,discription):if(checkText ==None):

print(discription)classRunMonkeyThread(Thread):

def __init__(self):

#线程实例化是立即启动

Thread.__init__(self)

self.logNameST=logNameST

self.MonkeyRunState=MonkeyRunStateText

self.RunMonkeyButton=button1

self.start()

def run(self):

self.RunMonkeyButton.Enable(False)

self.RunMonkeyButton.SetLabel("Waiting...")

self.DeviceName=DeviceDiaplay.GetStringSelection()

self.packageName=packageText.GetValue()

self.MonkeyTime=MTText.GetValue()

self.MonkeyCount=MCText.GetValue()

#获取monkey进程

self.MonkeyPIDList=[]

self.MonkeyPIDList=getMonkeyPID(self.DeviceName)

self.MonkeyPIDListLong=len(self.MonkeyPIDList)

print("#####",CheckInput(self.MonkeyTime))

print("****",type(CheckInput(self.MonkeyTime)))

print("#####",CheckInput(self.MonkeyCount))

print("****",type(CheckInput(self.MonkeyCount)))if(self.DeviceName == "" or self.DeviceName =="No Devices!"):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: Please select the device!")

elif(self.packageName== ""):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: Please input the packageName!")

elif(self.packageName notingetPackages(self.DeviceName)):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: packageName is not exit!")

elif(self.MonkeyTime== ""):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: Please input the MonkeyTime!")

elif(CheckInput(self.MonkeyTime)!=self.MonkeyTime):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: MonkeyTime must be a positive integer!")

elif(self.MonkeyCount== ""):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: Please input the MonkeyCount!")

elif(CheckInput(self.MonkeyCount)!=self.MonkeyCount):

self.logNameST.SetLabel("")

self.MonkeyRunState.SetLabel("Not running: MonkeyCount must be a positive integer!")

elif(self.MonkeyPIDListLong== 0):

print("Start running monkey ...\n")

self.strTime= time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))

self.logName= '%s_%s_monkey.log'%(self.packageName,self.strTime)

open(r"logname.txt",'w').write(self.logName)

self.MonkeyRunState.SetLabel("Starting monkey ...")

self.logNameST.SetLabel("%s" %self.logName)

self.orderName1='adb -s %s shell "monkey -p %s --throttle %s --ignore-crashes --monitor-native-crashes \

--ignore-security-exceptions --ignore-timeouts --ignore-native-crashes --pct-syskeys\0 --pct-nav 20 --pct-majornav 20 --pct-touch 40 --pct-appswitch 10 -v -v -v %s\> /sdcard/%s&"'% (self.DeviceName,self.packageName,self.MonkeyTime,self.MonkeyCount,self.logName)

excuOrder(self.orderName1)

time.sleep(2)else:for i inrange(self.MonkeyPIDListLong):

self.MonkeyRunState.SetLabel("Monkey PID: %s is running..." %self.MonkeyPIDList[i])

time.sleep(2)

self.RunMonkeyButton.Enable(True)

self.RunMonkeyButton.SetLabel("Run Monkey")classKillMonkeyThread(Thread):

def __init__(self):

#线程实例化时立即启动

Thread.__init__(self)

self.MonkeyRunState=MonkeyRunStateText

self.start()

def run(self):

self.DeviceName=DeviceDiaplay.GetStringSelection()

self.MonkeyPID=[]

self.MonkeyPIDList=[]if(self.DeviceName == "" or self.DeviceName =="No Devices!"):

self.MonkeyRunState.SetLabel("Kill failed: Please select the device!")else:

#杀死进程的两种命令

#1. ps|grep monkey |awk '{print $2}' |xargs kill -9#2. PID=`ps |grep monkey|awk '{print $2}'`;kill -9$PID;

#self.orderName2= 'adb shell "ps|grep monkey |awk \'{print $2}\' |xargs kill -9"'self.MonkeyPIDList=getMonkeyPID(self.DeviceName)

self.MonkeyPIDListLong=len(self.MonkeyPIDList)if(self.MonkeyPIDListLong > 0):for i inrange(self.MonkeyPIDListLong):

self.orderName5= 'adb -s %s shell "kill -9 %s"' %(self.DeviceName,self.MonkeyPIDList[i]) #杀死monkey进程

excuOrder(self.orderName5)

self.MonkeyRunState.SetLabel("Monkey PID: %s has been killed" %self.MonkeyPIDList[i])

self.MonkeyRunState.SetLabel("Monkey has been killed.")else:

self.MonkeyRunState.SetLabel("No monkey is running!")classExportLogThread(Thread):

def __init__(self):

#线程实例化时立即启动

Thread.__init__(self)

self.MonkeyRunState=MonkeyRunStateText

self.start()

def run(self):

self.DeviceName=DeviceDiaplay.GetStringSelection()if(self.DeviceName == "" or self.DeviceName =="No Devices!"):

self.MonkeyRunState.SetLabel("Export failed: Please select the device!")else:

self.logo= os.path.isfile('logname.txt')

self.LogNameList=[]

self.MonkeyRunState.SetLabel("Exporting...")if(self.logo):

self.Logname_file= open('logname.txt','r')

self.Lognames=self.Logname_file.readlines()

self.Logname_file.close()for self.Logname inself.Lognames:

self.LogNameList= self.Logname.split("_")

self.LogFileName= self.LogNameList[0] + "_" + self.LogNameList[1]

self.orderName4= "adb -s %s pull /sdcard/%s ./MonkeyLog_%s/%s" %(self.DeviceName,self.Logname,self.LogFileName,self.Logname)

excuOrder(self.orderName4)

time.sleep(5)

print (u"Pull %s success!" %self.Logname)

findException("./MonkeyLog_%s/%s" % (self.LogFileName,self.Logname) ,"CRASH")

findException("./MonkeyLog_%s/%s" % (self.LogFileName,self.Logname) ,"Exception")

self.orderName5= "adb -s %s pull /data/anr/traces.txt ./MonkeyLog_%s/traces.txt" %(self.DeviceName,self.LogFileName)

excuOrder(self.orderName5)

self.MonkeyRunState.SetLabel("Export Complete.")else:

self.MonkeyRunState.SetLabel("Export failed: No monkey has been run!")classInsertFrame(wx.Frame):

def __init__(self,parent,id):

wx.Frame.__init__(self,parent,id,title="Run monkey",

pos=wx.DefaultPosition,

size=wx.DefaultSize,style=wx.DEFAULT_FRAME_STYLE,

name="frame")

panel= wx.Panel(self,-1) #创建画板

#设备列表

DeviceLabel= wx.StaticText(panel, -1, "Devices List:")globalDeviceDiaplay

DeviceDiaplay= wx.ComboBox(panel, -1, "",

size=(268,-1),choices=getDevices())

#应用包名

PackageLabel= wx.StaticText(panel, -1, "Package name:")globalpackageText

packageText= wx.TextCtrl(panel, -1, "com.iapppay.pay.v4",

size=(268,-1))

packageText.SetInsertionPoint(0)

#monkey事件之间的间隔时间(ms)

MTLabel= wx.StaticText(panel, -1, "Monkey time:")globalMTText

MTText= wx.TextCtrl(panel, -1, "360",

size=(268,-1))

#monkey事件总次数

MCLabel= wx.StaticText(panel, -1, "Monkey count:")globalMCText

MCText= wx.TextCtrl(panel, -1, "1000",

size=(268,-1))globalbutton1

#点击按钮运行monkey

button1= wx.Button(panel,label="Run Monkey") #将按钮添加到画板

#杀死monkey

button2= wx.Button(panel,label="Kill Monkey") #将按钮添加到画板

#导出日志

button3= wx.Button(panel,label="Export Log") #将按钮添加到画板

#日志名字:

MonkeyLogName= wx.StaticText(panel, -1, "Monkey logName:")globallogNameST

logNameST= wx.TextCtrl(panel,-1,"",

size=(268,-1))

#状态显示:

MonkeyRunStateName= wx.StaticText(panel, -1, "State display:")globalMonkeyRunStateText

MonkeyRunStateText= wx.TextCtrl(panel,-1,"",

size=(268,-1))

#绑定按钮的单击事件

self.Bind(wx.EVT_BUTTON, self.runMonkey, button1)

self.Bind(wx.EVT_BUTTON, self.killMonkey, button2)

self.Bind(wx.EVT_BUTTON, self.exportLog, button3)

#绑定窗口的关闭事件

self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

sizer= wx.FlexGridSizer(cols=1, hgap=1, vgap=1) #设置总sizer

sizerSon1= wx.FlexGridSizer(cols=2, hgap=1, vgap=1) #设置第一个子sizer

sizerSon1.AddMany([DeviceLabel,DeviceDiaplay,PackageLabel,packageText,MTLabel,

MTText,MCLabel,MCText,MonkeyLogName,logNameST,MonkeyRunStateName,

MonkeyRunStateText])

sizerSon2= wx.FlexGridSizer(cols=3, hgap=4, vgap=4) #设置第二个字sizer

sizerSon2.AddMany([button1,button2,button3])

sizer.AddMany([sizerSon1,sizerSon2])

panel.SetSizer(sizer)

def runMonkey(self,event):

RunMonkeyThread()

def killMonkey(self,event):

KillMonkeyThread()

def exportLog(self,event):

ExportLogThread()

def OnCloseMe(self,event):

self.Close(True)

def OnCloseWindow(self,event):

self.Destroy()classApp(wx.App):

def __init__(self,redirect=True, filename=None):

wx.App.__init__(self,redirect,filename)

def OnInit(self):

print("Program Startup:")

self.frame= InsertFrame(parent=None,id=-1) #创建框架

self.frame.Show()

self.SetTopWindow(self.frame)

#print(sys.stderr) #输出到stderrreturnTrue

def OnExit(self):

print("Program running complete.")returnTrueif __name__=="__main__":

app= App(redirect=False) #1.文本重定向从这开始

app.MainLoop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值