前言 之前在论坛看到有同行在用MonkeyRunner测试一些Android的操作, 使用的是Python写的脚本, 设想应该也是可以用java来写脚本的, 毕竟本身MonkeyRunner是用java写的, 并调用了一些Android平台的Api. 在网上上搜索了一下 确实也可以,只是网上的例子基本都是直接使用Android的api, 相对来说看起来不是那么友好, 于是本着学习的态度,自己尝试着学习下MonkeyRunner的源代码, 然后试着改下, 再稍微的封装下, 于是便有了这篇帖子. 本帖子中所描述并且给出的代码, 源于Android的基础Api,二次进行的简单修改, 目的在于研究和学习之用. 同时用java 编写类似MonkeyRunner的代码并不需要MonkeyRunner.jar, 特此声明. MonkeyRunner基本结构
com.android.monkeyrunner.controller 和 com.android.monkeyrunner.recorder 包下为MonkeyRunner的UI界面, 标准的java swing编写, 界面布局非常简单, 并非像uiautomatorview一样使用的 Eclipse RCP. com.android.monkeyrunner 包下才是主要的东西, 由Python文件包含的信息会经由JythonUtils进行分析,然后在调用MonkeyRunner.java等这些主要的操作类进行操作. 主要的操作类为MonkeyRunner, MonkeyDevice, MonkeyView, MonkeyImage, 下文将要进行编写和封装的自定义类,也将和这几个关键类进行匹配. 如果想在IDE中编译MonkeyRunner的源代码需要 ddmlib.jar,guavalib.jar,sdklib.jar,chimpchat.jar,hierarchyviewer2lib.jar 这五个jar包,而应于我们自己编写的也需要着五个包,所以并不需要MonkeyRunner.jar. 基本思路 简单说是把MonkeyRunner的核心的几个类自己在写一遍, 因为本身并不复杂,所以写起来也用不了多少时间, 而且很多的方法基本都是删减点,然后直接拷贝过去好了. 扩展对照
举个栗子 MonkeyRunner public static MonkeyDevice waitForConnection(PyObject[] args, String[] kws) { ArgParser ap = JythonUtils.createArgParser(args, kws); Preconditions.checkNotNull(ap); long timeoutMs; try { double timeoutInSecs = JythonUtils.getFloat(ap, 0); timeoutMs = (long) (timeoutInSecs * 1000.0); } catch (PyException e) { timeoutMs = Long.MAX_VALUE; } IChimpDevice device = chimpchat.waitForConnection(timeoutMs, ap.getString(1, ".*")); MonkeyDevice chimpDevice = new MonkeyDevice(device); return chimpDevice; } MteMonkeyRunner public static MteMonkeyDevice waitForConnection(long timeoutMs, String deviceId) { setChimpChat(); IChimpDevice device = chimpchat.waitForConnection(timeoutMs, deviceId); MteMonkeyDevice mmd = new MteMonkeyDevice(device); return mmd; } setChimpChat()方法为本人自己添加的, 因为如果直接调用MteMonkeyRunner或者是MonkeyRunner的方法因为chimpchat并没有初始化,所以必然抛空指针,所以我自己对chimpchat进行了初始化, 请参考下面的代码: static void setChimpChat() { TreeMap<String, String> options = new TreeMap<String, String>(); options.put("backend", "adb"); chimpchat = ChimpChat.getInstance(options); }