金老师,monkeyrunner执行脚本写脚本,怎么去确定控件的相对坐标

trackbacks-0
可以写一个pyhon工程,安装在android进行测试,还可以截屏操作。Monkeyrunner为framework层开发。MonkeyRunner本身是Java做的,为了和Python连接,做了一个叫Jython的东东,
1. 多种多设备控制
2. 功能测试
3. 回归测试
4. 可扩展功能测试
官网提供的最简单的例子:
# Imports the monkeyrunner modules used by this program&
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice&
# Connects to the current device, returning a MonkeyDevice object&
device = MonkeyRunner.waitForConnection()&
# Installs the Android package. Notice that this method returns a boolean, so you can test&
# to see if the installation worked. 此处取apk的绝对路径
device.installPackage('myproject/bin/MyApplication.apk')&
# sets a variable with the package's internal name,给apk所在的包取出来,赋给变量package
package = 'com.example.android.myapplication'&
# sets a variable with the name of an Activity in the package ,得到Activity并存在变量中
activity = 'com.example.android.myapplication.MainActivity'&
# sets the name of the component to start,这个和Instrumentation很类似啊,包名/Activity名&
runComponent = package + '/' + activity&
# Runs the component&,没有使用device.touch
device.startActivity(component=runComponent)&
# Presses the Menu button,这种press是按下、起来
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)&
# Takes a screenshot&
result = device.takeSnapshot()&
# Writes the screenshot to a file&
result.writeToFile('myproject/shot1.png','png')
com.android.monkeyrunner.MonkeyDevice.drag
com.android.monkeyrunner.MonkeyDevice.touch 传touch的点的(x,y)坐标
实践一个调用calculator100次的script,可以work。calculator的包名可以用ddms监控得到(eclipse - window - open perspective -ddms )。使用PowerShell操作命令行感觉真好啊~
#coding=utf-8
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
device = MonkeyRunner.waitForConnection()
device.shell("monkey -p com.android.calculator2 -v 1")
def tapButton(Number):
import random
for i in range(0,Number):
keyValue = random.randint(1,20)
if keyValue == 1:
device.touch(200,265,'DOWN_AND_UP') #Tap 'Clear' Button
elif keyValue == 2:
device.drag((200,265),(200,265),1.5,10) #Long touch "Clear"
elif keyValue == 3:
device.touch(465,275,'DOWN_AND_UP') # Tap "Delete"
elif keyValue == 4:
device.drag((465,275),(465,275),1.5,10) #Long touch "Delete"
elif keyValue == 5:
device.touch(70,430,'DOWN_AND_UP') #Tag "7"
elif keyValue == 6:
device.touch(220,430,'DOWN_AND_UP') #Tap "8"
elif keyValue == 7:
device.touch(340,430,'DOWN_AND_UP') #Tap "9"
elif keyValue == 8:
device.touch(470,430,'DOWN_AND_UP') #Tap "division"
elif keyValue == 9:
device.touch(70,580,'DOWN_AND_UP') #Tap "9"
elif keyValue == 10:
device.touch(220,580,'DOWN_AND_UP') #Tap "9"
elif keyValue == 11:
device.touch(340,580,'DOWN_AND_UP') #Tap "9"
elif keyValue == 12:
device.touch(470,580,'DOWN_AND_UP') #Tap "9"
elif keyValue == 13:
device.touch(70,730,'DOWN_AND_UP') #Tap "9"
elif keyValue == 14:
device.touch(220,730,'DOWN_AND_UP') #Tap "9"
elif keyValue == 15:
device.touch(340,730,'DOWN_AND_UP') #Tap "-"
elif keyValue == 16:
device.touch(470,730,'DOWN_AND_UP') #Tap "."
elif keyValue == 17:
device.touch(70,875,'DOWN_AND_UP') #Tap "9"
elif keyValue == 18:
device.touch(220,875,'DOWN_AND_UP') #Tap "0"
elif keyValue == 19:
device.touch(340,875,'DOWN_AND_UP') #Tap "="
elif keyValue == 20:
device.touch(470,875,'DOWN_AND_UP') #Tap "+"
MonkeyRunner.sleep(0.5)
tapButton(100)
drag\touch都是MonkeyDevice中的方法。MonkeyRunner有3个modules,也就是类: MonkeyDevice、MonkeyImage、MonkeyRunner
MonkeyRecorder可以跟踪手机状态。从android源码中剥离出monkeyrunner的源码,导入到工程里,创建一个test类,使用java借助monkeyrecorder玩一玩:手机上的各种key,在android.view中有KeyEvent.class,里面有keycode对应的数字,查看MonkeyDevice.type帮助文档,里面的keycode值就和这个对应。test的思路:new monkeyrecorder对象,等待device连接上,设置recorder frame可见。
Public class MyTest{
static IMonkeyD
public static void main(String [] args){
device = new AdbBacken().waitforConnection();
if (device ! = null){
MonkeyRecorderFrame frame = new MonkeyRecorderFrame(device);
frame.setVisible(true);}
keyPress事件流其实就是调用了keyEvent里面的几个事件,复写了其方法
&关于脚本移植后好用的问题:比如手机屏幕不同导致分辨率变更
320*480 -》 480*800 可以这样换算一下
device.touch(340,580,'DOWN_AND_UP')这句可以写成:320/x=480/480/580=800/newY
Hierarchyviewer(tools里一个工具)获取布局,即各个控件的坐标,再定位;各种控件在底层也是获取坐标点。4.1以下需要root权限,4.1以上有ui工具了&http://blog.csdn.net/zm2714/article/details/7985061 这是使用hierachyviewer的心得文章
后续持续集成:
2014年1月推出RobotiumRecord工具,/products/robotium-recorder 可以直接录制,然后好歹改下脚本就能跑,很方便的
Robotium是基于控件的工具,对于跨应用比较弱,结合monkeyrunner这种跨应用强的工具,就算不用uiautomatic,也可以解决一般的APP测试问题
测试云:所有脚本保存在云端,云端可以做个数据库,比如mysql。通过云端发起远程控制你的终端,使用脚本发起一个事件流,通过monkeyrunner远程调用和控制;终端可以录制等工作,完成后传到云端进行管理。类似Itestin、易测云
用例管理、网页展示
**************
网上找到常用方法:
MonkeyRunner的一些常用方法:
(详细参考:)
void&&(string&message,&string&title,&string&okTitle)
弹出一个对话框,默认标题&警告&,按钮显示&确定&,可暂停当前的程序
例:MonkeyRunner.alert("hello&world")
弹出一个hello&world对话框
integer&&(string&message,&iterable&choices,&string&title)
显示带有一列可选项的对话框,可暂停当前的程序,选择后返回integer对象,代表选择项的序列index
例:MonkeyRunner.choice("choice&a&sex",["man","women"])
弹出一个选择性别的对话框,选择man会返回0,选择women会返回2
string&&(string&message,&string&initialValue,&string&title,&string&okTitle,&string&cancelTitle)
显示一个输入框,接受输入后返回字符串
例:MonkeyRunner.input("enter&text")
弹出一个输入框,输入后确认返回字符串
void&(float&seconds)
暂停当前程序指定秒
例:MonkeyRunner.sleep(2)
暂停当前程序2秒
MonkeyDevice&&(float&timeout,&string&deviceId)
等待连接时间,默认为一直等待.
设备名,可通过adb&devices查看当前连接设备名,一般可以不指定.
返回一个&实例
常用写法为:
device&=&MonkeRunner.waitForConnection()
通过获取到的device对象,可以调用MonkeyDevice的方法对设备进行操作。
MonkeyDevice的一些常用方法:
(详细参考:)
void&&(tuple&start,&tuple&end,&float&duration,&integer&steps)
例:device.drag((120,240),(200,240),1,10)
屏幕解锁操作,从(120,240)向(200,240)滑动,用时1秒,10为默认值
object&&(string&key)
查询设备相关信息,参数参考:
void&&(string&path)
安装指定路径的APK文件。如果改文件已安装,则会覆盖安装
例:device.installPackage("d:/2100.apk")
安装D盘2100.apk,路径中使用&/
void&&(string&name,&dictionary&type)
模拟按钮操作。
name&为按键码,参考:
type&为键盘事件类型.&可用的值有DOWN,&UP,&和DOWN_AND_UP
void&&(string&package)
删除指定的包,包括清除其数据和缓存
例:device.removePackage("evertone.Piano")
卸载piano程序,程序名通过aapt查看2100.apk文件,或者在shell模式下进入data/data目录下查找
void&&(string&cmd)
执行shell命令并返回结果
例:device.shell("date")
执行shell命令,查询日期
void&&(string&uri,&string&action,&string&data,&string&mimetype,&iterable&categories&dictionary&extras,&component&component,&flags)
启动一个应用,对于需要测试的应用需要知道应用名和入口activity名称。可以调用sdk\builds-tools目录下的aapt获取
aapt&dump&baging&d:\2100.apk
startActivity常用形式为:
例:device.startActivity(component&=&"evertone.Piano/evertone.Piano.loading")
执行后启动手机弹钢琴
MonkeyImage&()
屏幕截图,返回包含当前显示截图的MonkeyImage对象
例:Pic&=&device.takeSnapshot()
手机屏幕截图,结果保存在Pic里。pic为MonkeyImage实例
void&&(integer&x,&integer&y,&integer&type)
屏幕点击(x,y)。type&为键盘事件类型.&可用的值有DOWN,&UP,&和DOWN_AND_UP
例:device.touch(93,143,"DOWN_AND_UP")
点击屏幕(93,143)位置。屏幕坐标获取可使用sdk\tools路径下的Hierarchyviewer工具
void&&(string&message)
向设备发送包含字符的信息,等同于多次调用press()方法。现在发现message中只能写数字、英文,不能有空格,否则会输入失败
例:device.type("123adc")
输入&123abc
唤醒屏幕。暂时没发现有什么用&=。=
MonkeyImage的一些常用方法:
(详细参考:)
MonkeyImage对象一般不用直接创建,在获取了MonkeyDevice对象后,调用takeSnapshot()方法即可
例:pic&=&MonkeyDevice.takeSnapshot()
string&&(string&format)
将当前图像转换成特定格式,并且作为字符串返回
tuple&&(integer&x,&integer&y)
返回图像位置坐标(x,y)上的单个像素点,作为一个整数元组,以(a,r,g,b)格式。可对特定点进行取色
MonkeyImage&&(tuple&rect)
从当前图片中取出部分区域,创建一个新的MonkeyImage对象。参数为元祖,指定截图区域
例:pic_new=pic.getSubImage((0,0,100,100))
boolean&&(&other,&float&percent)
对比两个MonkeyImage对象是否相等(比较截图是否一致)。参数percent指定两个图像之间差异在多少百分比之内可以看做&相等&。可进行自动化结果校验
例:pic2.sameAs(pic1,0.9)
pic2和pic1在90%范围内相似,则返回True,否则返回False
void&&(string&path,&string&format)
指定路径和格式,保存图片文件
例:pic1.writeToFile("d:/pic2.png","png")
指定图片格式为png,保存在本地d:/pic2.png路径。保存成功则返回True
MonkeyRunner进行脚本编写
1. 启动一个MonkeyRunner范例
2. 如何获取mOnkeyRunner的API文档
3. 如何依据API文档写一个简单的测试脚本
4. 脚本写完后应加入什么样的代码(用python或者Java语言配合均可)进行预测结果和实测结果判断
5. 如何设定输出log
Monkey压力自动化测试
1. 测试app
2. 测试整机
4. 用linux环境读取日志
5. 异常分析
6. 场景分析
7. 用例分析
性能自动化测试
1. cpu、内存、apk启动时长、电量测试
2. 安全测试、兼容性测试、稳定性和可靠性测试&
3. 内存泄露分析MAT工具使用
4. 市面上重点的云框架GT、百度MTC、ITestin工具使用
性能测试脚本编写
1. 启动一个app测试性能
2. 如何获取cpu,关注什么
3. cpu运行hz百分比和jiffis怎么样才算合格的app
内存工具进行分析
1. 获取内存 (堆栈内存,物理内存,虚拟机内存)
2. 定位代码和函数
3. 实时监控内存变化
电量自动化 整机和单进程监控
启动时长对比测试
兼容性自动化测试
安全自动化测试
自动化测试框架的发展:第一代是录制回放;第二代是加入判断点,用例集;第三代引入模块化思想、库函数、数据驱动思想、关键字驱动思想&
阅读(...) 评论()Monkeyrunner自动化(2)
Author: Mike Zhao
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice
from com.android.monkeyrunner.easy import By
from com.android.chimpchat.hierarchyviewer import HierarchyViewer
from com.android.hierarchyviewerlib.device import ViewNode
&接收用户输入的3个变量&
receiver = raw_input(&Input receiver address:&)
theme = raw_input(&Input theme:&)
content = raw_input(&Input content:&)
&email自动发送的次数&
number = int(raw_input(&How many times would you want to try:&))
&连接设备&
device = MonkeyRunner.waitForConnection()
easy_device = EasyMonkeyDevice(device)
&进入循环&
for n in range(1, number + 1):
#打开email activity
device.shell('am start -n com.android.email/com.android.email.activity.MessageCompose')
MonkeyRunner.sleep(1)
#查找到接收人id并输入
easy_device.type(By.id('id/to'),receiver)
MonkeyRunner.sleep(1)
easy_device.type(By.id('id/subject'),theme)
MonkeyRunner.sleep(1)
easy_device.type(By.id('id/body_text'),content)
MonkeyRunner.sleep(1)
#点击发送信息
easy_device.touch(By.id('id/send'),MonkeyDevice.DOWN_AND_UP)
MonkeyRunner.sleep(1)
根据不同的手机,可能短信界面元素id会有所不同,通过hierarchyviewer可以查看。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4205次
排名:千里之外
(1)(1)(3)(1)(3)转:monkeyrunner入门之——控件交互总结 - 番茄钟的个人空间 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
转:monkeyrunner入门之——控件交互总结
& 15:54:12
& &在写了两个monkeyrunner的自动化脚本之后,遇到了这样的问题,monkeyrunner无法处理gbk编码的中文.(我还没找到扩展的方法)& & &之前写的脚本需要获取button,然后对button进行点击.我是通过使用hierarchyviewer来查看各个控件的ID从而获取button的.下面对整个的流程做一个梳理需要import的东西有: & &&from com.android.monkeyrunner import MonkeyRunner,MonkeyDevicefrom com.android.monkeyrunner.easy import EasyMonkeyDevicefrom com.android.monkeyrunner.easy import Byfrom com.android.chimpchat.hierarchyviewer import HierarchyViewerfrom com.android.hierarchyviewerlib.device import ViewNodefrom com.android.monkeyrunner import MonkeyView& & &1. &MonkeyRunner和MonkeyDevice是最基础的类.& & &2. &EasyMonkeyDevice提供了一些根据ID进行touch,type,locate,getText的方法.具体见源码:& & &3. &By提供了根据ID返回PyObject的方法,使用EasyMonkeyDevice和By的配合可以利用ID做很多事情.& & &4. &HierarchyViewer提供了根据ID找到ViewNode,对viewnode的一些操作等& & &5. &ViewNode类的一个对象就代表了一个控件.控件上的所有属性,包括mID,mText,height,width都可以从这个类得到.从viewnode的源码中可以得到非常多的信息MonkeyView这个类我还没有搞清楚,从源码来看,也可以从这个类得到很多信息,包括parent,text等等.但是我对monkeyview对象的操作一直不成功,所有方法的调用都提示 No accessibility event has occured yet.目前还没有查出原因和解决方法.最基本的操作device = MonkeyRunner.waitForConnection() & & #等待设备的连接easy_device = EasyMonkeyDevice(device)&&&&&&&&& #得到一个EasyMonkeyDevice对象hierarchy_viewer = device.getHierarchyViewer()#得到一个HierarchyViewer对象& & & & & 基本上所有的程序都会用到这几个对象来对控件进行操作几种得到控件上的文字的方法 && & & & & & & &1. &用id通过By来获取:text=easy_device.getText(By.id('id/text'))& & & & & & & &2. &先获得ViewNode:viewnode = hierarchy_viewer.findViewById('id/text') & &&&&&&&&&&&&&&&&&&&&&再调用HierarchyViewer的方法:text=hierarchy_viewer.getText(viewnode)& & & & & & & &3. &直接从ViewNode的属性表中得到:text=viewnode_text.namedProperties.get("text:mText").value其实前两种方法本质上都是把第三种方法写成自己的函数而已.需要声明的是,上面的方法得到的text如果是英文的话,就不会有什么问题.如果是gbk编码的中文则在monkeyrunner中无法正常显示,你将会得到一些乱码.这个问题今天研究了一整天,还没有得到解决,希望能有人提供些帮助啊!按钮如何点击!!!monkeyrunner上press一个button有很三种办法& & &1. &通过MonkeyDevice的touch()方法.这是最直接也是最容易出错的方法,因为button在不同的上像素坐标是可能发生变化的.通过查看help文档,可以发现device&&&&&提供了非常方便好用的功能:有drag、press、touch、type&&&&&&&&&&drag()模拟在screen上的drag操作,需要解锁或者在屏幕实现上下滑动时可以使用&&&&&&&&&&如:device.drag((50,350),(50,100),0.1,10)&&&&&&&&&&Args:前两个表示开始与结束的像素坐标,后两个表示完成的耗时与分步& & &2. &根据ID进行touch。使用HierarchyViewer的话,你可以很容易得看到各个控件的ID,然后使用下面的语句去按按钮:easy_device.touch(By.id(id),MonkeyDevice.DOWN_AND_UP).当然,这个方法会出现一个让人头疼的问题,对于下拉列表和弹出框,这个touch常常会出错。因为下拉列表和弹出框的的坐标系问题,你获取到的button坐标是相对于列表和弹出框的,并不是相对于屏幕。在这种情况下,你只能自己去计算一个坐标变换。把相对坐标变换成屏幕坐标。这个函数附在最后。& & &3. &直接根据button上的mText去定位butto.这个用法就比较高级了,虽然MonkeyDevice提供了一个方法叫&,这个方法能根据提供的text去找monkeyview,但是我死活没法用它。没办法,只能自己写函数。这个函数也在最后。(因为该死的编码问题,暂时只能找到英文的button)关于中文编码&&&&&monkeyrunner是Jython写的.而Jython是不支持东南亚语言的.如果在程序中获取到的值是gbk编码的,想直接打印出来的话,会提示unknown encoding gbk.& & &那么如何解决这个问题?& & &很自然想到可以对这个值做decode么?decode成unicode.很遗憾,不可以.我们只能对这个gbk编码的值再做个utf-8编码来进行显示.而且显示的还是乱码& & &python中编码的转换实际上是str和unicode的转换.&&&&&直接写a='中文',a的类型是一个str.& & &如果写a=u'中文',a的类型是一个unicode.404 Not Found!!!你好 关于monkeyrunner测试,如何写一个bat文件执行多个测试脚本?_百度知道
你好 关于monkeyrunner测试,如何写一个bat文件执行多个测试脚本?
Python&#92:monkeyrunner D;sanity\sanity&#92关于monkeyrunner测试;test3,如何写一个bat文件执行多个测试脚本;test2.py这个用例:&#92,其他都不执行?:\sanity&#92.pymonkeyrunner D。;test1.py双击这个文件不知道为什么只能执行test1;Python\Python&#92:&#92.pymonkeyrunner D?我在文本文件里面写的内容如下
提问者采纳
sanity\ monkeyrunner D。  start &quot:\&sanity\& monkeyrunner D;test2:\Python\test1;sanity\Python&#92.pystart & monkeyrunner D;&quot.pystart &quot:\Python\test3  请用start 否则P处理会等待第一条执行结束后才会执行第二条
你好!这样是可以执行了,但是没有按顺序执行而且打开了好几个CMD的窗口,有解决办法吗?
实在需要顺序执行的话请用start /wait /b && monkeyrunner D:\Python\sanity\test1.pystart /wait /b && monkeyrunner D:\Python\sanity\test2.pystart /wait /b && monkeyrunner D:\Python\sanity\test3.py
提问者评价
其他类似问题
为您推荐:
bat文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 monkeyrunner脚本实例 的文章

 

随机推荐