import wx
import wx.xrc
import os
import threading
import thread
import logging
import re
import time
import csv
import subprocess
import codecs
import sys
# 统一使用utf-8格式
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
CMD_ADBINSTALL = "adb install "
CMD_MONKEY = "adb shell monkey -p "
CMD_UNINSTALL = "adb uninstall "
ADB_GET_SERIALNO = "adb get-serialno" # 设备ID
VERSION = 1.9 #版本号
LOG_FILE_NAME = "TOP_APK.logs" #logcat日志文件
dict={} #字典
data =[] #数组
tup=() #元组
dictnew={} #修改后的名称对应
class topapkThread(threading.Thread):
def __init__(self, filepath, listname, len, window,dictnew): # 文件路径, 名称 ,index,self
threading.Thread.__init__(self)
self.listname = listname
self.len = len
self.window = window
self.filepath = filepath
self.timeToQuit = threading.Event()
self.timeToQuit.clear()
self.index = 0
self.listapkback = []
self.dictnew = dictnew
def stop(self):
logging.debug("thread stop")
print "stop thread"
self.timeToQuit.set()
#获取apk的列表
def getpackagenemlist(self):
logging.debug('list package get')
self.listapkpre = []
m = os.popen('adb shell pm list package ').read() # 安装APK之前得到package的所有包名
del self.listapkpre[:] # 清空列表
strlist = m.split('\n')
logging.debug(u'添加到list中')
for value in strlist:
self.listapkpre.append(value) # 添加到list中
for indexapk in self.listapkpre:
print 'apk pre--->' + indexapk # 列表中的文件
print 'apklistpre allcount--> %d' % len(self.listapkpre)
self.apkcount =len(self.listapkpre)
def run(self):
self.getpackagenemlist() #获取package的列表
while (self.index < self.len):
if len(self.listapkback) == 0:
print 'No compare'
else:
# retD = list(set(self.listapkpre).difference(set(self.listapkback)))
retD =list(set(self.listapkpre)^set(self.listapkback))
print u"新安装的APK is: %s " % retD
logging.debug(u"新安装的APK is: %s " % retD)
logging.debug('Install apk end ')
# 字符串分割
print retD[0]
packstring = retD[0]
print u"PackageName全名 ----> %s" % packstring
logging.debug(u'安装成功的package,并进行分离')
u1, u2 = packstring.split(':')
print "name --> %s" % u1
print "package-->%s" % u2
print self.dictnew[str(self.listname[self.index])]
message = str(u2) + ' monkey test start \n '
print message
logging.debug(message)
wx.CallAfter(self.window.UpdateCtrlText, message)
# --ignore-crashes
cmd_monkey = "adb shell monkey -p " + str(u2)+ " -v --throttle 100 3000"
print cmd_monkey
outputline = os.popen(cmd_monkey).read()
logging.debug(u'在mongkey测试结果中找一个是crash, 另外一个是finish')
print outputline
#1 crash
pattern1 = re.compile(r'crash', re.IGNORECASE)
result1 = pattern1.findall(outputline)
print u'crash result-------->' + str(result1)
if len(result1):
logging.debug('crash result-->'+outputline)
# # crash 日志文件log日志
# if len(result1) > 0:
logging.debug('logcat already create,go home')
dt = time.strftime('%Y-%m-%d-%H-%M-%S')
logfilename = "Monkey_log_" + dt
inpu = open(os.getcwd() + "/" + logfilename + ".log", 'w')
inpu.write(str(u2) + " 执行Monkey时间发生crash,日志:")
inpu.writelines(outputline)
inpu.close()
message = "\nHave Crash"
wx.CallAfter(self.window.UpdateCtrlText, message)
#3 判断是否结束了
pattern_finish = re.compile(r'Monkey finished', re.IGNORECASE)
monkey_finish = pattern_finish.findall(outputline)
# print u'monkey 执行日志--->' + outputline
if len(monkey_finish):
msg4 = u"SUCC"
print u'monkey 测试成功'
else:
msg4 = u"FAIL"
print u'monkey 测试失败'
print 'monkey test end'
logging.debug(str(u2)+" monkey test end ")
wx.CallAfter(self.window.UpdateCtrlText, str(u2) + ' monkey test end \n')
wx.CallAfter(self.window.UpdateCtrlText, str(u2) + ' uninstall apk start \n')
# 3卸载
print 'uninstall apk start'
cmd_uninstall = CMD_UNINSTALL + str(u2)
print cmd_uninstall
logging.debug(str(u2)+' uninstall apk start')
#unin = os.popen(cmd_uninstall).read()
unin = os.system(cmd_uninstall)
print 'unistall result %d' %unin
if unin == 0:
msg6 = 'SUCC'
print 'uninstall apk success'
# if len(uninstallresultf):
else:
msg6 = "FAIL"
print 'uninstall apk fail'
self.listapkpre.append(value) # 添加到list中
print 'uninstall apk end'
logging.debug(u2+ ' uninstall apk end')
wx.CallAfter(self.window.UpdateCtrlText, u2 + ' uninstall apk finished \n')
# 更新UI,msg信息中包含 apkName ,packagename,install ,monkey,unistall,other msg1 ,msg2,msg3,msg4
msg2 = sucname
msg3 = 'SUCC'
wx.CallAfter(self.window.UpListCtrl, msg1, msg2, msg3, msg4, msg6)
time.sleep(10)
# ----准备安装-----------------
print u"准备安装 " + str(self.listname[self.index])
print "self.index-->"+str(self.index)
print u'对应apk的名称-->'+self.dictnew[str(self.listname[self.index])]
logging.debug(u'准备安装:'+self.dictnew[str(self.listname[self.index])])
print "filepath--->" + self.filepath
msg1 = self.listname[self.index]
cmd_shell = CMD_ADBINSTALL + self.filepath + '\\' + self.listname[self.index]
# instres = os.popen(cmd_shell).read()
instres =os.system(cmd_shell)
logging.debug('instress result--->%d' %instres)
if instres == 0:
print u"安装成功"
del self.listapkback[:] # 清空列表
ms = " Install apk success \n"
wx.CallAfter(self.window.UpdateCtrlText, ms)
#安装成功的apk name
sucname = self.dictnew[str(self.listname[self.index])]
print sucname
logging.debug('first apk has install finished ,and wait next ')
#成功之后才有更新后的列表 ,失败是咩有更新列表的
n = os.popen('adb shell pm list package').read() # 安装APK之后得到package的所有包名
strlist1 = n.split('\n')
for value in strlist1:
self.listapkback.append(value) # 更新列表后,得到apk的列表
for indexapk in self.listapkback:
print u'安装成功后apk列表--->' + indexapk
print 'apklistback count %d' % len(self.listapkback)
#比较原来和更新后的apk列表
retDiff =list(set(self.listapkpre)^set(self.listapkback))
if len(retDiff) ==0 :
print u"安装系统了自带的apk了"
#执行策略 ,这里直接跳过,更新到列表中,安装卸载,monkey都不执行, 直接绿灯通过
logging.debug("this apk is already exist")
msg2 =sucname
msg3 ='SUCC'
msg4 ='SUCC'
msg6 ='SUCC'
wx.CallAfter(self.window.UpListCtrl, msg1, msg2, msg3, msg4, msg6)
#清空 listapkback
del self.listapkback[:]
else:
print u"安装失败"
logging.debug('install fail')
msf = " Install apk failure \n"
wx.CallAfter(self.window.UpdateCtrlText, msf)
msg1 = self.listname[self.index]
# msg2 = str(self.listname[self.index])
msg2 = self.dictnew[str(self.listname[self.index])]
msg3 = 'FAIL'
msg4 = 'FAIL'
msg5 = 'FAIL'
logging.error('install apk failed or has already install')
wx.CallAfter(self.window.UpListCtrl, msg1, msg2, msg3, msg4, msg5) #更新UI界面
time.sleep(10)
#清空列表
del self.listapkback[:]
# print "执行安装 " + str(self.listname[self.index])
print 'self.index --->%d',self.index
self.index += 1
# 等待30S
print "wait 10"
self.timeToQuit.wait(20)
# 继续执行
print "go on"
if self.timeToQuit.isSet():
print u"手动停止线程运行"
logging.debug('handler stop ')
wx.CallAfter(self.window.UpdateCtrlText, 'handler stop \n')
break
else:
print u"执行完成---over "
logging.debug('thread finish')
wx.CallAfter(self.window.UpdateCtrlText, 'thread finish')
wx.CallAfter(self.window.ThreadFinished, self)
###########################################################################
## Class MyFrame1
###########################################################################
class MyFrame1(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"TOP_APK_7.0", pos=wx.DefaultPosition, size=wx.Size(1200, 750),
style=wx.CLOSE_BOX | wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
# self.icon = wx.Icon('rocket.ico', wx.BITMAP_TYPE_ICO) # title 图标
# self.SetIcon(self.icon)
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
self.INITMENU()
self.m_splitter2 = wx.SplitterWindow(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SP_3D)
self.m_splitter2.SetSashGravity(0.2)
self.m_splitter2.Bind(wx.EVT_IDLE, self.m_splitter2OnIdle)
self.m_splitter2.SetMinimumPaneSize(20)
self.initpanel()
# parment
self.threads = [] # 线程池
self.ischose = False # 是否选择了应用程序
self.filepath = "" #文件路径
self.id_index = 0
self.isConnect = False #手机是否连接
self.count = 0 #gauage 计数
self.isGauage = False #进度条是否执行
self.BTNBIND()
self.INITSTATUBAR()
self.logcat()
logging.debug('top-apk loggingg')
#2S后调用连接手机
wx.FutureCall(2000,self.call,'call adb shell',name = 'get device')
def call(self,*args, **kwargs):
if self.connectDevice():
print u'连接成功'
logging.debug('connect device success')
else:
description ='当前连接失败,20S将重新连接'
aboutdialog = wx.AboutDialogInfo()
aboutdialog.SetDescription(description.decode('utf-8'))
wx.AboutBox(aboutdialog)
def initpanel(self):
bSizer7 = wx.BoxSizer(wx.HORIZONTAL)
self.m_panel1 = wx.Panel(self.m_splitter2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer121 = wx.BoxSizer(wx.VERTICAL)
bSizer10 = wx.BoxSizer(wx.HORIZONTAL)
sbSizer2 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel1, wx.ID_ANY, u"APK路径"), wx.HORIZONTAL)
self.m_staticText5 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"APK文件夹", wx.DefaultPosition,
wx.DefaultSize, 0)
self.m_staticText5.Wrap(-1)
sbSizer2.Add(self.m_staticText5, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.m_textCtrl1 = wx.TextCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition,
wx.DefaultSize, 0)
sbSizer2.Add(self.m_textCtrl1, 1, wx.ALL, 5)
self.m_button1 = wx.Button(sbSizer2.GetStaticBox(), wx.ID_ANY, u"...", wx.DefaultPosition, wx.DefaultSize, 0)
sbSizer2.Add(self.m_button1, 0, wx.ALL, 5)
bSizer10.Add(sbSizer2, 1, wx.EXPAND, 5)
bSizer121.Add(bSizer10, 0, wx.EXPAND, 5)
m_checkList2Choices = []
self.m_checkList2 = wx.CheckListBox(self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
m_checkList2Choices, 0)
bSizer121.Add(self.m_checkList2, 1, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5)
m_radioBox3Choices = [u"全选", u"全不选"]
self.m_radioBox3 = wx.RadioBox(self.m_panel1, wx.ID_ANY, u"选择类型", wx.DefaultPosition, wx.DefaultSize,
m_radioBox3Choices, 1, wx.RA_SPECIFY_ROWS)
self.m_radioBox3.SetSelection(1)
bSizer121.Add(self.m_radioBox3, 0, wx.ALL | wx.EXPAND | wx.ALIGN_RIGHT, 5)
bSizer14 = wx.BoxSizer(wx.HORIZONTAL)
self.m_button7 = wx.Button(self.m_panel1, wx.ID_ANY, u"确定", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer14.Add(self.m_button7, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.m_button8 = wx.Button(self.m_panel1, wx.ID_ANY, u"取消", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer14.Add(self.m_button8, 0, wx.ALL | wx.EXPAND | wx.ALIGN_BOTTOM, 5)
bSizer121.Add(bSizer14, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
self.m_panel1.SetSizer(bSizer121)
self.m_panel1.Layout()
bSizer121.Fit(self.m_panel1)
self.m_panel2 = wx.Panel(self.m_splitter2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer131 = wx.BoxSizer(wx.VERTICAL)
bSizer11 = wx.BoxSizer(wx.VERTICAL)
sbSizer3 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel2, wx.ID_ANY, u"结果输出"), wx.VERTICAL)
self.m_listCtrl1 = wx.ListCtrl(sbSizer3.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.LC_HRULES | wx.LC_REPORT | wx.LC_VRULES)
self.m_listCtrl1.InsertColumn(0, "Id", width=100)
self.m_listCtrl1.InsertColumn(1, "ApkId", width=100)
self.m_listCtrl1.InsertColumn(2, "ApkName", width=150)
self.m_listCtrl1.InsertColumn(3, "Install", width=100)
self.m_listCtrl1.InsertColumn(4, "Monkey", width=100)
self.m_listCtrl1.InsertColumn(5, "Uninstall", width=100)
self.m_listCtrl1.DeleteAllItems()
sbSizer3.Add(self.m_listCtrl1, 1, wx.ALL | wx.EXPAND, 5)
bSizer11.Add(sbSizer3, 1, wx.EXPAND, 5)
self.m_staticline1 = wx.StaticLine(self.m_panel2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.LI_HORIZONTAL)
bSizer11.Add(self.m_staticline1, 0, wx.EXPAND | wx.ALL, 5)
self.m_textCtrl3 = wx.TextCtrl(self.m_panel2, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize,
wx.TE_MULTILINE)
bSizer11.Add(self.m_textCtrl3, 1, wx.ALL | wx.EXPAND, 5)
self.m_gauge2 = wx.Gauge(self.m_panel2, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize,
wx.GA_HORIZONTAL)
self.m_gauge2.SetBezelFace(3)
self.m_gauge2.SetShadowWidth(3)
#
bSizer11.Add(self.m_gauge2, 0, wx.ALL | wx.EXPAND, 5)
bSizer131.Add(bSizer11, 6, wx.EXPAND, 5)
bSizer12 = wx.BoxSizer(wx.HORIZONTAL)
self.m_startBtn = wx.Button(self.m_panel2, wx.ID_ANY, u"开始", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer12.Add(self.m_startBtn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.m_stopbtn = wx.Button(self.m_panel2, wx.ID_ANY, u"停止", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer12.Add(self.m_stopbtn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
bSizer131.Add(bSizer12, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
self.m_panel2.SetSizer(bSizer131)
self.m_panel2.Layout()
bSizer131.Fit(self.m_panel2)
self.m_splitter2.SplitVertically(self.m_panel1, self.m_panel2, 304)
bSizer7.Add(self.m_splitter2, 20, wx.EXPAND, 10)
self.SetSizer(bSizer7)
self.Layout()
self.Centre(wx.BOTH)
#进度条
def OnGauge(self):
self.count =self.count+1
time.sleep(1)
if self.count>=99:
self.count = 0
self.m_gauge2.SetValue(self.count)
# menu菜单
def INITMENU(self):
self.m_menubar1 = wx.MenuBar(0)
self.m_menu1 = wx.Menu()
self.m_menuItem1 = wx.MenuItem(self.m_menu1, wx.ID_ANY, u"退出", wx.EmptyString, wx.ITEM_NORMAL)
self.m_menu1.AppendItem(self.m_menuItem1)
self.m_menubar1.Append(self.m_menu1, u" 文件 ")
self.m_menu2 = wx.Menu()
self.m_menuItem4 = wx.MenuItem(self.m_menu2, wx.ID_ANY, u"更改APK名称", wx.EmptyString, wx.ITEM_NORMAL)
self.m_menuItem5 = wx.MenuItem(self.m_menu2, wx.ID_ANY, u"导出结果", wx.EmptyString, wx.ITEM_NORMAL)
self.m_menu2.AppendItem(self.m_menuItem5)
self.m_menu2.AppendItem(self.m_menuItem4)
self.m_menubar1.Append(self.m_menu2, u" 配置 ")
self.m_menu4 = wx.Menu()
self.m_menuItem3 = wx.MenuItem(self.m_menu4, wx.ID_ANY, u"关于", wx.EmptyString, wx.ITEM_NORMAL)
# self.m_menuItem6 = wx.MenuItem(self.m_menu4, wx.ID_ANY, u"使用说明", wx.EmptyString, wx.ITEM_NORMAL)
self.m_menu4.AppendItem(self.m_menuItem3)
# self.m_menu4.AppendItem(self.m_menuItem6)
self.m_menubar1.Append(self.m_menu4, u" 帮助 ")
self.m_menu5 = wx.Menu()
self.m_menuItem6 = wx.MenuItem(self.m_menu4, wx.ID_ANY, u"使用说明", wx.EmptyString, wx.ITEM_NORMAL)
self.m_menu5.AppendItem(self.m_menuItem6)
self.m_menubar1.Append(self.m_menu5, u" 使用说明 ")
self.SetMenuBar(self.m_menubar1)
#按键的绑定
def BTNBIND(self):
# Connect Events
self.Bind(wx.EVT_CLOSE, self.OnWindowClose)
self.Bind(wx.EVT_MENU, self.OnClose, id=self.m_menuItem1.GetId())
self.Bind(wx.EVT_MENU, self.Export, id=self.m_menuItem5.GetId())
self.Bind(wx.EVT_MENU, self.OnAbout, id=self.m_menuItem3.GetId())
self.Bind(wx.EVT_MENU, self.ReName, id=self.m_menuItem4.GetId())
self.Bind(wx.EVT_MENU, self.Usage, id=self.m_menuItem6.GetId())
self.m_button1.Bind(wx.EVT_BUTTON, self.OnOpen)
self.m_button7.Bind(wx.EVT_BUTTON, self.OnSave)
self.m_button8.Bind(wx.EVT_BUTTON, self.OnCancle)
self.m_startBtn.Bind(wx.EVT_BUTTON, self.OnStart)
self.m_stopbtn.Bind(wx.EVT_BUTTON, self.OnStop)
self.m_stopbtn.Disable()
self.m_radioBox3.Bind(wx.EVT_RADIOBOX, self.OnRadioBoxChose) #
self.m_checkList2.Bind(wx.EVT_CHECKLISTBOX, self.OnCheckList)
#状态栏
def INITSTATUBAR(self):
self.m_statusBar1 = self.CreateStatusBar(2, wx.ST_SIZEGRIP, wx.ID_ANY)
# 将状态栏分割为3个区域,比例为1:2:3
self.m_statusBar1.SetFieldsCount(4)
self.m_statusBar1.SetStatusWidths([-1, -1, -1,-1]) # everage
# 创建定时器
self.timer = wx.Timer(self) # 创建定时器,在OnTimer1中启动
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) # 状态栏手机连接状态和当前时间
self.timer.Start(20000) # 启动执行一次
self.timer3 = wx.Timer(self) # 当前时间计时器
self.Bind(wx.EVT_TIMER, self.dataTime, self.timer3)
self.timer3.Start(1000) # 启动执行一次
self.SetStatusText("Phone State : "+u'等待连接...', 0)
self.SetStatusText('Monkey_log:'+os.getcwd(), 2) # crash 日志文件
self.SetStatusText('LogCat: '+os.getcwd()+'\\', 3) # crash 日志文件
def logcat(self):
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='Log_'+time.strftime('%Y-%m-%d-%H-%M-%S')+'.log',
filemode='w')
def connectDevice(self):
'''''检查设备是否连接成功,如果成功返回True,否则返回False'''
try:
# '''获取设备列表信息,并用"\r\n"拆分'''
deviceinfo =subprocess.check_output('adb devices').split('\r\n')
print deviceinfo
if deviceinfo[1]=='':
print 'wait for devices...'
return False
else:
print 'device info <--->',deviceinfo[1]
self.devicename = deviceinfo[1]
return True
except Exception, e:
print 'device connect fail:',e
# Virtual event handlers, overide them in your derived class
def OnTimer(self, event): # 状态栏手机连接状态
# phoneName = os.popen(ADB_GET_SERIALNO).read()
if self.connectDevice():
try:
# #设备名称
self.deviceInfo= subprocess.check_output('adb devices -l ')
print 'self.deviceinfo-->\n',self.deviceInfo
deviceName=re.findall(r'device product:(.*) model',self.deviceInfo,re.S)[0]
print deviceName
#
sysInfo= subprocess.check_output('adb shell cat /system/build.prop',shell=True)
# print sysInfo
#获取安卓版本号
androidVersion=re.findall("version.release=(\d\.\d)*",sysInfo , re.S)[0]
print androidVersion
self.isConnect = True
self.SetStatusText("Phone State : " +deviceName+"_"+androidVersion+ u" 已连接", 0)
# self.SetStatusText(u"Phone State : 连接", 0)
logging.debug('phone state already connect')
except Exception,e:
print u"异常-->", e
else:
self.SetStatusText(u"Phone State : 未连接,等待连接...", 0)
logging.debug('phone disconnect')
self.isConnect = False
self.m_startBtn.Enable()
self.m_stopbtn.Disable()
# pass
# 显示时间
def dataTime(self, event):
t = time.localtime(time.time())
StrIMSt = "Time :" + time.strftime(" %I:%M:%S", t)
self.SetStatusText(StrIMSt, 1) # 显示时间
# 更新listctrl
def UpListCtrl(self, msg1, msg2, msg3, msg4, msg5):
# pass
line = "%s" % self.id_index
self.m_listCtrl1.InsertStringItem(self.id_index, line) #id
self.m_listCtrl1.SetStringItem(self.id_index, 1, msg1) #name
self.m_listCtrl1.SetStringItem(self.id_index, 2, msg2) #pkagename
self.m_listCtrl1.SetStringItem(self.id_index, 3, msg3) #install
self.m_listCtrl1.SetStringItem(self.id_index, 4, msg4) #monkey
self.m_listCtrl1.SetStringItem(self.id_index, 5, msg5) #uninstall
self.id_index += 1
tup =(self.id_index,msg1,msg2,msg3,msg4,msg5)
data.append(tup)
print msg1,msg2,msg3,msg4,msg5
#更新文本信息
def UpdateCtrlText(self, message):
self.m_textCtrl3.AppendText(message)
#关闭
def OnClose(self, event):
logging.debug('oclose')
self.Destroy()
#导出数据
def Export(self,event):
logging.debug('Export result')
print 'Export result'
with open("OutResult.csv",'w') as csvfile:
csvfile.write(codecs.BOM_UTF8)
writer = csv.writer(csvfile,lineterminator='\n')
#先写入columns_name
writer.writerow(['ID','APK_ID','APK_Name','Install_Result','Monkey_Result','Uninstall_Result'])
for item in data:
logging.debug(item)
print item
#写入多行用writerows
writer.writerow(item)
def Usage(self,event):
print '使用说明'
logging.debug("Usage")
description = """使用说明(严格按照步骤执行):
1.点击配置,更改文件名称"
2.选择APK文件夹,全选,点击确定,最后点击开始执行
3.执行完成后,点击配置,选择导出结果,输出OutResult.csv"""
info = wx.AboutDialogInfo()
info.SetDescription(description.decode('utf-8'))
wx.AboutBox(info)
#重命名文件
def ReName(self,event):
print u'rename'
logging.debug('rename')
"""
Create and show the Open FileDialog
"""
cdlg = wx.DirDialog(self, u"选择重命名的文件夹", style=wx.DD_DEFAULT_STYLE)
if cdlg.ShowModal() == wx.ID_OK:
print cdlg.GetPath()
self.remepath =cdlg.GetPath()
renamelist = os.listdir(cdlg.GetPath())
renamelist.sort()
self.renamesave =[] #修改名字之前 ,apk名称,保存名称列表
i = 0
for self.rename_index in renamelist:
print "apk name-->"+self.rename_index
oldname = str(self.rename_index)
logging.debug('add apkname in list')
self.renamesave.append(oldname)
# 重命名
os.rename(cdlg.GetPath()+"\\"+oldname,cdlg.GetPath()+"\\"+str(i)+".apk")
dict[oldname]=str(i)+".apk"
i =i+1
for self.d_index in self.renamesave:
# logging.debug(u'字典对应 %s %s' %d_index %dict[d_index])
print '原名:'+self.d_index.decode('utf-8')+"<--->"+"改名:"+ dict[self.d_index]
# 添加到新的字典中
dictnew[dict[self.d_index]] =(self.d_index).decode('utf-8')
logging.debug("新字典结果:%s" %dictnew)
print dictnew
logging.debug(u"写入到csv文件中")
self.createDictCSV("DictFile.csv",dict)
cdlg.Destroy()
# 功能:将一个字典写入到csv文件中
def createDictCSV(self,fileName="", dataDict={}):
with open(fileName, "wb") as csvFile:
logging.debug(u"具体写入文件中")
csvFile.write(codecs.BOM_UTF8)
csvWriter = csv.writer(csvFile)
for k,v in dataDict.iteritems():
csvWriter.writerow([k,v])
csvFile.close()
# 关于
def OnAbout(self, event):
description = """The tool is made for better execution of android automaiton ,the code is python and the current version is """ + str(
VERSION) + """ and will be updatad slowly,if there is a problem is exuecution ,contact me ,My name is Toby
"""
info = wx.AboutDialogInfo()
info.SetVersion(str(VERSION))
info.SetDescription(description)
info.AddDeveloper('JUNWANG He,Email: hejunwang@qiku.com')
wx.AboutBox(info)
# 打开
def OnOpen(self, event):
dlg = wx.DirDialog(self, u"选择文件夹", style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
print dlg.GetPath()
self.filepath = dlg.GetPath()
print "filepath -->%s" % self.filepath # 文件路径
logging.debug("filepath -->%s" % self.filepath)
self.m_textCtrl3.AppendText(u"APK文件路径--->%s" % self.filepath + "\n")
self.m_textCtrl1.SetValue(dlg.GetPath())
l = os.listdir(dlg.GetPath()) #获取文件夹下的文件,并进行排序
l.sort()
print l
print u"文件列表长度%d" % len(l)
self.filelen = len(l)
self.listname = [] #apk的名称
self.m_checkList2.Clear() # 清空列表中的文件
for index in l:
self.m_checkList2.Append(index) # 文件填充到单选列表中
print index
self.listname.append(index) # #添加到listname[]中
# print self.m_checkList1.GetSelection()
for n in self.listname:
print "listname-->" + n
self.splitname = n
print n.split('.')[0]
print self.splitname
self.m_button7.Enable()
dlg.Destroy()
def ThreadFinished(self, thread): # 停止线程执行
print '移除线程'
self.threads.remove(thread)
self.m_startBtn.Enable()
self.m_stopbtn.Disable()
self.isGauage =False
# 保存
def OnSave(self, event):
self.ischose = True # 是否选择了应用程序
print "Set ischose =true"
self.m_textCtrl3.AppendText("OnSave\n")
# 取消
def OnCancle(self, event):
# event.Skip()
self.ischose = False # 是否选择了应用程序
print "Set ischose =fale"
self.m_textCtrl3.AppendText("取消保存\n")
# 开始按钮
def OnStart(self, event):
logging.debug('onstart clicked')
if self.ischose and (self.filepath != "") and self.isConnect:
# 文件路径 文件列表名称 列表文件大小
thread = topapkThread(self.filepath, self.listname, self.filelen, self,dictnew)
self.threads.append(thread)
thread.start()
print 'All Select'
self.m_startBtn.Disable()
self.m_stopbtn.Enable()
self.isGauage = True
if self.isGauage:
self.OnGauge()
else:
dlg = wx.MessageDialog(None, u"没有选择要执行的apk或者是手机未连接,请检测", u"标题信息", wx.YES_NO | wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_YES:
print u'没有选择,或是手机未连接'
self.m_startBtn.Enable()
self.m_stopbtn.Disable()
dlg.Destroy()
#停止按钮
def OnStop(self, event):
self.m_startBtn.Enable()
self.m_stopbtn.Disable()
self.topapk_StopThread()
self.m_textCtrl3.AppendText(u'手动停止\n')
self.isGauage =False
def topapk_StopThread(self): # 线程停止
while self.threads:
thread = self.threads[0]
# print "thread is -->"+thread
thread.stop()
self.threads.remove(thread)
#分割线
def m_splitter2OnIdle(self, event):
self.m_splitter2.SetSashPosition(343)
self.m_splitter2.Unbind(wx.EVT_IDLE)
# 选择框
def OnRadioBoxChose(self, event):
rb = self.m_radioBox3.GetSelection()
print rb
if rb == 0:
self.filecount = self.m_checkList2.GetCount()
self.findcheck = self.m_checkList2.GetChecked()
print "全部选择 " + str(self.filecount) + "\nfindcheck --" + str(len(self.findcheck))
# 全选
for n in range(self.filecount):
self.m_checkList2.Check(n, check=True)
else:
print "全不选"
for n in range(self.filecount):
self.m_checkList2.Check(n, check=False)
def OnCheckList(self, event):
index = self.m_checkList2.GetSelection()
print "onChecklist---->index %d" % index
#关闭窗口
def OnWindowClose(self, event):
self.Destroy()
if __name__ == '__main__':
app = wx.App()
MyFrame1(None).Show()
app.MainLoop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)