Android自动化大讲堂37--UIAutomator API详解之给力的手势

终极自动化框架UIAutomator使用详解


注意:

本文节选自《深入理解Android自动化测试》第五章 5.5.1节


1 UIAutomator API详解


Android自动化大讲堂37--UIAutomator API详解之给力的手势_第1张图片

Android自动化大讲堂37--UIAutomator API详解之给力的手势_第2张图片

Android自动化大讲堂37--UIAutomator API详解之给力的手势_第3张图片

在“com.android.UIAutomator.core”这个类下方,横亘着UIAutomator最基本的几个API,下面,我们主要从实际需求出发,对最基本和最关键的API进行简要介绍。


API官网地址:

http://developer.android.com/tools/help/UIAutomator/index.html

Android自动化大讲堂37--UIAutomator API详解之给力的手势_第4张图片

Android自动化大讲堂37--UIAutomator API详解之给力的手势_第5张图片


2 与monkeyrunner对照之:给力的手势

首先来看手势,monkeyrunner中的手势主要指通过MonkeyDevice的drag()方法直接传入A点和B点的坐标即可进行拖拽操作。

monkeyrunner对应API如下

boolean drag(int startX, int startY, int endX,int endY, int steps)


UIAutomator中与之相对的API为UiObject的dragTo()方法

boolean dragTo(int destX, int destY, intsteps)


该方法拖拽对象到屏幕某个坐标位置上,步长可设置拖动速度。除此之外,UiObject还有个简便的dragTo()方法,如下:

UiObject还有个简便的dragTo()方法

boolean dragTo(UiObject destObj, int steps)


该方法拖拽对象到另一个对象位置上(而不是对应坐标),这个方法最大的优势是引入了UI对象(UiObject)概念,使得拖拽更精准。


另外,monkeyrunner可借助于拖拽手势通过输入屏幕空白处坐标作为起始位置(手指按下的位置)和并以另一屏幕空白处作为终点位置(手指弹起的位置)来实现滑屏功能。Android自动化大讲堂37--UIAutomator API详解之给力的手势_第6张图片


通过UiDevice中的滑动(swipe())方法

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自动化测试》一书,谢谢!




你可能感兴趣的:(Android自动化大讲堂37--UIAutomator API详解之给力的手势)