Uiautomator的基础对象
uiautomator的基础对象:
UiDevice
代表设备状态。在测试中,可以通过UiDevice实例来检测设备的各种属性,例如当前的屏幕方向以及屏幕尺寸。同时还可以通过UiDevice实例来执行设备级别的操作,例如 把设备设置为横屏或者竖屏、按下Home按键等。
例:getUiDevice().pressHome(); //模拟按下home键操作
UiSelector
代表一个搜索UI控件的条件。如果发现多个满足条件的控件则会返回第一个控件。返回的结果为UiObject对象。在构造UiSelector的时候可以 组合使用多个属性来定位具体的控件。如果没有找到控件则会抛出 UiAutomatorObjectNotFoundException 异常
UiObject
代表一个UI控件。通过UiSelector来查找UiObject。
UiCollection
代表控件的集合。获取UiCollection的方式和UiObject一样,通过 UiSelector查找。 UiCollection对应Android系统中的ViewGroup以及子控件。比如界面中有多个check时,我们要使用classname获取当前界面中所有的checkbox,就可以使用UICollection来接收获取到的控件集合
UiScrollable
代表可滚动的控件。可以用UiScrollable来模拟水平或者垂直滚动的UI元素。如果需要操作的元素在屏幕外需要滚动屏幕才能看到的情况下需要使用UiScrollable
其他API参考uiautomator api文档
分享一下我所知道的一些uiautomator API
一、控件定位类:
控件定位属于android自动化中比较常用的,uiautomator可以使用resource-id,文本,index,classname(控件类型),伪xpath
通过文本定位:
UISelector().text方法
例:textview = new UiObject(new UiSelector().text("user info"));
该方法通过直接查找当前界面上所有的控件来比较每个控件的text属性是否如参数值来定位控件,挺好理解的,所以就没有必要细说了。
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")));
上面这段代码是一个场景
这是一个android里面常见的listview,它里面有很多的layout,可是如果我只想获取到cache junk这一条目中的checkbox,又没有id,index又不固定的情况下,怎么办呢,就使用上面那段代码,以下是UI和层级关系
那段代码的思路是,使用text定位cache junk这个UI中的唯一性控件,然后.fromParent定位到cache junk控件的父控件,就是index为1的那个RelativeLayout控件,再在RelativeLayout控件中通过classname定位这个layout中的唯一一个checkbox控件,大家可以想一下这个思路,你小儿子踢足球把我家玻璃打碎了,逃逸了,我认识你大儿子,我通过你大儿子找到你爸爸,再通过你爸爸找到小儿子,揍一顿~
通过UiSelector.childSelector或UiObject.getChild方法
刚才是一个通过孩子找父亲再找兄弟的思路,那么这个方法就是我知道你爸爸是谁,我直接通过你爸爸找到儿子
例:UiObject parentView = new UiObject(new UiSelector().className("android.view.View"));
save = parentView.getChild(new UiSelector().text("Save"));
以上就是一些比较常用的,定位控件的方法,下面是一些零散的操作类方法
·唤醒手机:getUiDevice().wakeUp();
·点击控件:UiObject huancun=new UiObject(new UiSelector().text("Cache junk"));
huancun.click();
·滑动:getUiDevice().swipe(startX, startY, endX, endY, steps)
在手机上滑动,从(startX,startY)到(endX,endY)。steps表示滑动的这个距离分为几步完成,数目越少,滑动幅度越大
·点击并等待窗口刷新:UiObject huancun=new UiObject(new UiSelector().text("Cache junk"));
huancun..clickAndWaitForNewWindow()
·长按:UiObject huancun=new UiObject(new UiSelector().text("Cache junk"));
huancun.longclick();