在monkeyrunner脚本中怎么引入运行python脚本文件?

当前位置: >
> 在monkeyrunner里应用Java做为脚本语言
在monkeyrunner里应用Java做为脚本语言
hongdoux & at
在monkeyrunner里使用Java做为脚本语言
monkeyrunner官网和很多地方都是使用的python做为脚本语言的,但是实际上monkeyrunner是支持Java做为脚本语言的,下面是对在monkeyrunner中使用Java的一些尝试,已经全部使用过是可行的,需要引入的jar包包括:ddmlib.guavalib.sdklib.jar和monkeyrunner.jar  package com.test
import java.util.ArrayL
import java.util.C
import java.util.HashM
import com.aliyun.smoking.monkeyrunner.extend.ImageP
import com.android.monkeyrunner.adb.AdbB
import com.androire.IMonkeyD
import com.androire.IMonkeyI
import com.androire.TouchPressT
* this class provide java code to call monkeyrunner.jar to execute test case
* @author cx
public class RunnerProxy {
private IMonkeyD
private AdbB
private static RunnerP
public static RunnerProxy getInstance() {
if (instance == null) {
instance = new RunnerProxy();
private RunnerProxy() {
adb = new AdbBackend();
* this function will connect to a device, emulator or phone
public void connect() {
assert (adb != null);
device = adb.waitForConnection();
* this function clear device connect
public void dispose() {
if (device != null) {
device.dispose();
private String imageD
public void setImageDir(String imageDir) {
this.imageDir = imageD
public String getImageDir() {
return imageD
private String logD
public void setLogDir(String logDir) {
this.logDir = logD
public String getLogDir() {
return logD
* this function finish touch operation
* @param x
: x coordinate
* @param y
: y coordinate
public void touch(int x, int y) {
assert (device != null);
device.shell("sendevent /dev/input/event6 3 48 1");
device.shell("sendevent /dev/input/event6 3 53 " + x);
device.shell("sendevent /dev/input/event6 3 54 " + y);
device.shell("sendevent /dev/input/event6 0 2 0");
device.shell("sendevent /dev/input/event6 0 0 0");
device.shell("sendevent /dev/input/event6 3 48 0");
device.shell("sendevent /dev/input/event6 0 2 0");
device.shell("sendevent /dev/input/event6 0 0 0");
* this function finish long touch operation
* @param x
: x coordinate
* @param y
: y coordinate
public void longTouch(int x, int y) {
assert (device != null);
device.drag(x, y, x, y, 10, 2);
* this function finish drag from one point to another point
* @param x
: x coordinate of start point
* @param y
: y coordinate of start point
* @param endX
: x coordinate of end point
* @param endY
: Y coordinate of end point
public void drag(int x, int y, int endX, int endY) {
assert (device != null);
device.drag(x, y, endX, endY, 10, 2);
* this function finish type a text to view operation
* @param value
: text to type in
public void type(String value) {
assert (device != null);
device.type(value);
* this function finish click a key operation
* @param keyCode
: key code
public void press(String keyCode) {
assert (device != null);
device.press(keyCode, TouchPressType.DOWN_AND_UP);
* this function finish start an activity operation
* @param component
: activity what to start
public void startActivity(String component) {
assert (device != null);
String action = "android.intent.action.MAIN";
Collection&String& categories = new ArrayList&String&();
categories.add("android.intent.category.LAUNCHER");
device.startActivity(null, action, null, null, categories,
new HashMap&String, Object&(), component, 0);
  LZ& 为什么我把几个包导进去了& 但是引包的时候& com.andorire.IMonkeyDevice 这个包引不了& 不知道怎么回事啊& 我的邮箱是& && QQ& & 能告诉我是为什么啊& 谢谢了!!!hongfei & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-MonkeyRunner实例讲解
终端输入单行命令
1 开启android
模拟器首先使用eclipse的AVD&
Manager来创建模拟器antester,然后在命令地下运行c:\emulator @antester即可启动模拟器。
2 执行monkeyrunner命令:
进入sdk的tool目录中,比如我的是D:\monkeyrunnertest\adt-bundle-windows-x86_64-\sdk\tools.
输入monkeyrunner.bat(启动monkeyrunner这个批处理文件)
(1) 引入monkeyrunner需要的两个模块from com.android.monkeyrunner i mport
MonkeyRunner, MonkeyDevice
(2) 把模拟器和monkey绑定,绑定后在monkeyrunner的操作等同于在模拟器的操作device =
MonkeyRunner.waitForConnection()
安装一个apk应用包我安装的zhongcho包 d:\robotiumest\apps\zhongchou.apk
device.installPackage("d:\\robotiumest\\apps\\zhongchou.apk
接下来,我们就可以启动其中的任意activity了,只要传入package和activity名称即可。命令如下:
device.startActivity(component = " com.subject.zhongchou/com.subject.zhongchou.activity.SplashActivity
现在Application启动起来了,就可以根据你的需要执行具体的操作了,比如登录!二,monkeyrunner运行python文件
1,启动Eclipse,新建一个Python工程,创建Src文件夹,然后新建文件LoginTest.py.输入以下代码:
#-*- coding: UTF-8 -*-
from com.android.monkeyrunner
import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.easy
import EasyMonkeyDevice
from com.android.monkeyrunner.easy
import time
def testlogin():
#登录测试函数
MonkeyRunner.waitForConnection()
easy_device=EasyMonkeyDevice(device)&&&
#安装众筹网的app
device.installPackage("D:\\robotiumautotest\\apps\\zhongchou.apk")
#启动App&&&
device.startActivity(component="com.subject.zhongchou/com.subject.zhongchou.activity.SplashActivity")
time.sleep(3)
#输入用户名和密码&
easy_device.touch(By.id('com.subject.zhongchou:id/loginnumber_phone'),MonkeyDevice.DOWN_AND_UP)&&&
easy_device.type(By.id('com.subject.zhongchou:id/loginnumber_phone'),'XXXXXXX')&&&
easy_device.touch(By.id('com.subject.zhongchou:id/loginnumber_password'),MonkeyDevice.DOWN_AND_UP)&&&
easy_device.type(By.id('com.subject.zhongchou:id/loginnumber_password'),'XXXXXXX')
#单击登录按钮&&&
easy_device.touch(By.id('com.subject.zhongchou:id/go_numberlogin'),MonkeyDevice.DOWN_AND_UP)
time.sleep(5)
def main():
#此处可以写多个测试函数的调用,也可以安排执行顺序
testlogin()&&
if __name__=='__main__':
在命令行中用cd命令定位到android SDK的路径下的tools目录,运行如下命令:
D:\monkeyrunnertest\adt-bundle-windows-x86_64-\sdk\tools&monkeyrunner.bat
d:\monkeyrunnertest\ZhongChouTest\src\LoginTest.py
(4)模拟器上就开始安装众筹网的APP,安装完成后,执行打开,登录等操作。
三,真机运行MonkeyRunner测试用例
如果想用真机运行测试用例,先将真机连接到电脑上,运行adb
devices &l 查看连接是否成功,如果成功,就可以按模拟器上运行的方法来运行测试用例。
注意:真机运行的时候会出现:“Unable to get
view server version from device
284d96a5”的错误,在网上查看了一下,发现出于安全考虑,Hierarchy Viewer只能连接Android开发版手机或是模拟器(准确地说,只有ro.secure参数等于0且ro.debuggable等于1的android系统)。Hierarchy Viewer在连接手机时,手机上必须启动一个叫View Server的客户端与其进行socket通信。而在商业手机上,是无法开启View Server的,故Hierarchy Viewer是无法连接到普通的商业手机。
具体的解决办法
见:,上面说的挺麻熔岩烦的,而且是有风险的,我拿的是公司的测试机,不敢随便尝试。
解决方法(以华为c8812为例):
1、找一个开发板的Android固件,我选择的是百度云rom
该rom下载地址:/s/1eQIII58
2、用百度云刷机工具将rom写入手机(注意:写入之前请备份数据。)
3、等待一会,手机正常开机后就可以了
4、用adb shell service call window
若返回值是:Result: Parcel(00000
'........')"
说明View Server处于关闭状态
若返回值是:Result: Parcel(00001
'........')"
说明View Server处于开启状态
5、安装busybox应用
6、设置&开发人员选项&离线日志勾选允许输出离线日志
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。使用Monkeyrunner进行Android自动化的总结
使用Android自动化的方式,不仅可以用来对Android
APP进行自动化测试,同样可以用来进行一些其他非常有意思的自动化任务.常用的自动化工具有Monkeyrunner, Robotium,
Appium等.Monkeyrunner是Android自带的自动化测试工具,允许用户对Android设备的UI界面进行元素提取,执行touch和drag等操作,配合HierarchyViewer等模块可以非常方便地进行自动化操作.
首先,用户需要安装好Android开发环境,同时运行Monkeyrunner脚本需要安装Jython环境.Jython允许使用Python的语法格式来编写自动化测试代码,因此对于Python开发者而言非常有优势.Python中的一些个别模块不能直接用于Jython中,这时就需要安装适用于Jython版本的,具体方法可参考
/questions/3256135/importing-python-modules-in-jython.
如安装bottle模块, jython ez_setup.py bottle,然后在使用时导入该模块即可.
import sys
sys.path.append('/home/jython2.5.3/Lib/site-packages/bottle-0.12.7-py2.5.egg')
from bottle import Bottle, run, request, response, get,
使用Monkeyrunner进行Android自动化大概可以分为以下几种类型的操作:设备及UI界面操作,UI界面元素提取,截图对比等.
1, 设备及UI界面操作
其实,涉及到Android设备的操作,使用开发环境自带的adb已经足够了,而Monkeyrunner也是将adb操作封装了以下而已.常见adb操作如下:
adb install xxx.apk 安装apk文件
adb shell am start -an com.xxx.xxx/.MainActivity 启动APP
adb shell am force-stop com.xxx.xxx 停止该APP
adb shell input keyevent KEYCODE_HOME 模拟Android的HOME按键
adb -s emulator-5554 shell input text test_to_input 针对特定的一个模拟器进行操作
adb shell input tap x y 模拟屏幕touch操作
adb shell input swipe x1 y1 x2 y2 模拟屏幕滑动操作
adb devices
查看所有在线的Android设备.
详细的adb命令,可以通过adb -h来查询.而Monkeyrunner中对设备的操作如下:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
device = MonkeyRunner.waitForConnection(5,&emulator-5554&)
device.shell(&am start -an com.xxx.xxx/.MainActivity&)
device.touch(250, 450, 'DOWN_AND_UP')
device.drag((1080/2, 1700),(1080/2, 400),0.5,1)
device.type(&text to type&)
device.shell(&input text& + &text to input&)
device.press(&KEYCODE_HOME&)
# 另外,也可以通过id来进行touch操作,此时可以引入By模块,可以非常方便通过id寻找对应的元素.
from com.android.monkeyrunner.easy import EasyMonkeyDevice, By
easy_device = EasyMonkeyDevice(device)
easy_device.touch(By.id('id/button1'),
easy_device.DOWN_AND_UP)
以上方式其实与adb shell的操作是一致的,只是方便用户在Jython脚本文件中调用而已.
2, UI界面元素提取
Monkeyrunner可以通过HierarchyViewer来对UI界面的元素进行解析,解析的结果与DDMS及Android
Studio中的Android Device Monitor保持一致.
首先需要先对UI界面进行解析,然后即可通过元素id和其他的属性来提取该元素,并对其所有属性进行解析.
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
from com.android.chimpchat.hierarchyviewer import HierarchyViewer
device = MonkeyRunner.waitForConnection(5,&emulator-5554&)
hViewer = device.getHierarchyViewer() # 对当前UI视图进行解析
content = hViewer.findViewById('id/content')& # 通过id查找对应元素
memberView = content.children[0]
text = memberView.namedProperties.get('text:mText').value.encode('utf8')
desc = memberView.namedProperties.get('accessibility:getContentDescription()').value.encode('utf8')
mleft = memberView.namedProperties.get('layout:mLeft').value.encode('utf8')
height = memberView.height
使用HierarchyViewer来解析界面的层级关系,并根据id来查找特定元素是我们常用的做法.然而,Android
APP中,会有很多元素是没有对应的id的(这一点,可以通过DDMS或者AVD中解析结果看出来),那么此时,我们如果要精准地找到一个特定元素,就只能通过进一步解析某个元素的children来实现,会比较麻烦,但往往是非常精准的.
需要注意的是,使用HierarchyViewer并通过id来查找元素偶尔会出错,提示找不到对应的元素.如果遇到实在难以解析出来的元素,可以考虑使用另一个模块AndroidViewClient进行解析.原理也很类似.甚至有时候,写法比HierarchyViewer简洁得多.
vc = ViewClient(device=device, serialno=&emulator-5554&)
content = vc.findViewById('id/content')
memberView = content.children[0]
text = memberView.getText()
x = memberView.getX()
y = memberView.getY()
memberView.getHeight()
AndroidViewClient的项目地址是/dtmilano/AndroidViewClient.使用时候有个注意事项,我们先将AndroidViewClient写入环境变量中,然后要先导入AndroidViewClient的模块,之后再导入Monkeyrunner及相应地其他模块,否则会出现找不到AndroidViewClient的错误.至于为什么,大家可以自己尝试一下就明白了.
import sys
reload(sys)
sys.setdefaultencoding(&utf-8&)
ANDROID_VIEW_CLIENT_HOME = os.environ['ANDROID_VIEW_CLIENT_HOME']
sys.path.append(ANDROID_VIEW_CLIENT_HOME + '/src')
from com.dtmilano.android.viewclient import ViewClient, View
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice, By
from com.android.chimpchat.hierarchyviewer import HierarchyViewer
不过以上两种方式,都有可能出现UI元素解析失败的情况,原因可能是Android相应工具自身的不完善导致的.因为DDMS和AVD也会经常出现无法解析某个UI界面的情况.
具体的应用场景大家自己斟酌吧,总之,能够完美获取到所需元素即可.
3, 截图对比
这是Monkeyrunner非常有特色的一种方式,常用于通过设备屏幕前后的对比来获取对执行结果的判断.
path = &/tmp/images&
image = device.takeSnapshot() # 截图
image.writeToFile(path+&主页面&.decode('utf-8')+now+'.png','png')
#下面就开始对之前的截图进行对比了
#去文件中找到我们要对比的图片,与该截图image1进行对比
result = MonkeyRunner.loadImageFromFile('/tmp/images/result.png')
#判断图片相识度是否是为90%
if(image.sameAs(result,0.9)):
&&&&log.write(&图片对比成功&&\n&)
&&&&log.write(&主页面图片对比失败&&\n&)
以上,就是通过Monkeyrunner进行Android自动化的一些基本内容.
下边,将大家容易遇到的一些坑记录下来,造福广大人民群众.
Monkeyrunner容易遇到的一些坑:
1, 中文输入的问题
Monkeyrunner默认只支持Ascii编码,所以遇到中文,目前是不能通过adb的input和type进行输入的.那么可以采用复制到PC剪贴板,然后到Android模拟器里边进行粘贴的方式.
但需要注意的是,Android模拟器里边的剪贴板的内容是当前PC的焦点从PC桌面环境切换到模拟器界面瞬间时的剪贴板内容.常见情况是,通过Monkeyrunner脚本文件将PC环境中剪贴板内容向Android模拟器粘贴时,往往会出现粘贴不上我们想要的内容.此时,出于调试目的,我们会检查在当前PC环境的剪贴板中,是否是我们需要的内容.然后将鼠标焦点移入模拟器中,常常发现能够粘贴上所需的正确内容.,然而,这其实是一个时间差的原因,即PC中的剪贴板内容正确,然后切换到模拟器界面,剪贴板内容是从PC环境带过来的,当然是正确的了.相反,我们在Monkeyrunner脚本执行后,在剪贴板操作之前即将当前PC的焦点切换到模拟器中,会发现剪贴板内容是不正确的.说得有点乱,大家可以好好琢磨,自己实践一下.
github上有位同学写了一个小的工具,可以非常方便地执行Android模拟器中的剪贴板操作,/bingwei/inputchineseviaadb.非常好用,大家可以试一试.当然,遇到一些特殊字符,还是需要做一些简单地转义等操作的.
2, Monkeyrunner脚本中各个操作的耗时问题
在Monkeyrunner脚本执行过程中,使用HierarchyViewer以及AndroidViewClient进行界面元素解析时,会发现findViewById操作的时间消耗很大.尤其是该UI界面上元素非常多的时候,耗时非常明显.然而,涉及到界面切换时,我们常常会根据当前界面中是否包含某个id的元素来判断界面是否切换成功.那么,在大多数情况下,我们没有必要根据id来判断当前界面,通过windowName
device.getHierarchyViewer().focusedWindowName()这种方式,已经足够我们进行绝大多数的UI界面判断了,并且在效率上绝对不是一个数量级的提升.
3, 涉及到UI界面之间切换的算法问题
我们常常会遇到,明明就在几个特定的UI界面之间相互切换,但由于Android自动化环境及工具自身的不稳定性,经常导致屏幕切换延迟,点击或切换不成功,APP卡住甚至闪退等一些非常苦恼的问题.那么这就是考验编码能力和算法功底的时候.在这一点上,非常感谢教授同学的帮助,赞一个.
我们可以预先定义一个所有常见界面的focusdWindowName及屏幕切换所需的操作行为的结构体,如
SCREEN_SWITCH_ACTION = {
&&&&'Activity1': {
&&&&&&&&'Activity1': None,
&&&&&&&&'Activity2': ('LEFT_DOWN', 'Activity1'), # 如,从Activity2切换到Activity1需要做LEFT_DOWN的操作.
&&&&&&&&'Activity3': ('LEFT_DOWN', 'Activity1'),
&&&&'Activity2': {
&&&&&&&&'Activity1': ('MID_DOWN', 'Activity2'),
&&&&&&&&'Activity2': None,
&&&&&&&&'Activity3': ('MID_DOWN', 'Activity2'),
&&&&'Activity3': {
&&&&&&&&'Activity1': ('RIGHT_DOWN', 'Activity3'),
&&&&&&&&'Activity2': ('RIGHT_DOWN', 'Activity3'),&&&&&&&&&&
&&&&&&&&'Activity3': None,
如上,该字典中key是目标屏幕,其value值即代表了从当前屏幕切换到目标屏幕所需的操作行为.其中,LEFT_DOWN等可以是简单地touch一个button,也可以写出一个负责的根据界面及元素来决定操作行为的负责操作的集合.有了如上的这种结构体,我们只需要写一个对应的算法,在屏幕切换时从该结构体中解析操作并执行即可.诸如屏幕等待,失败重试之类的容错机制,都可以随意添加了.
其实,涉及到这个算法层面的问题,研究和改进的空间实在是太大了.有兴趣的同学可以更深入的讨论,欢迎指教.
当然,除了Monkeyrunner, Robotium和Appium等工具也都是使用率非常高的,各有优劣吧.
以上这些,就是本次Monkeyrunner自动化的一些总结,写的比较简略,欢迎批评指正.}

我要回帖

更多关于 运行python脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信