python monkey脚本

2023-05-16


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(使用前将#替换为@)

python monkey脚本 的相关文章

随机推荐

  • ROS(二):读取摄像头图像节点并发布topic以及订阅

    读取树莓派摄像头信息发布到ROS话题中 摄像头为树莓派第二代摄像头 ros为kinetic版本 ubuntu系统 参考文档链接 http www ncnynl com archives 201611 1067 html http blog
  • 如何查看/确认linux是否能上网

    很多linux系统没有可视化界面 xff0c 无法通过界面访问一个外网的地址 xff08 比如 www baidu com 来确认是否能上网 在这种情况下 xff0c 确认linux服务器是不是能联网的方法很简单 xff0c 只需要ping
  • Ubuntu从源码编译LGSVL搭建环境

    上一周借助校园里面的教育网终于git clone成功了Apollo5 5的官方master repository xff0c 并build其gpu版本的模拟器 xff0c 根据最新的Apollo5 5 master文件描述 xff0c 桥接
  • #移动开发者大会#总结

    移动开发者大会 总结 xff08 有限的发言者 xff09 xff1a 李开复 xff1a 1 Android将在中国一骑绝尘 今年底中国将有4000万台Android手机 xff0c 2000万台iPhone 明年底总数会翻一倍 xff0
  • 河北金融学院赴京参加2011移动开发者大会有感

    记从被邀请到参加移动开发者大会的全过程 10月底 xff0c 突然接到潘永强老师的邀请 参加2011移动开发者大会 xff0c 当时我们真的很兴奋 xff0c 因为对于我们来说 xff0c 去北京是第一次 xff0c 去参加如此大型的会议更
  • 2011河北金融学院CSDN高校俱乐部动员大会

    2011年11月24日下午二点 xff0c 我校CSDN高校俱乐部动员大会在教学楼B123举行 该次大会主要针对大一学生召开 xff0c 号召大家了解并加入CSDN高校俱乐部 俱乐部指导老师王洪涛老师 计算机协会指导老师杜光辉老师 以及优秀
  • “激情与梦想 我的程序员之路”—2012高校巡讲

    2012年3月29日下午2点半 xff0c CSDN高校俱乐部项目主管潘永强老师在我校进行了一场以 激情与梦想 xff0c 我的程序员之路 为主题的演讲 信息管理与工程系团总支书记陈春燕 指导老师王洪涛以及杜光辉 刘冲等7位老师出席了该次讲
  • TX2下编译qt程序步骤

    1 将 aarch64 qt 5 15 1 tar bz2 解压到 opt 2 在 bashrc 添加qt的库和路进 art 64 art desktop opt cat bashrc tail n 2 export LD LIBRARY
  • 电子政务三网架构

    国家电子政务网络架构由政务内网 政务专网 政务外网组成 政务内网是涉密网络 xff0c 在上面传输涉密公文 xff0c 属高度机密的网络 xff0c 覆盖范围尽可能小 xff0c 它与国际互联网物理隔离 政务专网是党政机关非涉密办公网 xf
  • SDN介绍(什么是SDN)

    SDN介绍 一 xff0e 什么是SDN 二 xff0e SDN解决什么问题 xff1f 三 xff0e 传统网络概念和结构体系传统网络数据控制与转发 xff1a 传统网络架构 xff1a 四 xff0e SDN概述SDN xff08 So
  • 我的2011--快乐最重要

    呵呵 xff0c 听着郭德纲和于谦老师的相声 xff0c 开始写这篇文章 xff0c 刚毕业不到六个月 xff0c 就换了一份工作 xff0c 很多事情都在意料之外 xff0c 很多事情又在意料之中 xff0c 总之 xff0c 以后回忆到
  • 朱金灿:韧性、悟性、具备快速学习能力是我喜欢的特质

    英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台 通过线下线上的互动形式 xff0c 为CSDN社区专家提供更多学习 合作 宣传的机会 英雄会后续将在北上广深等国内一二线城市建立分会 xff0c 各个分会后期将组织技术交流活动
  • 本地vnc(TigerVNC)远程linux server,提示拒绝连接

    可能原因 amp 分析 xff1a 可确认下初始的系统环境变量是否被改动 xff0c 如新安装的anaconda自动添加到环境变量 xff0c 且放置在系统的原有环境变量的前面 xff0c 可尝试将后加的环境变量编辑到后面 xff0c 再重
  • 高质量嵌入式Linux C编程第一次博客作业

    1 xff1a linux 与 Unix的关系 xff1f 某些PC机的Unix和Linux在实现方面相类似 几乎所有的商业Unix版本都基本支持同样的软件 程序设计环境和网络特性 然而 xff0c Linux和Unix的商业版本依然存在许
  • java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration xff0c 是 JDK 1 5 中引入的新特性 xff0c 存放在 java lang 包中 下面是我在使用 enum 过程中的一些经验和总结 xff0c 主要包括如下内容 xff1a 1 原始的
  • RBAC用户、角色、权限、组设计方案

    设计一个灵活 通用 方便的权限管理系统 在这个系统中 xff0c 我们需要对系统的所有资源进行权限控制 xff0c 那么系统中的资源包括哪些呢 xff1f 我们可以把这些资源简单概括为静态资源 xff08 功能操作 数据列 xff09 和动
  • ssh 怎样以root用户登录

    sudo vim etc ssh sshd config 找到并用 注释掉这行 xff1a PermitRootLogin prohibit password 新建一行 添加 xff1a PermitRootLogin yes 重启服务 s
  • python 函数内部修改外部变量

    如果内部修改外部变量需要nonlocal xff0c global def f1 print 34 in f1 34 num 61 111 def f2 nonlocal num num 61 222 print num f2 print
  • python 列表生成式将两个列表组合

    l1 61 1 2 3 4 5 l2 61 10 20 30 40 50 l3 61 x y for x in l1 for y in l2 if y x 61 61 10 l4 61 x y for x in l1 for y in l2
  • python monkey脚本

    import wx import wx xrc import os import threading import thread import logging import re import time import csv import