以一个简单的例子开始吧。我们完成一个 " 打开QQ,进入QQ空间,然后退出 " 的case。
代码如下:
package QQ; import java.io.IOException; import com.android.uiautomator.core.UiDevice; import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiSelector; import com.android.uiautomator.testrunner.UiAutomatorTestCase; public class Test_qq extends UiAutomatorTestCase { public void testDemo() throws IOException, UiObjectNotFoundException { // 启应用 Runtime.getRuntime().exec("am start com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity"); sleep(3000); // 点击 "动态" tab UiDevice device = getUiDevice(); int height = device.getDisplayHeight(); int width = device.getDisplayWidth(); device.click(width -50, height-50); sleep(1000); // 点击 "好友动态" 按钮 UiObject obj_1 = new UiObject(new UiSelector().description("点击进入好友动态")); obj_1.click(); sleep(2000); // 点击 左上角返回 "动态"按钮 UiObject obj_2 = new UiObject(new UiSelector().resourceId("com.tencent.mobileqq:id/ivTitleBtnLeft")); obj_2.click(); sleep(1000); // 点击菜单键 device.pressMenu(); sleep(1000); // 点击退出qq UiObject obj_3 = new UiObject(new UiSelector().text("退出QQ")); obj_3.click(); sleep(1000); // 点击确定 UiObject obj_4 = new UiObject(new UiSelector().text("确定")); obj_4.click(); } }
脚本的运行效果如下:
代码详解
针对上面的例子的代码,我对每一句代码都做个详细的解释吧。
第一部分:启动应用
exec() 这个函数的意思,相当于是在你在输入adb shell 命令后,在Android手机系统的命令行下运行。所以上面这句话的意思和我们打开cmd框输入" adb shell am start *** " 是一样的的效果。
一般来说我们做App的自动化的时候,第一步都是把App打开,这个am start命令的就可以帮我们实现,类似与Monkeyrunner API中的startActivity() 函数。
第二部分:点击 “动态” tab
UiDevice对象会在API部分详细讲解,它是一个我们在Uiautomator中经常使用的一个对象。
这里我们首先用它获取到当前手机的宽和高的像素。然后观察到 “动态” tab位于右下方,因此在取得右下角的坐标点后,又进行了一个大概的坐标变化(这里为了简单只是向左和向上移动了50像素,如果要精确的可以进行等比转化),然后点击该坐标。
这里之所以用点击坐标的方法,一方面是因为这个控件Uiautomator不支持用API获得实例(上一节所说的NAF Nodes,如下图),另一方面也是想说明在一些控件没有固定的id、text和desc的时候,我们应该怎么处理。
第三部分:点击 “好友动态”
要想操作一个控件(例如),首先得获得一个UiObject对象,而UiObject对象可以通过UiSelector来构造,而UiSelector可以根据控件的id、text、content-desc来进行构造,这里就是用content-desc来构造。
如上图用 uiautomatorviewer 查到该控件的 content-desc 的内容是 “点击进入好友动态” ,因此我们就可以通过代码中的方法来得到UiObject对象了,然后调用click() 方法来达到点击效果。
第四部分:点击左上角返回按钮
同第三部分的方法,找到id后直接获得到UiObject对象,进行点击。
第五部分:点击菜单键
UiDevice 可以模拟点击home、back、menu 这三个键,代码应该大家都懂的怎么变化了吧。
第六部分:退出
这一部分也是先通过获取出控件属性中的text值,然后构造出UiObject对象,完成点击。