zoukankan      html  css  js  c++  java
  • MonkeyRunner的使用<二>

    MonkeyRunner可以用来做自动化测试,在Android中做动态分析的时候也可以使用它来做行为触发。

    不过感觉使用MonkeyRunner来做行为触发还是很局限的。就比如我想实现外界向模拟器拨打电话,或者是发送短信就很难。

    如果有好的方法,希望您能告诉我。


    在Android的管网上介绍了可以使用MonkeyRunner来启动APK ,但是前提是必须是你要知道要启动的APK的包名和Activity名。

    想要启动任何未知的Activity怎么办呢。就比如说,你要在模拟器上安装一个你不知到的APK ,怎么来启动它。

    这里用到了Apktool.

    1.使用Apktool来反编译我们的目标文件

    将APK反编译之后,可以在得到的文件夹下找到AndroidManifest.xml文件

    这个时候使用Python来提取出包名和类名,保存在两个文件夹里面。

    为什么要怎么做,因为启动MonkeyRunner 的命令是MonkeyRunner -v ALL xxxx.py

    我们要想办法传入未知的包名和Activity怎么做,只有通过使用文件的读写操作来达到互动。

    2.获取任意程序的包名和Activity的名字。

    #
    # @author  : grace
    # @date    : 2013-5-26
    # filename : parseManifest.py
    # run      : python parseManifest.py
    
    import os
    import sys
    from xml.dom import minidom
    
    if __name__ == "__main__":
        
       opts, args = getopt.getopt(sys.argv[1:], "d:h", "directory = help")
       
       for op, value in opts:
           if op in ("-d","--directory"):
              _directory = value
    
    xmldoc =minidom.parse(_directory + '/AndroidManifest.xml')
    
    manifest = xmldoc.getElementsByTagName('manifest')[0]
    
    package = manifest.getAttribute('package')
    
    getActivity = xmldoc.getElementsByTagName('activity')[0]
    
    activity = getActivity.getAttribute('android:name')
    
    output = open(_directory + 'package.txt','w')
    output.write(package)
    output.close()
    
    output = open(_directory + 'activity.txt','w')
    output.write(activity)
    output.close()

    上面这个程序的代码是用来解析AndroidManifest.xml的,通过这个程序来获得包名和Activity 的名字,将他们分别存储在package.txt  和activity.txt 文件中

    这里我们只保存了一个 ,因为只下需要一个Activity就可以启动我们的APK。


    3.接下来就是通过MonkeyRunner 来做行为触发

    #
    # @author   : grace
    # @date     : 2013-5-25
    # filename  : behaviorTrigger.py
    # run       : monkeyrunner -v ALL behaviorTrigger.py
    #
    
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
    
    package = ''
    
    activity = ''
    
    fp = open("package.txt")
    package = fp.readline()
    fp.close()
    
    fa = open("activity.txt")
    activity=fa.readline()
    fa.close()
    
    device =MonkeyRunner.waitForConnection()
    
    MonkeyRunner.sleep(1)
    
    runComponent = package + '/' + activity
    
    action = 'android.intent.action.MAIN'
    
    device.startActivity(action = action, component = runComponent)
    
    MonkeyRunner.sleep(2)
    
    res=device.takeSnapshot()
    
    res.writeToFile(  '/shot1.png','png')
    
    device.touch(160,194,MonkeyDevice.DOWN_AND_UP)
    
    res=device.takeSnapshot()
    
    res.writeToFile( '/shot2.png','png')
    
    device.touch(160,374,MonkeyDevice.DOWN_AND_UP)
    
    device.touch(160,194,MonkeyDevice.DOWN_AND_UP)
    
    res=device.takeSnapshot()
    
    res.writeToFile('/shot3.png','png')
    
    device.touch(60,200,MonkeyDevice.DOWN_AND_UP)
    
    MonkeyRunner.sleep(1)
    
    device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
    


    注意文件存放的位置应该是你用apktool 反编译之后的文件夹下面

    apktool d XXXX.APK  文件夹名称


  • 相关阅读:
    icons、tabs、tabs2、toolbars例子详解
    list、listhorizontal、listsearch的理解
    forms、forms_toolbar例子理解
    Accelerometer
    audio,carousel的学习
    数组去空项,相同项
    require与include函数
    php下intval()和(int)转换使用与区别
    PHP需要拷到system32下的加载库及一些相关知识
    字符转义
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3112978.html
Copyright © 2011-2022 走看看