一个经常使用的MonkeyRunner脚本

python使用monkeyrunner对录制脚本进行回放脚本 Android SDK与Python环境配置完毕,调用MonkeyRunner的MonkeyRecorder与MonkeyRunner接口启动脚本录制工具,脚本我命名为app_playback.py,把编写的脚本放在Android SDK安装目录下面的\tools目录下,与monkeyrunner.bat在同一级目录下: #coding=utf8 #需要用到命令行参数列表因此导入sys impo 阅读详情

工作中经常用的一个脚本

 

注:有些小伙伴反应,这个脚本在win上跑不起来,笔者编译发现与win环境下的编码有关,改了一个win的版本在文末。

2017.3.1补充 如果没有wx这个库,请移步https://www.wxpython.org/download.php寻找对应版本下载

 

Linux版本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
import os
import time
import string

class MyFrame(wx.Frame):
    delayDefault = "2"
    seedDefault = "5000000"
    executionFrequencyDefault = "60000000"
    logDir = "./"
    def __init__(self):

        wx.Frame.__init__(self, None, -1, "My Frame", size=(500, 800))
        panel = wx.Panel(self, -1)

        xPos = 10
        xPos1 = 180
        yPos  = 12
        yDelta = 40
        excuteMode = ["忽略程序崩溃", 
                    "忽略程序无响应", 
                    "忽略安全异常",
                    "出错中断程序",
                    "本地代码导致的崩溃",
                    "默认"
                    ]


        logMode = ["简单","普通","详细"]
        executionModeDefault = excuteMode[0]

        menuBar = wx.MenuBar()
        menu1 = wx.Menu("")
        menuBar.Append(menu1, "File")
        self.SetMenuBar(menuBar)

        wx.StaticText(panel, -1, "种子数:", pos=(xPos, yPos))
        self.seedCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos))
        self.seedCtrl.Bind(wx.EVT_KILL_FOCUS, self.OnAction)
        self.seedCtrl.SetFocus()

        wx.StaticText(panel, -1, "执行次数:", pos=(xPos, yPos+yDelta))
        self.excuteNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos+yDelta))
        
        wx.StaticText(panel, -1, "延时:", pos=(xPos, yPos+2*yDelta))
        self.delayNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos+2*yDelta))
        
        wx.StaticText(panel, -1, "执行方式:", pos=(xPos, yPos+3*yDelta))
    
        self.excuteModeCtrl = wx.ComboBox(panel, -1, "", (xPos1,yPos+3*yDelta), choices=excuteMode,style=wx.CB_DROPDOWN)

        self.checkListBox = wx.CheckListBox(panel, -1, (xPos, yPos+4*yDelta ), (400, 350), [])

        yPoslayout = yPos+14*yDelta

        wx.StaticText(panel, -1, "日志输出等级:", pos=(xPos, yPoslayout-yDelta))
        self.logModeCtrl = wx.ComboBox(panel, -1, "", (xPos1,yPoslayout-yDelta), choices=logMode,style=wx.CB_DROPDOWN)

        self.readButton = wx.Button(panel, -1, "读取程序包", pos=(xPos, yPoslayout))
        self.Bind(wx.EVT_BUTTON, self.OnReadClick, self.readButton)
        self.readButton.SetDefault()

        self.selectButton = wx.Button(panel, -1, "全部选择", pos=(xPos+120, yPoslayout))
        self.Bind(wx.EVT_BUTTON, self.OnSelectAllClick, self.selectButton)
        self.selectButton.SetDefault()
    
        self.unselectButton = wx.Button(panel, -1, "全部取消", pos=(xPos+120*2, yPoslayout))
        self.Bind(wx.EVT_BUTTON, self.OnUnselectClick, self.unselectButton)

        self.defaultButton = wx.Button(panel, -1, "默认参数", pos=(xPos, yPoslayout+yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnResetClick, self.defaultButton)
        self.defaultButton.SetDefault()

        self.quickButton = wx.Button(panel, -1, "一键Monkey", pos=(xPos+120, yPoslayout+yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnQuickStartClick, self.quickButton)
        self.quickButton.SetDefault()

        self.doButton = wx.Button(panel, -1, "开始Monkey", pos=(xPos+120*2, yPoslayout+yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnStartClick, self.doButton)
        self.doButton.SetDefault()
 
        self.logButton = wx.Button(panel, -1, "生成Log", pos=(xPos, yPoslayout+2*yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnBuildLog, self.logButton)
        self.logButton.SetDefault()

    def OnAction(self, event):
        value = self.seedCtrl.GetValue().strip()
        if all( x in '0123456789' for x in value):
            print value
            self.seedCtrl.SetValue(str(self.seedCtrl.GetValue()))
        
    def OnQuickStartClick(self, event):
        self.Reset()
        self.StartCmd()

    def OnSelectAllClick(self, event):
        listString = self.checkListBox
        count = listString.GetCount()
        array = []
        for i in range(0, count):
            array.append(i)
        listString.SetChecked(array)

    def OnUnselectClick(self, event):
        self.checkListBox.SetChecked([])
        
    def OnResetClick(self, event):
        self.Reset()

    def OnReadClick(self, event):
        self.checkListBox.Clear()
        os.system("adb shell ls data/data > ~/log.log")
        home = os.path.expanduser('~')
        f = open(home+"/log.log", 'r')
        line = f.readline()
        while line:
            line = f.readline()
            if (line != ""):
                print "===="+line
                self.checkListBox.Append(line)
        f.close()
        
    def OnStartClick(self, event):
        self.StartCmd()

    def Reset(self):
        self.ListFiles("/sdcard/mtklog")
        self.seedCtrl.SetValue(self.seedDefault)
        self.excuteNumCtrl.SetValue(self.executionFrequencyDefault)
        self.delayNumCtrl.SetValue(self.delayDefault)
        self.excuteModeCtrl.SetSelection(5)
        self.logModeCtrl.SetSelection(2)

    def StartCmd(self):

        seed = self.seedCtrl.GetValue()
        excuteNum = self.excuteNumCtrl.GetValue()
        delayNum = self.delayNumCtrl.GetValue()
        excuteMode = self.excuteModeCtrl.GetValue()
        date = time.strftime('%Y%m%d%H%m%s',time.localtime(time.time()))
        listString = self.checkListBox
    
        package_section = ""
        package_list = listString.GetCheckedStrings()
        print "select package count:"+str(len(package_list))
        for i in range(0, len(package_list)):
            print package_list
            package = package_list[i]
            pack = package.strip('\r\n')
            package_section += (" -p "+pack)
            
        print package_section
        
        seed_section = " -s "+self.seedCtrl.GetValue()
        delay_section =" --throttle "+ delayNum
        log_section = ""
        mode_section = ""

        log_id = self.logModeCtrl.GetSelection()
        if (log_id == 0):
            log_section += " -v"
        elif (log_id == 1):
            log_section += " -v -v"
        elif (log_id == 2):
            log_section += " -v -v -v"


        mode_id = self.excuteModeCtrl.GetSelection()
        mode = [" --ignore-crashes ",
                " --ignore-timeouts ",
                " --ignore-security-exceptions ",
                " --ignore-native-crashes ",
                " --monitor-native-crashes "]
        if (mode_id == 0):
            mode_section = mode[0]
        elif (mode_id == 1):
            mode_section = mode[1]
        elif (mode_id == 2):
            mode_section = mode[2]
        elif (mode_id == 3):
            mode_section = mode[3]
        elif (mode_id == 4):
            mode_section = mode[4]
        else:
            mode_section = mode[0]+mode[1]+mode[2]+mode[3]+mode[4]

##############   create monkey log dir ###############             
        
        usr_home = os.path.expanduser('~')
        os.chdir(usr_home)
        logDir = "MonkeyLog_"+date
        os.system("mkdir "+logDir)
        self.logDir = os.path.join(usr_home,logDir)
        print self.logDir
        os.chdir(logDir)

###############  record monkey trace ################

        monkeyCmd = "adb shell monkey "
        monkeyCmd = monkeyCmd+delay_section+seed_section+package_section+log_section+mode_section        
        monkeyCmd = monkeyCmd + " "+excuteNum+" > trace.log" 
        print monkeyCmd
        os.system(monkeyCmd)
        print '-----------monkey finish----------' 

    def ListFiles(self,path):
        for root,dirs,files in os.walk(path):
            log_f = ""
            for f in files:
                if(f.find("main") == 0):
                    log_f = f.strip()
                    os.chdir(root)
                    if (log_f != ""):
                        grep_cmd = "grep -Eni -B20 -A20 'FATAL|error|exception|system.err|androidruntime' "+log_f+" > "+log_f+"_fatal.log"
                        os.system(grep_cmd)
        print "--------------finish build log-----------------"


    def BuildFatalLog(self,path):
        self.ListFiles(path)


    def OnBuildLog(self,event):
        os.chdir(self.logDir)
        print self.logDir
        date = time.strftime('%Y-%m-%d-%H-%M',time.localtime(time.time()))
        dir_m = "Monkey_Log_"+date.replace("-","")
        dir0 = "sdcard0_mtklog"
        dir1 = "sdcard1_mtklog"

        if (os.path.exists(dir_m+"/"+dir0)):
            print "already exists"
        else:
            os.system("mkdir -p "+dir_m+"/"+dir0)

        if (os.path.exists(dir_m+"/"+dir1)):
            print "already exists"
        else:
            os.system("mkdir -p "+dir_m+"/"+dir1)

        os.chdir(dir_m)
        os.system("adb pull /storage/sdcard0/mtklog/ "+dir0)
        os.system("adb pull /storage/sdcard1/mtklog/ "+dir1)
        self.BuildFatalLog(os.getcwd())

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show(True)
    app.MainLoop()


win

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import wx
import os
import time
import string


class MyFrame(wx.Frame):
    delayDefault = "2"

    seedDefault = "5000000"
    executionFrequencyDefault = "600000"
    logDir = "./"
    pacegeMode = ["mobi.wifi.toolbox"]
    def __init__(self):

        wx.Frame.__init__(self, None, -1, "Monkey自动化测试工具".decode('utf-8'), size=(500, 800))
        panel = wx.Panel(self, -1)


        xPos = 10
        xPos1 = 180
        yPos  = 12
        yDelta = 40


        ignoreFATALStr = "忽略程序崩溃"
        ignoreAnrStr = "忽略程序无响应"
        ignoreSafeStr = "忽略安全异常"
        errorStopStr = "出错中断程序"
        localErrorStr = "本地代码导致的崩溃"
        default = "默认"
        seedStr = "种子数:"
        processTimesStr = "执行次数:"
        delayStr = "延时:"
        processTypeStr = "执行方式:"
        pacageNameStr = "包名:"
        logLeverStr = "日志输出等级:"
        loadAppStr = "读取程序包"
        selectAllStr = "全部选择"
        cancelAllStr = "全部取消"
        defaultParamsStr = "默认参数"
        hotMonkeyStr = "一键Monkey"
        hotMonkeyWifiStr = "一键测Wifi"
        stopMonkeyStr = "停止Monkey"
        startMonkeyStr = "开始Monkey"
        execLogStr = "生成Log"
        logLeverSStr = "简单"
        logLeverNStr = "普通"
        logLeverFStr = "详细"


        excuteMode = [ignoreFATALStr.decode('utf-8'),
                ignoreAnrStr.decode('utf-8'),
                ignoreSafeStr.decode('utf-8'),
                errorStopStr.decode('utf-8'),
                localErrorStr.decode('utf-8'),
                default.decode('utf-8')
               ]


        logMode = [logLeverSStr.decode('utf-8'), logLeverNStr.decode('utf-8'), logLeverFStr.decode('utf-8')]
        executionModeDefault = excuteMode[0]


        menuBar = wx.MenuBar()
        menu1 = wx.Menu("")
        menuBar.Append(menu1, "File")
        self.SetMenuBar(menuBar)


        wx.StaticText(panel, -1, seedStr.decode('utf-8'), pos=(xPos, yPos))
        self.seedCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos))
        self.seedCtrl.Bind(wx.EVT_KILL_FOCUS, self.OnAction)
        self.seedCtrl.SetFocus()


        wx.StaticText(panel, -1, processTimesStr.decode('utf-8'), pos=(xPos, yPos + yDelta))
        self.excuteNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos + yDelta))

        wx.StaticText(panel, -1, delayStr.decode('utf-8'), pos=(xPos, yPos + 2 * yDelta))
        self.delayNumCtrl = wx.TextCtrl(panel, -1, "", pos=(xPos1, yPos + 2 * yDelta))

        wx.StaticText(panel, -1, processTypeStr.decode('utf-8'), pos=(xPos, yPos + 3 * yDelta))


        wx.StaticText(panel, -1, pacageNameStr.decode('utf-8'), pos=(xPos, yPos + 4 * yDelta))

        self.excuteModeCtrl = wx.ComboBox(panel, -1, "", (xPos1, yPos + 3 * yDelta), choices=excuteMode,
                                              style=wx.CB_DROPDOWN)


        self.excutePacageCtrl = wx.ComboBox(panel, -1, "", (xPos1, yPos + 4 * yDelta), choices=self.pacegeMode,
                                                style=wx.CB_DROPDOWN)


        self.checkListBox = wx.CheckListBox(panel, -1, (xPos, yPos + 5 * yDelta), (400, 350), [])


        yPoslayout = yPos + 15 * yDelta


        wx.StaticText(panel, -1, logLeverStr.decode('utf-8'), pos=(xPos, yPoslayout - yDelta))
        self.logModeCtrl = wx.ComboBox(panel, -1, "", (xPos1, yPoslayout - yDelta), choices=logMode,
                                           style=wx.CB_DROPDOWN)


        self.readButton = wx.Button(panel, -1, loadAppStr.decode('utf-8'), pos=(xPos, yPoslayout))
        self.Bind(wx.EVT_BUTTON, self.OnReadClick, self.readButton)
        self.readButton.SetDefault()


        self.selectButton = wx.Button(panel, -1, selectAllStr.decode('utf-8'), pos=(xPos + 120, yPoslayout))
        self.Bind(wx.EVT_BUTTON, self.OnSelectAllClick, self.selectButton)
        self.selectButton.SetDefault()

        self.unselectButton = wx.Button(panel, -1, cancelAllStr.decode('utf-8'), pos=(xPos + 120 * 2, yPoslayout))
        self.Bind(wx.EVT_BUTTON, self.OnUnselectClick, self.unselectButton)


        self.defaultButton = wx.Button(panel, -1, defaultParamsStr.decode('utf-8'), pos=(xPos, yPoslayout + yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnResetClick, self.defaultButton)
        self.defaultButton.SetDefault()


        self.quickButton = wx.Button(panel, -1, hotMonkeyStr.decode('utf-8'), pos=(xPos + 120, yPoslayout + yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnQuickStartClick, self.quickButton)
        self.quickButton.SetDefault()


        self.doButton = wx.Button(panel, -1, startMonkeyStr.decode('utf-8'), pos=(xPos + 120 * 2, yPoslayout + yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnStartClick, self.doButton)
        self.doButton.SetDefault()

        self.logButton = wx.Button(panel, -1, execLogStr.decode('utf-8'), pos=(xPos, yPoslayout + 2 * yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnBuildLog, self.logButton)
        self.logButton.SetDefault()


        self.quickWifiButton = wx.Button(panel, -1, hotMonkeyWifiStr.decode('utf-8'),
                                             pos=(xPos + 120, yPoslayout + 2 * yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnQuickWifi, self.quickWifiButton)
        self.quickWifiButton.SetDefault()


        self.stopButton = wx.Button(panel, -1, stopMonkeyStr.decode('utf-8'),
                                        pos=(xPos + 120 * 2, yPoslayout + 2 * yDelta))
        self.Bind(wx.EVT_BUTTON, self.OnStop, self.stopButton)
        self.stopButton.SetDefault()


    def OnQuickWifi(self, event):
        self.Reset()

        self.StartCmd(" -p mobi.wifi.toolbox")


    def OnStop(self, event):
        os.system("adb shell ps | grep monkey > c:/temp.txt")

        f = open("c:/temp.txt", 'r')
        line = f.readline()
        if (line != ""):
            cmd = "adb shell kill " + line.strip().split()[1]
            print ("****" + cmd + "****")
            os.system(cmd)
        f.close()


    def OnAction(self, event):
        value = self.seedCtrl.GetValue().strip()

        if all(x in '0123456789' for x in value):
            print value
            self.seedCtrl.SetValue(str(self.seedCtrl.GetValue()))

    def OnQuickStartClick(self, event):
        self.Reset()

        self.StartCmd("")


    def OnSelectAllClick(self, event):
        listString = self.checkListBox

        count = listString.GetCount()
        array = []
        for i in range(0, count):
                array.append(i)
        listString.SetChecked(array)


    def OnUnselectClick(self, event):
        self.checkListBox.SetChecked([])


    def OnResetClick(self, event):
        self.Reset()

    def OnReadClick(self, event):
        self.checkListBox.Clear()

        os.system("adb shell pm list packages > D:/log.log")
        home = 'd:'
        f = open(home + "/log.log", 'r')
        line = f.readline()
        while line:
            line = f.readline()
            if (line != ""):
                line = line.split(':')[1]
            print "====" + line
            self.checkListBox.Append(line)
        f.close()

    def OnStartClick(self, event):
        self.StartCmd("")

    def Reset(self):
        self.ListFiles("/sdcard/mtklog")

        self.seedCtrl.SetValue(self.seedDefault)
        self.excuteNumCtrl.SetValue(self.executionFrequencyDefault)
        self.delayNumCtrl.SetValue(self.delayDefault)
        self.excuteModeCtrl.SetSelection(5)
        self.logModeCtrl.SetSelection(0)
        self.excutePacageCtrl.SetSelection(0)


    def StartCmd(self, pacageName):

        seed = self.seedCtrl.GetValue()
        excuteNum = self.excuteNumCtrl.GetValue()
        delayNum = self.delayNumCtrl.GetValue()
        excuteMode = self.excuteModeCtrl.GetValue()
        date = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
        listString = self.checkListBox

        package_section = ""
        package_list = listString.GetCheckedStrings()
        print "select package count:" + str(len(package_list))
        for i in range(0, len(package_list)):
            print package_list
            package = package_list[i]
            pack = package.strip('\r\n')
            package_section += (" -p " + pack)

        print package_section.decode('utf-8')


        seed_section = " -s " + self.seedCtrl.GetValue()
        delay_section = " --throttle " + delayNum
        log_section = ""
        mode_section = ""


        log_id = self.logModeCtrl.GetSelection()
        if (log_id == 0):
                log_section += " -v"
        elif (log_id == 1):
            log_section += " -v -v"
        elif (log_id == 2):
            log_section += " -v -v -v"




        mode_id = self.excuteModeCtrl.GetSelection()
        mode = [" --ignore-crashes ",
            " --ignore-timeouts ",
            " --ignore-security-exceptions ",
            " --ignore-native-crashes ",
            " --monitor-native-crashes "]
        if (mode_id == 0):
                mode_section = mode[0]
        elif (mode_id == 1):
            mode_section = mode[1]
        elif (mode_id == 2):
            mode_section = mode[2]
        elif (mode_id == 3):
            mode_section = mode[3]
        elif (mode_id == 4):
            mode_section = mode[4]
        else:
            mode_section = mode[0] + mode[1] + mode[2] + mode[3] + mode[4]
    ##############   create monkey log dir ###############

         # usr_home = os.path.expanduser('~')
         # os.chdir(usr_home)
        logDir = "c:\MonkeyLog_" + date
         # os.system("mkdir "+logDir)
        self.logDir = logDir.decode('utf-8')
        print self.logDir
         # os.chdir(logDir)
    ###############  record monkey trace ################


        if (pacageName != ""):
                package_section = pacageName
        elif (self.excutePacageCtrl.GetSelection() != ""):
            package_section = " -p " + self.pacegeMode[self.excutePacageCtrl.GetSelection()]
        print "package_section " + package_section


        monkeyCmd = "adb shell monkey "
        monkeyCmd = monkeyCmd + delay_section + seed_section + package_section + log_section + mode_section
        monkeyCmd = monkeyCmd + " " + excuteNum + " > c:/trace.log_" + date
        print monkeyCmd
        os.system(monkeyCmd)
         # adb shell monkey  --throttle 2 -s 5000000 -v -v -v --ignore-crashes  --ignore-timeouts  --ignore-security-exceptions  --ignore-native-crashes  --monitor-native-crashes  60000000 > trace.log
         # adb shell monkey  --throttle 2 -s 5000000 mobi.wifi.toolbox -v -v -v --ignore-crashes  --ignore-timeouts  --ignore-security-exceptions  --ignore-native-crashes  --monitor-native-crashes  60000000 > trace.log
         # adb shell monkey  --throttle 2 -s 5000000 mobi.wifi.toolbox -v -v -v --ignore-crashes  --ignore-timeouts  --ignore-security-exceptions  --ignore-native-crashes  --monitor-native-crashes  60000000 > trace.log
         # adb shell monkey  --throttle 2 -s 5000000 -p mobi.wifi.toolbox -v -v -v --ignore-crashes  --ignore-timeouts  --ignore-security-exceptions  --ignore-native-crashes  --monitor-native-crashes  60000000 > trace.log
    def ListFiles(self, path):
        for root, dirs, files in os.walk(path):
                log_f = ""

        for f in files:
            if (f.find("main") == 0):
                    log_f = f.strip()
            os.chdir(root)
            if (log_f != ""):
                grep_cmd = "grep -Eni -B20 -A20 'FATAL|error|exception|system.err|androidruntime' " + log_f + " > " + log_f + "_fatal.log"
            os.system(grep_cmd)
    print "--------------finish build log-----------------"


# com.xixi.leakcanary
# adb shell monkey  --throttle 2 -s 5000000 -p com.xixi.leakcanary -v -v -v --ignore-crashes  --ignore-timeouts  --ignore-security-exceptions  --ignore-native-crashes  --monitor-native-crashes  6000 > c:/trace1.log
    def BuildFatalLog(self, path):
        self.ListFiles(path)

    def OnBuildLog(self, event):
        os.chdir(self.logDir)

        print self.logDir
        date = time.strftime('%Y-%m-%d-%H-%M', time.localtime(time.time()))
        dir_m = "Monkey_Log_" + date.replace("-", "")
        dir0 = "sdcard0_mtklog"
        dir1 = "sdcard1_mtklog"


        if (os.path.exists(dir_m + "/" + dir0)):
                print "already exists"
        else:
            os.system("mkdir -p " + dir_m + "/" + dir0)


        if (os.path.exists(dir_m + "/" + dir1)):
                print "already exists"
        else:
            os.system("mkdir -p " + dir_m + "/" + dir1)


        os.chdir(dir_m)
        os.system("adb pull /storage/sdcard0/mtklog/ " + dir0)
        os.system("adb pull /storage/sdcard1/mtklog/ " + dir1)
        self.BuildFatalLog(os.getcwd())

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    frame.Show(True)
    app.MainLoop()

成功运行效果如下图

Android自动化工具Monkeyrunner使用(七) —— 录制、回放脚本 本文主要解释如何使用monkeyrunner来实现脚本的录制和回放 一:准备条件      在电脑端配置android SDK环境,具体内容可参考本博客内相关文章 二: 用到的录制、回放脚本 录制脚本: recorder.py #!/usr/bin/env monkeyrunner # Copyright 2010, The Android Open Source Project 阅读详情

相关推荐

Amber实战:小分子配体MD模拟全流程避坑指南(附磷酸基团处理技巧)

本文提供了一份基于Amber软件进行小分子配体分子动力学模拟的实战避坑指南。详细解析了从晶体结构预处理、配体参数化(重点探讨AM1-BCC与RESP电荷选择)、复合物体系构建到模拟稳定性调试的全流程。特别针对磷酸基团等特殊官能团处理中常见的模拟崩溃问题,给出了系统性的诊断与解决方案,旨在帮助研究者获得稳定可靠的模拟结果。

weixin_29237635的博客 682

Appium学习10:Monkey日志管理

日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。 monkey日志保存方法 1. 保存在PC中 2. 保存在手机上 3. 标准流和错误流分开保存保存在PC中 >adb shell monkey [op...

up1292的博客 345

DeepSeek Harness接入QQ实战:把DSH变成赛博群友

大模型应用正从单机问答走向多平台集成,如何将模型能力嵌入即时通讯工具成为工程实践的热点。消息接入、会话管理、插件扩展是构建智能群聊机器人的核心三要素。DeepSeek Harness(DSH)作为一款模型会话工作流管理工具,凭借多会话管理、模型调用编排以及灵活的插件机制,能够在QQ群聊场景中实现“接收消息→模型生成→回复推送”的完整闭环。本文从基础概念切入,详解DSH接入QQ的两种实现路线——外部API转发与原生插件适配,覆盖环境准备、启动调试、接口调用与性能观察,并给出常见问题排查清单。无论是本地AI助理

weixin_27427619的博客 1934

在Android中使用mkdir在sdcard中创建文件夹出错

由于没有创建文件的权限,需要在AndroidManifest.xml中添加: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

weixin_33742618的博客 360

RedHat 9 替换yum源镜像

引言:我们个人通常使用的红帽系统yum源是需要注册付费的,所以在使用yum源安装一些软件时无法正常安装(例如:MySQL),这时我们就需要将yum源替换为CentOS对应的源,以实现在红帽系统中正常安装软件。

YUJIAOZHU666的博客 3739

用AI免费制作30分钟电影:完整工作流与实操解析

AI视频生成技术正大幅降低影视创作门槛,但真正制作一部完整电影并非一键生成,而是涉及剧本、分镜、画面、配音、剪辑的复杂流水线。理解其基本原理,是将文本转化为连续视觉叙事的关键。对于创作者而言,掌握角色一致性控制、素材批量管理、免费额度合理分配等技术价值,能有效避免生成结果崩坏与资源浪费。该能力可广泛应用于短视频创作、独立电影预演、教学演示等场景。本文以30分钟AI电影制作为例,拆解从工具选择到成片输出的全流程,重点分析免费方案下的时间与积分成本,以及最容易翻车的环节,并给出基于实践验证的排查与优化策略。

weixin_29056865的博客 330

linux下mkdir出现mkdir(): File exists错误

linux下mkdir出现mkdir(): File exists错误 一段循环嵌套创建目录代码运行很久也没出问题,突然今天在日志查到这个错误 mkdir():File exists 这里先贴上创建目录代码 public static function newDir($dir, $preDir = '') { $parts = explode('/', $dir); $dir = $preDir; foreach ($parts as $part)

吮指丶原味姬 2万+

SAP 针对不同行业(制造业、零售业、金融业)推出了专属的云解决方案,以下是各行业的核心方案与特点

SAP推出行业专属云解决方案:制造业(SAP Digital Manufacturing Cloud)提供AI排产与质量预警,降低缺陷率;零售业(S/4HANA Cloud零售版)实现AI预测补货与全渠道库存同步,减少浪费;金融业(Business ByDesign)支持合规自动化与实时风控,降低审计成本。各方案均采用云原生架构,典型案例显示实施效果显著。

金牌架构师 493

monkey的日志管理:三种方式

第一种:保存到手机 adb shell monkey -v -v 10 > /sdcard/monkeylog.log 趟坑日志:必须先执行adb shell ,否则报错;按照顺序执行则不会报错。 第二种:保存到电脑 adb shell monkey -v -v 10 > E:/monkeylog.log 第三种:标准流和错误流分开保存: adb shell monkey -v -v 10 1>e:/monkey_sucess_log.log 2>e.

闫振兴的博客 1572

海波龙(Hyperion,现属 Oracle)合并报表以 HFM(Hyperion Financial Management)为核心系统,方法论核心是以控制为基础确定合并范围,通过维度建模统一数据口径

摘要:海波龙合并报表系统(HFM)采用"规则驱动、维度建模"的方法论,通过四个核心环节实现自动化合并:确定合并范围、数据标准化、自动抵销调整及报表生成。系统支持多会计准则,以控制为基础划分合并方法(完全合并/权益法/成本法),通过维度建模统一数据口径,自动处理内部交易抵销、外币折算等复杂操作。业务操作流程涵盖数据采集、转换、抵销调整到报表生成全过程,关键控制点包括内部交易匹配、股权变动处理等。最终输出合规合并报表及完整审计线索,满足监管与管理需求。(150字)

金牌架构师 1306

2026年迈瑞医疗嵌入式岗位面试题集(含参考答案)

文章摘要 本文总结了嵌入式开发面试中的30道题目,涵盖7大模块:嵌入式硬件与底层驱动、C/C++语言基础、操作系统与多线程编程、网络通信协议、数据结构与算法、开发工具与调试能力、综合素养与职业认知。重点解析了I²C通信协议的工作原理、速率选择及异常排查方法;USB的报文协议与四种传输类型及其适用场景;硬中断与软中断的区别及设计注意事项;字节序的概念与处理方法;以及C++中static和const关键字的核心作用。内容深入实用,适用于嵌入式开发者的技术提升与面试准备。

Open 53

android File类的用法:File.exists()错误、File.mkdir()错误等创建删除的解决办法

今天在shi yo 在androdManifest.xml中的目的是为了给apk系统权限,把apk设置为system属性

leirenhua的专栏 7227

JavaFX 概述

要从 JavaFX 中充分受益,了解 JavaFX 的设计方式以及对 JavaFX 包含的功能有一个很好的概述是很有用的。本文的目的是为您提供 JavaFX 概述。本文将首先介绍一般的 JavaFX 设计,然后介绍 JavaFX 中的各种特性。如果您熟悉 Flash/Flex,您会发现 JavaFX 在某种程度上受到了 Flash/Flex 的启发。JavaFX 中也有一些相同的想法。一般来说,JavaFX 应用程序包含一个或多个对应于窗口的阶段。每个阶段都有一个场景。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 408

使用MonkeyRunner工具运行一个简单的python脚本

使用monkeyrunner工具,编写一个简单的python脚本,对一个APP进行自动化测试 1.手机启动开发者模式,并用数据线连接到电脑上 2.新建一个文件夹F:\test1,存放需要测试的APP安装包与脚本 3.确定sdk\tools\bin目录下存在monkeyrunner.bat文件 4.编写脚本 5.打开cmd,并切换到sdk\tools\bin目录下 6.运行脚本:monkeyrunner F:\moneyDemo1.py ...

bogumymy_2_2的博客 1267

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Monkeyrunner小脚本关于camera的使用

一下代码涉及自动执行camera,属性一个小设置,恢复初始值,并在中间添加截屏功能 将两个截屏进行前后对比,并返回值 适合初学者,刚刚了解monkeyrunner 的人员来看 注意:一下脚本如果不能执行,去掉文字性的注释即可 #进行导入 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,Monke...

diei4356的博客 171

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用java编写monkeyrunner脚本

要使用java编写monkeyrunner脚本,需要导入

走在测试的路上 3131

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

使用monkeyrunner脚本启动并登录QQ

最近在玩monkeyrunner脚本编写,编写了一个简单的登录脚本,代码如下: 因为手机已经有安装了QQ,所以,安装的语句被我注释了,代码成功运行并且登录,以上脚本仅供参考~

wayward_cat的博客 598

MonkeyRunner之小白如何使用MonkeyRecorder录制回放脚本

来自 http://www.cnblogs.com/jenny-jenny/p/6600174.html 1、第一步,首先环境建好:需要哪些环境或者工具。 1、首先得有一个android的sdk 2、有了运行的环境还得有一个编写Python的工具,notepad和pycharm都可以 首先在notepad或者在pycharm把代码保存文件夹命名mon...

weixin_34184561的博客 335

在monkeyrunner里使用Java做为脚本语言

monkeyrunner官网和很多地方都是使用的python做为脚本语言的,但是实际上monkeyrunner是支持Java做为脚本语言的,下面是对在monkeyrunner中使用Java的一些尝试,已经全部使用过是可行的,需要引入的jar包包括: ddmlib.jar;guavalib.jar;sdklib.jar和monkeyrunner.jar [code="java"]package ...

chenxu_8456的专栏 276

MonkeyRunner_Monkeyrunner里使用Java做为脚本语言(1)

monkeyrunner官网和很多地方都是使用的python做为脚本语言的,但是实际上monkeyrunner是支持Java做为脚本语言的,下面是对在monkeyrunner中使用Java的一些尝试,已经全部使用过是可行的,需要引入的jar包包括:  ddmlib.jar;guavalib.jar;sdklib.jar和monkeyrunner.jar  Java代码

jiguanghoverli的专栏 3688

MonkeyRunner_使用MonkeyRunner对Calculator进行简单的压力测试(脚本示例)

#############示例代码############# from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice device = MonkeyRunner.waitForConnection() def tapButton(Number):     import random     for i in rang

jiguanghoverli的专栏 1998

用eclipse调试monkeyrunner的脚本

关于用eclipse调试monkeyrunner这个问题,大侠Diego Torret已经出了一篇新的博文,需要翻墙看 http://www.google.com.hk/url?sa=t&rct=j&q=Eclipse%3A+working+monkeyrunner+configuration&source=web&cd=1&ved=0CGEQFjAA&url=http%3A%2F%2Fdt

yunbin_7的专栏 1680

Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放

monkeyrunner工具提供了一个API,用于编写从Android代码之外控制Android设备或模拟器的程序。 使用monkeyrunner,你可以编写一个Python程序,安装Android应用程序或测试包,运行它,向其发送击键,截取其用户界面,并在工作站上存储屏幕截图。 monkeyrunner工具主要用于测试功能/框架级别的应用程序和设备以及运行单元测试套件,但您可以将其用于其他目的

Mango先生的博客 3761
上一篇: Android内存泄漏之 handler
下一篇: Android 使用Websocket
byszy
博客等级 码龄17年 42粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值