tampermonkey脚本下载runer长按按键脚本

110985人阅读
android(5)
目前android SDK里自带的现成的测试工具有monkey 和 monkeyrunner两个。大家别看这俩兄弟名字相像,但其实是完完全全不同的两个工具,应用在不同的测试领域。总的来说,monkey主要应用在压力和可靠性测试上,运行该命令可以随机地向目标程序发送各种模拟键盘事件流,并且可以自己定义发送的次数,以此观察被测应用程序的稳定性和可靠性,应用起来也比较简单,记住那几个命令就行了。而monkeyrunner呢,相比之下会强大一些,它主要可应用于功能测试,回归测试,并且可以自定义测试扩展,灵活性较强,并且测试人员可以完全控制。
本篇乃本人学习monkeyrunner时笔记,查看网络中的资料并经本人测试而出,由于本人刚接触,所以本篇内容不免肤浅,高手们请绕走~
在测试本人以下实例时,请自行搭建Android环境。
一、打开模拟器
运行monkeyrunner之前必须先运行相应的模拟器,不然monkeyrunner无法连接设备。
用Elipse打开Android模拟器或在CMD中用Android命令打开模拟器。这里重点讲一下在CMD中用Android命令打开模拟器
命令:emulator -avd test
(注意:test为虚拟设备的名称——的全称为:Android Virtual Device,就是Android运行的虚拟设备,如下图所示:)
上面命令中的test是模拟器名称。使用时需要改成实际名字。
如果正常,模拟器应该可以启动起来了。
如果执行的结果出现以下错误内容:
PANIC: Could not open: C:\Documents and Settings\sAdministrator\.android/avd/test.ini
如下图所示:
原因在于你的环境变量缺少配置。请在“系统变量”中添加“ANDROID_SDK_HOME”,设置其值为“C:\Documents and Settings\Administrator”(注意:这里的值不能为C:\Documents and Settings\Administrator\.android),如下图所示:
确定后,关闭CMD窗口,重新打开CMD。执行以上命令。将会启用模拟器。
模拟器启动成功后,我们仍在CMD环境中操作。现在进入monkeyrunner的shell命令交互模式。
命令:monkeyrunner
进入shell命令交互模式后,首要一件事就是导入monkeyrunner所要使用的模块。直接在shell命令下输入:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice 回车
OK,这步完成我们就可以利用monkeyrunner进行测试工作了。
这里有两种方案,一是直接在shell命令下输入以下命令;
device=MonkeyRunner.waitForConnection() #连接手机设备
device.installPackage(&../samples/android-10/ApiDemos/bin/Apidemos.apk&) #安装apk包到手机设备。
启动其中的任意activity了,只要传入package和activity名称即可。命令如下:
device.startActivity(component=&com.example.android.apis/com.example.android.apis.ApiDemos&)
此时模拟器会自动打开ApiDemos这个应用程序的主页。
device.reboot() #手机设备重启
device.touch(300,300,'DOWN_AND_UP')
MonkeyRunner.alert(&hello&)#在emulator上会弹出消息提示
device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
device.type('hello')#向编辑区域输入文本'hello'
二是将以下命令写到python文件里,例如test.py,然后我们再从命令行直接通过monkeyrunner运行它即可。比如,我们还是用上面的例子,语法如下:monkeyrunner test.py 接下来monkeyrunner会自动调用test.py,并执行其中的语句,相当方便。
实例:test.py
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
device=MonkeyRunner.waitForConnection()
device.startActivity(component=&/.TestActivity&)
在CMD中执行
monkeyrunner test.py
可能出现错误“Can't open specified script file”,如下图所示:
原因在于python脚本文件路径不正确。你可以有以下解决办法:
1、将test.py文件存放到monkeyrunner文件同一目录中。可以执行:monkeyrunner test.py 调用
2、指定python文件位置。如果test.py文件在D盘根目录下,可以这样执行:monkeyrunner d:\test.py
下面是学习中的笔记,有点乱。就放在本篇最后吧。
变量名:ANDROID_SDK_HOME
变量值:C:\Documents and Settings\Administrator
变量名:Path
变量值:%SystemRoot%\system32;%SystemRoot%;C:\Python27;C:\D:\android\android-sdk-windows\D:\android\android-sdk-windows\platform-tools
android自动化测试框架:CTS、monkey、monkeyrunner、benchmark
monkeyrunner
monkeyrunner工具提供了一个API,运用该API编写的程序可以不用通过android代码来直接控制android设备和模拟器,我们可以写一个python程序对android应用程序或测试包进行安装、运行、发送模拟击键,对用户界面进行截图并将截图存储在workstation上等操作。monkeyrunner工具的主要设计目的是用于测试application/framework层上的应用程序和设备、或用于运行单元测试套件,也可以用于其它目的。
monkey工具,是直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。
monkeyrunner为android测试提供了以下独特的功能:
1、多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。可以在同一时间接上所有设备或一次启动全部模拟器,依据程序依次连接到每一个,然后运行一个或多个测试。也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。
2、功能测试:monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。
4、回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
4、可扩展的自动化:由于monkeyrunner是一个API工具包,我们可以开发基于python模块和程式的一整套系统,以此来控制android设备。除了使用monkeyrunner API,我们还可以使用标准的python os和ubprocess模块来调用android debug bridge这样的android工具。如ADB这样的android工具,也可以将自己写的类添加到monkeyrunner API中。
运行monkeyrunner
可以直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪种方式,你都需要调用SDK目录的tools子目录下的monkeyrunner命令。如果提供一个文件名作为运行参数,则monkeyrunner将视文件内容为python程序,并加以运行;否则,它将提供一个交互对话环境。
monkeyrunner命令语法
monkeyrunner -plugin &plugin_jar& &programe_filename& &programe_option&
monkeyrunner API
主要包括三个模块
1、MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法。
2、MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。
3、MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。
注意:在运行monkeyrunner之前必须先运行相应的模拟器,否则monkeyrunner无法连接到设备
运行模拟器有两种方法:1、通过eclipse中执行模拟器 2、在CMD中通过命令调用模拟器
这里介绍通过命令,在CMD中执行模拟器的方法
命令:emulator -avd test
上面命令中test是指模拟器的名称。
导入需要的模块
import sys
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
如果给导入的模块起了别名,就应该使用别名,而不能使用原名,否则会出现错误。
比如连接设备或模拟器,起了以上别名后,命令应该如下:
device=mr.waitForConnection()&
也可以采用以下方式
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
也可以采用这种方式
import com.android.monkeyrunner
但是在使用时,就显得特别麻烦
device=com.android.monkeyrunner.MonkeyRunner.waitForConnection()&
我们也可以给它一个别名
import com.android.monkeyrunner as cam
但是在使用时,就显得特别麻烦
device=cam.MonkeyRunner.waitForConnection()
#等待连接到设备,与模拟器连接,返回monkeydevice对象,代表连接的设备。没有报错的话说明连接成功。
参数1:超时时间,单位秒,浮点数。默认是无限期地等待。
参数2:串deviceid,指定的设备名称。默认为当前设备(手机优先,比如手机通过USB线连接到PC、其次为模拟器)。
默认连接:device=MonkeyRunner.waitForConnection()
参数连接:device = mr.waitForConnection(1.0,'emulator-5554')
向设备或模拟器安装要测试的APK
device.installPackage('myproject/bin/MyApplication.apk') #参数是相对或绝对APK路径
路径级别用“/”,不能用“\”,比如d:\www\a.apk,而应该写成d:/www/a.apk
安装成功返回true,此时查看模拟器我们可以在IDLE界面上看到安装的APK的图标了。
从设备中删除指定的软件包,包括其相关的数据和调整缓存
device.removePackage('myproject/bin/MyApplication.apk')
删除成功返回true。
#启动任意的Activity
device.startActivity(component=&/.TestActivity&)
device.startActivity(component=&/.TestActivity&)
此时可以向模拟器发送如按键、滚动、截图、存储等操作了。
执行一个adb shell命令,并返回结果,如果有的话
device.shell(&...&)
暂停目前正在运行的程序指定的秒数
MonkeyRunner.sleep(秒数,浮点数)
获取设备的屏蔽缓冲区,产生了整个显示器的屏蔽捕获。(截图)
result=device.takeSnapshot()
返回一个MonkeyImage对象(点阵图包装),我们可以用以下命令将图保存到文件
result.writeToFile('takeSnapshot\\result1.png','png')
写文件MonkeyImage
MonkeyImage.writeToFile(参数1:输出文件名,也可以包括路径,参数2:目标格式)
写成功返回true,否则返回false
键盘上的类型指定的字符串,这相当于要求每个字符串中的字符按(键码,DOWN_AND_UP).
字符串发送到键盘
device.type('字符串')
唤醒设备屏幕(在设备屏幕上唤醒)
device.wake()
重新引导到指定的引导程序指定的设备
device.reboot()
=========================================================
在指定位置发送触摸事件(x,y的单位为像素)
device.touch(x,y,TouchPressType-触摸事件类型)
发送到指定键的一个关键事件
device.press(参数1:键码,参数2:触摸事件类型)
参数1:见android.view.KeyEvent
参数2,如有TouchPressType()返回的类型-触摸事件类型,有三种。
1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。
2、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。
3、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。
以上三种事件做为press()或touch()参数。原英文如下:
use this with the type argument of press() or touch() to send a down event.
为了模拟输入键,发送DOWN_AND_UP。
参数1的部分具体内容逻辑:
按下HOME键 device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)&
按下BACK键 device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)&
按下下导航键 device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP)&
按下上导航键 device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP)&
按下OK键 device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP)
device.press('KEYCODE_ENTER',MonkeyDevice.DOWN_AND_UP)#输入回车
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)#点击返回
home键 KEYCODE_HOME&
back键 KEYCODE_BACK&
send键 KEYCODE_CALL&
end键 KEYCODE_ENDCALL&
上导航键 KEYCODE_DPAD_UP&
下导航键 KEYCODE_DPAD_DOWN&
左导航 KEYCODE_DPAD_LEFT&
右导航键 KEYCODE_DPAD_RIGHT &
ok键 KEYCODE_DPAD_CENTER&
上音量键 KEYCODE_VOLUME_UP &
下音量键 KEYCODE_VOLUME_DOWN&
power键 KEYCODE_POWER&
camera键 KEYCODE_CAMERA&
menu键 KEYCODE_MENU&
更多:/reference/android/view/KeyEvent.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1098858次
积分:10026
积分:10026
排名:第1279名
原创:129篇
转载:46篇
评论:97条
(1)(3)(10)(15)(13)(5)(3)(30)(67)(28)MonkeyRunner学习笔记_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
MonkeyRunner学习笔记
上传于||文档简介
&&M​o​n​k​e​y​R​u​n​n​e​r​学​习​笔​记
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Android自动化测试之Monkeyrunner常用操作编程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android自动化测试之Monkeyrunner常用操作编程
上传于||文档简介
&&M​o​n​k​e​y​r​u​n​n​e​r​常​用​操​作​编​程​,​这​是​本​人​总​结​和​整​理​的​,​基​于​P​y​t​h​o​n​实​现​的​脚​本​。​实​现​的​功​能​有​:​屏​幕​滑​动​解​锁​、​滑​屏​、​长​按​、​单​击​控​件​(​三​种​方​式​)​、​输​入​文​本​、​唤​醒​屏​幕​、​单​击​菜​单​键​、​单​击​主​页​键​、​单​击​电​源​键​熄​灭​屏​幕​、​重​启​、​输​出​设​备​屏​幕​截​图​到​指​定​文​件​里​、​输​出​结​果​到​指​定​文​件​里​、​打​印​当​前​时​间​。
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩11页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢风泊海上 的BLOG
用户名:风泊海上
文章数:63
评论数:742
访问量:225785
注册日期:
阅读量:5863
阅读量:12276
阅读量:363903
阅读量:1059347
51CTO推荐博文
上次说到已经配好了MonkeyRunner的运行环境,现在讲解怎么进行简单的MonkeyRunner测试。这个拖了很久才有时间和心情总结一下。真是计划赶不上变化啊。
就不说废话了。&,这个地址是android上的MonkeyRunner官方文档地址。上面关于MonkeyRunner的一些方法说的很详细。本篇不是详细解释MonkeyRunner方法的文章,只是根据我的理解,结合自己的一个例子讲解一下怎么使用MonkeyRunner写测试程序。
MonkeyRunner工具共有三个类:MonkeyRunner、MonkeyDevice、MonkeyImage。
一、MonkeyRunnner类:
&&&&&&&&这个类主要用于把MonkeyRunner连接至真机或者模拟器,另外有个显示提示信息的alert方法和一个选择方法比较常用。
二、MonkeyImage类:
&&&&&&&&这个类主要是测试过程中,用来保存测试截图,把图片保存成各种格式,并且可以比较两个MonkeyImage对象。
&&&&&&&&主要常用的有两个方法:&(string&path,&string&format)&,这个是保存截图的位置,和命名,可以把图片保存到sdcard里面,也可以保存到电脑里面;&(&other,&float&percent)&,这个用来比较两个截图是否相同,结果为boolean值。
三、MonkeyDevice类:
&&&&&&&&这个类的方法就多了一下,主要提供了安装和卸载程序包、启动一个活动及操作键盘等事件的方法。像里面的&(string&uri,&string&action,&string&data,&string&mimetype,&iterable&categories&dictionary&extras,&component&component,&flags)&启动一个应用,&(string&name,&dictionary&type)点击控件&,&(integer&x,&integer&y,&integer&type)点击控件(通过坐标定位)&,&(tuple&start,&tuple&end,&float&duration,&integer&steps)&拖拉控件等等方法比较常用。
&&&&&&MonekeyRunner这个测试工具用起来不算太难,下面给出一段代码简单解释一下:
& FetionTest.py
&&& #coding=utf-8&&&&Python程序的第一句,添加这句使注释支持中文
&&& #&导入需要的MonkeyRunner的包,也可以是自己写的类,如果文件很多的话
&&& from&&com.android.monkeyrunner&import&MonkeyRunner,MonkeyDevice,MonkeyImage
&&& #连接真机,里面要写正确自己的真机对应的名字,cmd下命令下,可以用adb&devices&看到
&&& devices1=MonkeyRunner.waitForConnection(5,&ABCDEF&)
&&& #连接模拟器
&&&&devices2=MonkeyRunner.waitForConnection(5,&emulator-5554&)
&&& #启动飞信的主界面,这是我测的飞信程序,里面主要是配好飞信的包名和启动Activity
&&&&& devices1.startActivity&
&& (component&=&'cn.com.fetion/.android.ui.activities.StartActivity')
&& devices2.startActivity
&& (component&=&'cn.com.fetion/.android.ui.activities.StartActivity')
&& #休眠8秒,便于帐号的登录
&& MonkeyRunner.sleep(8.0)
&& #点击我的好友一栏,这里使用的是坐标方法
&&& devices1.touch(202,258,&DOWN_AND_UP&)
&& #选中好友
&&&devices1.touch(222,326,&DOWN_AND_UP&)
&& devices1.touch(442,325,&DOWN_AND_UP&)
&& #&点击&加入黑名单&
&& devices1.touch(223,563,&DOWN_AND_UP&)
&& #&下面是进行截图,和保存图片
&& result1&=&device1.takeSnapshot()
&& result1.writeToFile('E:\slack01.png','png')
&& #点击返回键,可以找到模拟器上任何一个建对应的关键值,这个在官方文档里可以查到
&& device1.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)
&& result2&=&device1.takeSnapshot()
&& result2.writeToFile('E:\slack02.png','png')
&&&&&这个程序就简单说这些,另外可以对自己的程序进行优化,可以把不同的测试case封装到一个方法里,也可以把一些配置设置成全局变量,然后在不同的类里进行调用。这些需要简单了解一下Python的编程知识。
&&&下面说一个比较好用的获取坐标的工具。就是用来获取真机上坐标的工具,当我们点击真机上的空间时,能显示真机上的点击点的坐标。
这个是一个可以自己定义的python文件,只有几句话:
from&com.android.monkeyrunner&import&MonkeyRunner&as&mr
from&com.android.monkeyrunner.recorder&import&MonkeyRecorder&as&recorder
#&里面添加你的真机的名字
device&=&mr.waitForConnection(5,&MSM8225QRD5&)
recorder.start(device)
比如,我把它定义为monkey_recorder.py,&然后放在G盘,在cmd下运行&monkeyrunner&monkey_recorder.py&,就会出现如下界面:
当我们在这个工具上点击时,真机也会跟着执行,并且会显示每一步我们点击的位置的坐标,比如,我点击打开音乐播放器会记录如下:
这个工具的好只有处你用过几次才知道的,呵呵,反正有些应用程序里很小的图标只能通过坐标获取点击事件,这个工具的优势就显示出来了。另外,需要注意,这个是不能用来获取模拟器坐标的,模拟器上的坐标只有自己下个截图工具,来量取坐标了。这一点确实很蛋疼。
软件工具都是这样,没有绝对的便利。MonkeyRunner也不例外。呵呵,这一次就写这么多吧,这个工具简单的使用介绍的也差不多了,更多的还需要自己去摸索,熟能生巧嘛。希望大家能多多分享,多多交流。
本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
15:54:35 17:14:04 17:16:14 17:20:30 17:28:06 11:18:22 11:54:54 12:46:48 12:51:20 13:17:17 11:06:36 15:32:59 16:56:47 17:20:58 18:52:47 &&1&
&&页数 ( 1/2 ) &使用Monkeyrunner进行Android自动化的总结
使用自动化的方式,不仅可以用来对Android APP进行自动化测试,同样可以用来进行一些其他非常有意思的自动化任务.常用的自动化工具有Monkeyrunner, Robotium, Appium等.Monkeyrunner是Android自带的自动化测试工具,允许用户对Android设备的UI界面进行元素提取,执行touch和drag等操作,配合HierarchyViewer等模块可以非常方便地进行自动化操作.
首先,用户需要安装好Android开发环境,同时运行Monkeyrunner脚本需要安装Jython环境.Jython允许使用的语法格式来编写自动化测试代码,因此对于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, post
使用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((00),(0),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简洁得多.
= ViewClient(device=device, serialno=&emulator-5554&)
content = vc.findViewById('id/content')
memberView = content.children[0]
text = memberView.getText()
x = memberView.getX()
y = memberView.getY()
height = 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自动化的一些总结,写的比较简略,欢迎批评指正.
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'}

我要回帖

更多关于 monkeyruner 的文章

更多推荐

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

点击添加站长微信