终极自动化框架UIAutomator使用详解
本文节选自《深入理解Android自动化测试》第五章 5.5.1节
在“com.android.UIAutomator.core”这个类下方,横亘着UIAutomator最基本的几个API,下面,我们主要从实际需求出发,对最基本和最关键的API进行简要介绍。
http://developer.android.com/tools/help/UIAutomator/index.html
首先来看手势,monkeyrunner中的手势主要指通过MonkeyDevice的drag()方法直接传入A点和B点的坐标即可进行拖拽操作。
monkeyrunner对应API如下:boolean drag(int startX, int startY, int endX,int endY, int steps)
boolean dragTo(int destX, int destY, intsteps)
该方法拖拽对象到屏幕某个坐标位置上,步长可设置拖动速度。除此之外,UiObject还有个简便的dragTo()方法,如下:
UiObject还有个简便的dragTo()方法:boolean dragTo(UiObject destObj, int steps)
该方法拖拽对象到另一个对象位置上(而不是对应坐标),这个方法最大的优势是引入了UI对象(UiObject)概念,使得拖拽更精准。
另外,monkeyrunner可借助于拖拽手势通过输入屏幕空白处坐标作为起始位置(手指按下的位置)和并以另一屏幕空白处作为终点位置(手指弹起的位置)来实现滑屏功能。
boolean swipe(int startX, int startY, intendX, int endY, int steps)
该方法通过坐标滑动屏幕。
boolean swipe(Point[] segments, intsegmentSteps)
该方法实现在点阵列中滑动,其中segments为Poing[]点阵列,允许多个点。
不过UIAutomator似乎还提供了更好的滑屏方法,且不止一个,而是系列方法,这些方法来自UiObject,如下:
boolean swipeUp(int steps)
该方法实现向上滑屏(拖动对象往上滑动)。
boolean swipeDown(int steps)
该方法实现向下滑屏(拖动对象往下滑动)。
boolean swipeLeft(int steps)
该方法实现向左滑屏(拖动对象往左滑动)。
boolean swipeRight(int steps)
该方法实现向右滑屏(拖动对象往右滑动)。
UIAutomator这一系列滑屏API不仅使得滑屏操作变得非常精确(且通过API名极大避免出错),更避免了通过拖拽去滑屏可能造成的误拖拽(即不小心点中某个对象)操作。
示例如代码清单5-1所示。
代码清单5-1 向下滑屏UiObject bugben_down_menu = new UiObject(newUiSelector().textStartsWith("巴哥奔下拉菜单"));
bugben_down_menu.swipeDown(10);
然而,有一个问题深深地困扰着我们:手势操作难道就只有拖拽和滑屏?难道更丰富的手势操作无法通过API的方式提供给大家?
monkeyrunner的确木有了,但UIAutomator却没这么弱。
首先,通过UiObject提供了多点任意手势API(performMultiPointerGesture()),如下:
boolean performMultiPointerGesture(PointerCoords...touches)
该方法实现“多点触控手势”,可定义任意手势。
这一手势已经包罗万象,不过UIAutomator担心用户还得花时间自己定义最常用的双点触控API,于是又提供了一个双点触控手势API(performTwoPointerGesture),如下:
boolean performTwoPointerGesture(PointstartPoint1, Point startPoint2, Point endPoint1, Point endPoint2, int steps)
该方法实现“任意双点触控手势”,模拟双指手势。
事实上,我们平时用得最多的手势是缩放手势,即双指向外(如放大图片)或双指向内(如缩小图片),所以UiObject索性直接提供了这两个方法,如下:
boolean pinchIn(int percent, int steps)
该方法实现“双指向内收缩手势”操作,更准确地说是“控件对角线上的2个点同时由边缘向中心点滑动”。其中percent代表滑到对角线百分比的位置停止,steps代表时间,每一步5毫秒。
boolean pinchOut(int percent, int steps)
该方法实现“双指向外扩张手势”操作,更准确地说是“控件对角线上的2个点同时由中心点向边缘滑动”。
手势示例(模拟多点操作)如代码清单5-2所示。
代码清单5-2 手势操作UiObject bugben_fram = new UiObject(new UiSelector()
.className("android.widget.FrameLayout"));
// xuben:设计触点p1
PointerCoords p1 = new PointerCoords();
p1.x = 600;
p1.y = 600;
p1.pressure = 1;
p1.size = 1;
// xuben:设计触点p2
PointerCoords p2 = new PointerCoords();
p2.x = 500;
p2.y = 500;
p2.pressure = 1;
p2.size = 1;
// xuben:将两个触点传入(此处可传入多个点)
bugben_fram.performMultiPointerGesture(p1, p2);
更多内容,请点击“阅读原文”
参考《深入理解Android自动化测试》一书,谢谢!