MonkeyDevcieAPI实践全记录
1. 背景
使用SDK自带的NotePad应用作为实践目标应用,目的是对MonkeyDevice拥有的成员方法做一个初步的了解。
成都创新互联公司网站建设公司,提供成都网站设计、成都网站制作、外贸网站建设,网页设计,建网站,PHP网站建设等专业做网站服务;可快速的进行网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,是专业的做网站团队,希望更多企业前来合作!
以下是官方列出的方法的Overview。
Return Type | Methods | Comment |
void | broadcastIntent (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, iterable flags) Broadcasts an Intent to this device, as if the Intent were coming from an application. |
|
void | drag (tuple start, tuple end, float duration, integer steps) Simulates a drag gesture (touch, hold, and move) on this device's screen. |
|
object | getProperty (string key) Given the name of a system environment variable, returns its value for this device. The available variable names are listed in the detailed description of this method. |
|
object | getSystemProperty (string key) . The API equivalent of adb shell getprop use by platform developers. |
|
void | installPackage (string path) Installs the Android application or test package contained in packageFile onto this device. If the application or test package is already installed, it is replaced. | Obsolete,返回值是Boolean |
dictionary | instrument (string className, dictionary args) Runs the specified component under Android instrumentation, and returns the results in a dictionary whose exact format is dictated by the component being run. The component must already be present on this device. |
|
void | press (string name, dictionary type) Sends the key event specified by type to the key specified by keycode. |
|
void | reboot (string into) Reboots this device into the bootloader specified by bootloadType. |
|
void | removePackage (string package) Deletes the specified package from this device, including its data and cache. | Obsolete,返回值是Boolean |
object | shell (string cmd) Executes an adb shell command and returns the result, if any. |
|
void | startActivity (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags) Starts an Activity on this device by sending an Intent constructed from the supplied arguments. |
|
MonkeyImage | takeSnapshot() Captures the entire screen buffer of this device, yielding a MonkeyImage object containing a screen capture of the current display. |
|
void | touch (integer x, integer y, integer type) Sends a touch event specified by type to the screen location specified by x and y. |
|
void | type (string message) Sends the characters contained in message to this device, as if they had been typed on the device's keyboard. This is equivalent to callingpress() for each keycode in message using the key event type DOWN_AND_UP. |
|
void | wake () Wakes the screen of this device. |
|
其实官方这个表是没有及时更新的,我现在手头上用到的MonkeyRunner是当前最新的,里面就拥有好几个官网没有列出来的API,我怀疑是不是自从UIAutomator在03年出来后,google就不打算再继续维护MonkeyRunner了?如果有朋友知道事实的话,还麻烦告知。
以下是我整理出来的源码多出来的可用公共API列表
Return Type | Methods | Comment |
HierarchyViewer | getHierarchyViewer(PyObject args[], String kws[]) 获取一个HierarchyViewer对象 | 请查看《MonkenRunner通过HierarchyViewer定位控件的方法和建议》 |
PyList | getPropertyList(PyObject args[], String kws[]) | 取得所有的property属性键值 |
PyList | getViewIdList(PyObject args[], String kws[]) | Failed |
MonkeyView | getViewById(PyObject args[], String kws[]) | Failed |
MonkeyView | getViewByAccessibilityIds(PyObject args[], String kws[]) | Failed |
MonkeyView | getRootView(PyObject args[], String kws[]) | Failed |
PyList | getViewsByText(PyObject args[], String kws[]) | Failed |
但可惜的是在本人尝试以上多出来的API的时候,发现除了最上面两个可用之外,其他的都不可用并抛出错误。且网上资料少的可怜,别人碰到同样的问题也找不到解决办法。所以本人怀疑这些“隐藏”API是不是并没有完善,或者说google不准备完善,所以才没有列出到官网上面去。本人用的SDK tools和Platform tools已经是当前最新的23.0.2和20.
一个台湾网友碰到的问题描述:http://imsardine.simplbug.com/note/monkeyrunner/api/hierarchy-viewer.html
2. Void broadcastIntent
(string uri, string action,string data, string mimetype, iterable categories dictionary extras, componentcomponent, iterable flags)
2.1 分析
本人理解的此方法的本意是想广播一个Intent给我们的AndroidDevice,目标应用接收到该Intent做相应的处理,比如打开一个Activity等。但在我的多次尝试下并没有成功!
targetDevice.broadcastIntent(action='android.intent.action.INSERT', mimetype='vnd.android.cursor.dir/contact', extras = {'name':'user1501488', 'phone':'123-15489'}
如果使用同样的参数,使用下面的startActivity是没有问题的。
targetDevice.startActivity(action='android.intent.action.INSERT', mimetype='vnd.android.cursor.dir/contact', extras = {'name':'user1501488', 'phone':'123-15489'})
google了半天网上根本找不到这个方法的使用例子,倒是stackOverFlow上有人建议用Shell来达到同样的效果。
targetDevice.shell("am start -a android.intent.action.INSERT -t vnd.android.cursor.dir/contact -e name 'Donald Duck' -e phone 555-1234").
所以可见这个方法并没有多少人在用,原因应该是它完全可以用上面介绍的两个方法替代。
3. void startActivity
(string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
3.1 示例
targetDevice.startActivity(action='android.intent.action.VIEW', mimetype='vnd.android.cursor.dir/vnd.google.note')
使用component来启动一个Activity:
targetDevice.startActivity(component="com.example.android.notepad/com.example.android.notepad.NotesList")
使用action,mimetype和指定extras参数来启动一个Activity:
targetDevice.startActivity(action='android.intent.action.INSERT', mimetype='vnd.android.cursor.dir/contact', extras = {'name':'user1501488', 'phone':'123-15489'})
3.2 分析
4. void drag (tuple start, tuple end, floatduration, integer steps)
这个方法的目的是按住一个控件然后把她拖动到其他位置
4.1 实例
viewer = targetDevice.getHierarchyViewer() note = viewer.findViewById('id/text1') point = viewer.getAbsoluteCenterOfView(note) startX = point.x startY = point.y targetDevice.drag((startX,startY),(startX,startY),1) targetDevice.press('KEYCODE_BACK', MonkeyDevice.DOWN_AND_UP)
4.2 分析和建议
以上示例是通过drag的方法来模拟LongPress,只要把参数中的起始坐标和目标坐标都设置成同样一个值,然后时常设置成一个有效的值就好了。
5 Object getProperty (string key)
通过环境变量的key来获得其对应的值。以下是官方提供的可用化境变量列表
Property Group | Property | Description | Notes |
build | board | Code name for the device's system board | See Build |
brand | The carrier or provider for which the OS is customized. |
| |
device | The device design name. |
| |
fingerprint | A unique identifier for the currently-running build. |
| |
host |
|
| |
ID | A changelist number or label. |
| |
model | The end-user-visible name for the device. |
| |
product | The overall product name. |
| |
tags | Comma-separated tags that describe the build, such as "unsigned" and "debug". |
| |
type | The build type, such as "user" or "eng". |
| |
user |
|
| |
CPU_ABI | The name of the native code instruction set, in the form CPU type plus ABI convention. |
| |
manufacturer | The product/hardware manufacturer. |
| |
version.incremental | The internal code used by the source control system to represent this version of the software. |
| |
version.release | The user-visible name of this version of the software. |
| |
version.sdk | The user-visible SDK version associated with this version of the OS. |
| |
version.codename | The current development codename, or "REL" if this version of the software has been released. |
| |
display | width | The device's display width in pixels. | SeeDisplayMetricsfor details. |
height | The device's display height in pixels. |
| |
density | The logical density of the display. This is a factor that scales DIP (Density-Independent Pixel) units to the device's resolution. DIP is adjusted so that 1 DIP is equivalent to one pixel on a 160 pixel-per-inch display. For example, on a 160-dpi screen, density = 1.0, while on a 120-dpi screen, density = .75. The value does not exactly follow the real screen size, but is adjusted to conform to large changes in the display DPI. See density for more details. |
| |
am.current | package | The Android package name of the currently running package. | The am.currentkeys return information about the currently-running Activity. |
action | The current activity's action. This has the same format as the name attribute of the action element in a package manifest. |
| |
comp.class | The class name of the component that started the current Activity. See comp.package for more details. |
| |
comp.package | The package name of the component that started the current Activity. A component is specified by a package name and the name of class that the package contains. |
| |
data | The data (if any) contained in the Intent that started the current Activity. |
| |
categories | The categories specified by the Intent that started the current Activity. |
| |
clock | realtime | The number of milliseconds since the device rebooted, including deep-sleep time. | SeeSystemClock for more information. |
5.1示例
displayWidth =targetDevice.getProperty ('display.width') printdisplayWidth.encode('utf-8') displayHight =targetDevice.getProperty('display.width') printdisplayHight.encode('utf-8')
5.2 分析和建议
以上示例的目的是获得目标设备的长和高,当我们使用坐标点来操作控件的时候,调试的时候在一台机器上通过了,但是如果换了另外一个屏幕大小不一样的机器的话就会失败,因为控件的坐标点位置可能就变了。这个时候我们就需要用到示例中的连个属性来动态计算控件在不同屏幕大小的设备上面的坐标点了。
这里需要注意参数应该填写的格式是以上列表中前两列的组合PropertyGroup.Property
6. Object getSystemProperty (string key)
6.1 示例
displayWidth = targetDevice.getSystemProperty ('service.adb.tcp.port') print displayWidth.encode('utf-8')
6.2 分析和建议
根据官网的描述,这个函数和getProperty函数应该有同样的功能(Synonym for getProperty().),使用的属性表也如上面的属性列表一样。但是按照我的实践并非如此,不过它确实如官方描述的等同于命令“adb shell getprop
以上的例子是获取adb这个服务所打开的TCP端口,等同于如下的shell命令:“adb shell getprop service.adb.tcp.port“
如果我尝试使用下面的方法去获得设备的长度,返回的结果其实会是None
displayWidth = targetDevice.getSystemProperty ('display.width') print displayWidth.encode('utf-8')
7 Boolean installPackage (string path)
7.1示例
if True == targetDevice.installPackage('D:\\Projects\\Workspace\\PythonMonkeyRunnerDemo\\apps\\MPortal.apk'): print "Installationfinished successfully" else: print "Failedto install the apk"
7.2 分析和建议
这里有两点需要注意的:
- 官方网站描述的这个API是没有返回值的(见背景中的表),而最新版本的API里面是Boolean值。
- 参数输入的应该是PC端这边的Local路径而非目标系统的Local路径。
注意这里碰到一个路径问题,如果我的路径写成:
'D:\Projects\Workspace\PythonMonkeyRunnerDemo\apps\MPortal.apk'
那么会出现下图这样的错误:
14 object shell(string cmd)
14.1 示例
res = targetDevice.shell('ls /data/local/tmp|grep note') print res
14.2 分析
这个命令等同于你直接在命令行上“adb shell $command”
15 void reboot(string into)
其他参数没有用到所以也就没有尝试,仅仅尝试了不带参数的情况,结果就是直接reboot目标设备了
targetDevice.reboot()这里有点需要提下的是,如果你是在MonkeyRunner命令行下执行这条命令的话,就算目标机器重启,整个MonkeyRunner的环境还是依然有效的。也就是说你如果继续打进一条"targetDevice.reboot()",你的设备就会再重启一次。
作者 | 自主博客 | 微信 | CSDN |
天地会珠海分舵 | http://techgogogo.com | 服务号:TechGoGoGo 扫描码: | http://scyanting.com/article/gejchp.html 其他资讯 |