您的位置:首页 > 产品设计 > UI/UE

[置顶] yjh的实习生涯之自动化测试(1)---初识uiautomator(uiautomator的使用和基本方法)

2016-12-24 00:14 477 查看
作为一个学习安卓的实习生,在年底找到了一个自动化测试的工作,虽然面试的时候跟我说的是开发。不过短暂的接触之后,发现它也有一些有趣的内容,现在写一下博客,记录一些所学内容和容易出错的地方,都是很基础入门的内容,有一部分来自网络,望大神们多多指教和提点。

首先是查看uiautomator工具的用法,这个工具主要是用来定位到手机上的一些控件,然后通过Java代码获得这些控件并对这些控件进行操作。uiautomator基本上下载完sdk里面都会有,在tools文件夹下面,我的目录是:C:\Users\zyc\Desktop\adt-bundle-windows-x86_64-20140702\sdk\tools。进入后找到该文件夹下的uiautomatorviewer.bat,点击之后出现如下图所示:



点击右边的  第二个,点击完成后会出现如下图:



此时点击图片上的任一图标或者控件,右下角会有唯一对应的或resource-id 或text 或content-desc等 这就是我们用来定位控件的依据。

接下来,就可以开始写我们的代码了,写代码前,先了解一下uidevice的一些用法和方法,下面部分参考网络:

UiDevice

代表设备状态。在测试中,可以通过UiDevice实例来检测设备的各种属性,

例如当前的屏幕方向以及屏幕尺寸。同时还可以通过UiDevice实例来执行设备级别的操作,

例如 把设备设置为横屏或者竖屏、按下Home按键等。

例:getUiDevice().pressHome();      //模拟按下home键操作

例:getUiDevice().pressBack();      //模拟按下back键操作

 

UiSelector

代表一个搜索UI控件的条件。如果发现多个满足条件的控件则会返回第一个控件。

返回的结果为UiObject对象。在构造UiSelector的时候可以 组合使用多个属性来定位具体的控件。

如果没有找到控件则会抛出 UiAutomatorObjectNotFoundException 异常

UiObject

代表一个UI控件。通过UiSelector来查找UiObject。

UiCollection

代表控件的集合。获取UiCollection的方式和UiObject一样,通过 UiSelector查找。

 UiCollection对应Android系统中的ViewGroup以及子控件。比如界面中有多个check时,

我们要使用classname获取当前界面中所有的checkbox,就可以使用UICollection来接收获取到的控件集合

 

UiScrollable

代表可滚动的控件。可以用UiScrollable来模拟水平或者垂直滚动的UI元素。

如果需要操作的元素在屏幕外需要滚动屏幕才能看到的情况下需要使用UiScrollable

一、控件定位类:

控件定位属于android自动化中比较常用的,uiautomator可以使用resource-id,

文本,index,classname(控件类型),伪xpath

通过文本定位:

UISelector().text方法

例:textview = new UiObject(new UiSelector().text("user info"));

该方法通过直接查找当前界面上所有的控件来比较每个控件的text属性是否如参数值来定位控件,

挺好理
4000
解的,所以就没有必要细说了。

UISelector.textContains方法

例:addNote = new UiObject(new UiSelector().textStartsWith("user"));

此方法跟以上方法类似,但是不需要输入控件的全部text信息

通过resource-id定位:

UISelector().resourceId方法

例:UiObject lb=new UiObject(new UiSelector().resourceId

("com.cleanmaster.mguard:id/relativeLayoutBtns"));

resource-id可以通过android_sdk tools目录下的uiautomatorviewer工具查看

通过classname定位:

UiSelector().classname方法

例:UiCollection list=new UiObject(new UiSelector().className("android.widget.CheckBox"));

 

通过伪xpath定位:

UISelector类提供了一些方法根据控件在界面的XML布局中的层级关系来进行定位,

但是UIAutomator又没有真正的提供类似Appium的findElementWithXpath相关的方法,

所以这个位置我们叫它伪xpath,其实就是通过层级一层一层去定位控件,

通常用于Listview中定位id相同的控件

UiSelector.fromParent或UiObject.getFromParent方法

例:UiObject uio=new UiObject(new UiSelector().text("Cache junk").

fromParent(new UiSelector().className("android.widget.CheckBox")));

通过UiSelector.childSelector或UiObject.getChild方法

刚才是一个通过孩子找父亲再找兄弟的思路,那么这个方法就是我知道你爸爸是谁,我直接通过你爸爸找到儿子

例:UiObject parentView = new UiObject(new UiSelector().className("android.view.View"));

save = parentView.getChild(new UiSelector().text("Save"));

然后是uidevice的一些方法:

uidevice.pressBack(); 模拟点击设备返回键

uidevice.pressHome();模拟点击设备home键

uidevice.pressEnter();  模拟点击设备回车键

uidevice.pressDelete();模拟点击设备删除键

//旋转屏幕(向左旋转)

UiDevice.getInstance().setOrientationLeft();

//小写字母
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);

//大写字母
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_B,1);
//点击固定点
UiDevice.getInstance().click(200, 830);
//获取屏幕高和宽
int h=UiDevice.getInstance().getDisplayHeight();
int w=UiDevice.getInstance().getDisplayWidth();
UiDevice.getInstance().click(w/2, h/2);

//获取包名

System.out.println(UiDevice.getInstance().getCurrentPackageName());

//打开通知栏

UiDevice.getInstance().openNotification();

//打开快速设置

UiDevice.getInstance().openQuickSettings();

//获取xml布局文件 /data/local/tmp 存放位置

UiDevice.getInstance().dumpWindowHierarchy("abc.xml");

//截图

 public void testJieTu(){

        File storePath=new File("/sdcard/test.png");

        UiDevice.getInstance().takeScreenshot(storePath);

}

以下参考网络:http://www.cnblogs.com/kllay/p/5692094.html  点击与长按方面的方法:

举例:UiObject ok = new UiObject(new UiSelector().text("OK"));//声明对象

         ok.click();//点击"OK" text.

1.public boolean click() 点击对象

2.public boolean clickAndWaitForNewWindow(long timeout) 点击对象,等待新窗口出现,

参数为等待超时时长

3.public boolean clickAndWaitForNewWindows() 点击对象,等待新窗口出现

4.public boolean clickBottomRight() 点击对象的右下角

5.public boolean clickTopLeft() 点击对象的左上角

6.public boolean longClick() 长按对象

7.public boolean longClickBottomRight() 长按对象的右下角

8.public bolean longClickTopLeft() 长按对象的左上角

 

拖拽与滑动方面的方法:

举例:UiObject answerCall = new UiObject(new UiSelector().textStartWith("右滑接听"));

   nswerCall.swipeRight(10);

1.public boolean dragTo(UiObject destObj, int steps)

   拖拽对象到另一个对象上,步长可设置拖动的速度,步长越小,拖动速度越快。

2.public boolean dragTo(int deskX, int deskY, int steps)

    拖拽对象到屏幕某个坐标位置上,步长可设置拖动速度

3.public boolean swipeDown(int steps)

    拖动对象往下滑

4.public boolean swipeLeft(int steps)

    拖动对象往左滑

5.public boolean swipeRight(int steps)

    拖动对象往右滑

6.public boolean swipeUp(int steps)

    拖动对象往上滑

输入文本与清除文本方面的操作:

举例:UiObject inputMessage = new UiObject(new UiSeletor().text("Please inout message content"));

   inputMessage.setText("Message Test") //在短信编辑框中输入文本内容

   UiObject clearMessage = new UiObject(new UiSelector().text("Message Test"));

   clearMessage.clearTextField(); //输入完后清除短信编辑框文本内容

1.public boolean setText(String text) 在对象中输入文本

2.public boolean clearTextField() 清除编辑框文本

 

获取对象属性方面的方法:

举例:UiObject getTextObject = new UiObject(new UiSelector().className(android.widget.TextView)) 

      //获取第一个textView

      String textrString = getTextObject.getText(); //获得textView的文本

1. public rect getBounds()

    获取对象矩形坐标,矩形坐标左上角与右下角坐标。

2.public UiObject getChild(UiSelector selector)

    获取对象的子类对象,可以递归获取子孙当中的某个对象

3.public int getChildCount()

    获得下一级子类的数量

4.public String getClassName()

    获得对象类名属性的类名文本

5.public String getContentDescription()

    获得对象的描述属性的描述文本

6.public UiObject getFromParent(UiSelector selector)

    从父类获取子类,按照uiselector获取兄弟类

7. public String getPackageName()

    获取对象包名属性的包名文件

8.public final UiSelector getSelector()

    获取selector用于调试

9.public String getText()

    获取对象的文本属性中的文本

 

属性判断方面的方法:

举例:UiObject inpputTextObject = new UiObject(new UiSelector().className(

"android.widget.Switch")); //声明开关对象

if(inputTextObject.isChecked())

  {

    inputTextObject.click(); //如果开关是开,则点击关闭。

  }

1.public boolean isCheckable() 检查对象的checkable属性是否为true

2.public boolean isChecked() 检查对象的checked属性是否为true

3.public boolean isClickable() 检查对象的clickable属性是否为true

4.public boolean isEnabled() 检查对象的enable属性是否为true

5.public boolean isFocusable() 检查对象的focusable属性是否为true

6.public boolean isLongClickable() 检查对象的longClickable属性是否为true

7.public boolean isScrollable() 检查对象的scrollable属性是否为true

8.public boolean isSelected() 检查对象的selected属性是否为true

 

手势操作方面的方法:

举例:

   UiObject framObject = new UiObject(new UiSelector().className("android.widget.FrameLayout"));

    PointerCoords p = new PointerCoords();

  p.x = 500;

  p.y= 500;

  p.pressure = 1;

  p.size = 1;

  PointerCoords p1 = new PointerCoords();

  p1.x = 600;

  p1.y= 600;

  p1.pressure = 1;

  p1.size = 1;

  PointerCoords p2 = new PointerCoords();

  p2.x = 500;

  p2.y=500;

  p2.pressure = 1;

  p2.size = 1;

  frameObject.performMultiPointerGesture(p,p1,p2);

1.public boolean performTwoPointerGesture(Point staretPoint1, 

Point statsPoint2, Point endPoint1, Point endPoint2, int steps)

    执行任意两个手指触控手势,模拟两个手指手势

2.public boolean pinchIn(int precent, int steps)

    手势操作,两点向内收缩

3.public boolean pinchOut(int percent, int steps)

    手势操作,两点向外张开

4.public boolean performMultiPointerGesture(PointerCoords... touches)

    执行单手指触手势,可定义任意手势与形状

判断对象是否存在、是否出现与是否消失方面的方法:

  举例:

  Runtime.getRuntime().exec(am start -n com.android.calculator2/com.android.

        calculator2.Calculator); // 打开计算机

  UiObject addObject = new UiObject(new UiSelector().text("+)); //计算机界面"+"对象

  addObject.waitForExists(10000);

 

总结:

  1.声明UiOject对象后,不管对象存不存在都不会有问题---先声明对象,后操作;

  2.当对象可能出现可能不出现的时候,需要对对象进行判断;

  1.public boolean waitForExist(long timeout) 等待对象出现

  2.public boolean waitUntilGone(long timeout) 等待对象消失

  3.public boolean exists() 检查对象是否存在

把这些消化完之后,接下来我就开始编写代码,并且把Java代码运行到android手机上,实现最基本的自动打开淘宝并登录功能,我在下一篇会写到:http://blog.csdn.net/qq_33223761/article/details/53848396
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: