#!/usr/bin/env python
importwximportosimportsysimporttimefrom threading importThread#执行adb命令函数#使用到的线程:RunMonkeyThread(),KillMonkeyThread(),ExportLogThread()
defexcuOrder(orderName):
c=os.system(orderName)print(c)returnc#将指定内容写入指定文件(写入monkey日志报错信息)#使用到的函数:findException()
defwriteFile(FileName, content):
FName= open(FileName, 'a')
FName.write(content)
FName.close()#查找指定文件里指定字符串的个数,并输出字符串所在行的内容#使用到的线程:ExportLogThread()
deffindException(tfile,sstr):try:
lines=open(tfile,'r').readlines()
flen=len(lines)-1acount=0
fileException= "%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)exceptException as e:print(e)classRunMonkeyThread(Thread):def __init__(self):#线程实例化是立即启动
Thread.__init__(self)
self.logNameST=logNameST
self.start()defrun(self):print("Start running monkey ...\n")
self.packageName=packageText.GetValue()
self.MonkeyTime=MTText.GetValue()
self.MonkeyCount=MCText.GetValue()
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.logNameST.SetLabel("%s" %self.logName)
self.orderName1='adb 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.packageName,self.MonkeyTime,self.MonkeyCount,self.logName)
excuOrder(self.orderName1)print("monkey finished.\n")classKillMonkeyThread(Thread):def __init__(self):#线程实例化时立即启动
Thread.__init__(self)
self.start()defrun(self):#杀死进程的两种命令
#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"'excuOrder(self.orderName2)
time.sleep(2)print ("Kill monkey success!")classExportLogThread(Thread):def __init__(self):#线程实例化时立即启动
Thread.__init__(self)
self.start()defrun(self):
self.logo= os.path.isfile('logname.txt')
self.LogNameList=[]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 pull /sdcard/%s ./MonkeyLog_%s/%s" %(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 pull /data/anr/traces.txt ./MonkeyLog_%s/traces.txt" %self.LogFileName
excuOrder(self.orderName5)print("Export Log Complete.")else:print ("logname.txt is not exist!")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) #创建画板
#应用包名
PackageLabel = wx.StaticText(panel, -1, "package name:")globalpackageText
packageText= wx.TextCtrl(panel, -1, "",
size=(260,-1))
packageText.SetInsertionPoint(0)#monkey事件之间的间隔时间(ms)
MTLabel = wx.StaticText(panel, -1, "Monkey time:")globalMTText
MTText= wx.TextCtrl(panel, -1, "",
size=(260,-1))#monkey事件总次数
MCLabel = wx.StaticText(panel, -1, "Monkey count:")globalMCText
MCText= wx.TextCtrl(panel, -1, "",
size=(260,-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=(260,-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=2, hgap=6, vgap=6)
sizer.AddMany([PackageLabel,packageText,MTLabel,MTText,MCLabel,MCText,MonkeyLogName,logNameST,button1,button2,button3])
panel.SetSizer(sizer)defrunMonkey(self, event):
RunMonkeyThread()defkillMonkey(self,event):
KillMonkeyThread()defexportLog(self,event):
ExportLogThread()defOnCloseMe(self, event):
self.Close(True)defOnCloseWindow(self,event):
self.Destroy()classApp(wx.App):def __init__(self,redirect=True, filename=None):
wx.App.__init__(self,redirect,filename)defOnInit(self):print("Program Startup:")
self.frame= InsertFrame(parent=None,id=-1) #创建框架
self.frame.Show()
self.SetTopWindow(self.frame)print(sys.stderr) #输出到stderr
returnTruedefOnExit(self):print("Program running complete.")returnTrueif __name__=="__main__":
app= App(redirect=True) #1.文本重定向从这开始
app.MainLoop()