Android自动化框架uiautomator简介

Android⾃动化框架uiautomator简介
UI⾃动化测试框架,安卓移动端APP.
要求:Android 4.3以上
1.提供⼀系列API:执⾏UI测试在系统或者第三⽅APP上⾯;
2.允许在被测设备上执⾏操作,⽐如打开系统设置菜单。
3.适合编写⿊盒⾃动化测试
UIautomator框架主要特点:
1.元素定位:UIautomator viewer。扫描、分析待测应⽤的UI组件的图像⼯具;
2.元素操作:Accessing devicestate.在⽬标设备和app上的各种操作
3.元素识别:UI Automator APIs,在多个应⽤程序中捕获和操作UI组件。纳米金粉
1.uiautomatorviewer
uiautomatorviewer位于sdk/tools⽬录下,可以扫描、分析待测试应⽤界⾯,分析结果可以导出为xml与截图。通过该⼯具可以分析出UI控件的id,text,focusable等等各种属性,甚⾄布局上的层次关系。
windows下运⾏tools下的uiautomatorviewer.bat
liunx下运⾏./uiautomatorviewer  启动该⼯具。
上图uiautomatorviewer的运⾏截图,左上⾓两个⼿机模样的图标点击后就会开始截图并分析UI组件,分析后的结果如下⽅所⽰,左侧为⼿机当前画⾯截图,右侧上部为view控件的层次关系,下部为当前选中控件的各种信息。
2.uiautomator APIs
uiautomator是⼀个包含⼀套UI测试API,和⽀持运⾏测试程序的JAR包。该JAR包位于sdk/platforms/android-* /uiautomator.jar. 使⽤时需要注意⾃⼰的SDK版本需要⼤于16, SDK Tools版本需要⼤于21.Android版本需要⾼于4.3。
UIautomator有⽐较多的类。这⾥只介绍我们在APP⾃动化测试中常⽤的三种。其中UiSelector类是在appium定位元素时会⽤到的类。
UiSelector类
⼀、UiSelector作⽤
 按照⼀定的条件(例如控件的text值,资源id),定位界⾯上的元素。UiSelector对象的最终⽬的是去构造⼀个UiObject对象。
⼆、元素定位
1、根据text定位:
函数返回
函数体说明⽤法
UiSelector text(String text)根据“控件text属性的内容”构造出UiSelector对象例如,⼀个控件text的值是“发现”,UiSelector s = new UiSelector().text("发
现");
UiSelector textContains(String text)根据“控件text属性包含的内容”构造出UiSelector对象同上例⼦:Ui
Selector s = new UiSelector().textContains("现");
UiSelector textMatches(String
regex)
进化标记根据“控件text属性正则表达式的内容”构造出UiSelector
对象
正则表达式语法参考⽹上资料即可。
UiSelector textStartsWith(String
text)根据“控件text属性开始的内容”构造出UiSelector对象同上例⼦:UiSelector s = new UiSelector().textStartsWith("发");
⽐较常⽤,准确度也⽐较⾼,中⽂查的时候,有时候text元素是中⽂的,⽐如例如,⼀个控件text的值是“发现”,UiSelector s = new UiSelector().text("发现");此时运⾏的时候可能会报错 “UiOjbectNotFoundException” ,这时候只要把项⽬的编码格式改为utf-8就可以了。
2、根据description构造:
UiSelector description(String desc)根据“控件content-desc属性的内容”构造出UiSelector对象
UiSelector descriptionContains(String desc)包含**
UiSelector descriptionMatches(String regex)正则
UiSelector descriptionStartsWith(String desc)以**开始
金属化薄膜电容器
同text的⽤法基本⼀致,也是⽐较靠谱的⼀种⽅式。
3、根据资源id:
UiSelector resourceId(String id)根据资源id获取对象,例如:UiSelector s = new UiSelector().resourceId(":id/b8m")
UiSelector resourceIdMatches(String regex)根据资源id的正则表达式获取对象
4、根据类:
  1)UiSelector className(String  className):
  根据控件的类名来到UiSelector对象。如图
  这时候会出现问题:
  因为⼀般Android布局的时候,同样的控件类名都是⼀样的。
  因此我在的登录界⾯调⽤: UiSelector s = new UiSelector().className("android.widget.TextView"),它得到的就是我左上开始算第⼀个class名称
为“android.widget.TextView”的控件。
  2)UiSelector instance (int instance):
  上⾯提到的假如我们想获取屏幕上电话号码的那个TextView使⽤这样⽅法,就可以使⽤instance:
  UiSelector s = new UiSelector().className("android.widget.TextView").instance(1);
  3)UiSelector index(int index):
  ⽤法和上⾯的instance差不多,⾕歌的原⽂说这个⽅法是unreliable的,推荐使⽤instance⽅法。
  4)UiSelector childSelector(UiSelector selector):
  有的时候假如⼦控件不好获得,⽽其⽗控件⽐较好获得的时候,我们通常采⽤这样的⽅式,例如下⾯:
  如图,LinearLayout就是ImageView和EditText的⽗控件,当⼦空间text、resource-id为空的时候,这种时候⼦控件定位⽐较困难。很明显,⽗控件id已经给定,那我们就可以先定位到⽗控件,再定位到⼦控件这种⽅法。
柿子去皮机  在它的⽗控件的childSelector⽅法中传⼊⼀个带有⼀定特征的UiSelector对象,即可得到⼦控件 
  UiObject
wx_input= new UiObject(new UiSelector().className("android.widget.RelativeLayout").childSelector(new UiSelector().className("android.widget.EditText")));   
  5)UiSelector fromParent(UiSelector selector):
  有的时候⽗控件也不好获得,⽽是同级的控件(同属⼀个parent)⽐较好获取,那么使⽤这样⽅法,还拿上⾯的举例:
制作糖果盒  我们先得到EditText的UiSelector对象:UiSelector s1 = new UiSelector().resourceId(":id/axc");
  得到和它同样⼀个⽗控件的ImageView的UiSelector对象:UiSelector s2 = fromParent( new UiSelector().className("android.widget.ImageView") );
UiObject类:安卓组件对象,类似于webdriver中的webelement队形,提供了元素的属性获取和元素的各种操作。对象有许多模拟实际操作⼿机的⽅法和属性。⽐如⽂本的编辑、点击、输⼊、⼿势操作等。
1、点击与长按
(1)相关API
返回值API说明
boolean click()点击对象
boolean clickAndWaitForNewWindow(long timeout)点击对象,等待新窗⼝出现,参数为等待超时时长
boolean clickAndWaitForNewWindow()点击对象,等待新窗⼝出现
boolean clickBottomRight()点击对象的右下⾓
boolean clickTopLeft()点击对象的左上⾓
boolean longClick()长按对象,对对象执⾏长按操作
boolean longClickBottomRight()长按对象的右下⾓
boolean longClickTopLeft()长按对象的左上⾓
(2)⽰例
new UiObject(new Selector().resourceId("xxxxx")).click();//对指定资源id的组件执⾏点击操作
2、拖拽与滑动
(1)区别
拖拽:将控件从当前位置移动到指定位置
滑动:向某⼀⽅向(上、下、左、右)移动⼀⼩段距离
(2)相关API
返回值API说明
boolean dragTo(UiObject destObj, int steps)拖拽对象到另⼀个对象位置上,步长可设置拖动的速度
boolean dragTo(int destX, int destY, int steps)拖拽对象到屏幕某个坐标位置上,步长可设置拖动速度
boolean swipeDown(int steps)拖动对象往下滑动
boolean swipeLeft(int steps)拖动对象往左滑动
boolean swipeRight(int steps)拖动对象往右滑动
boolean swipeUp(int steps)拖动对象往上滑动
3、输⼊⽂本与清除⽂本
(1)相关API
返回值API说明
boolean setText(String text)在对象中输⼊⽂本(实现⽅式:先清除⽂本再输⼊)
void clearTextField()清除编辑框中的⽂本(实现⽅式:长按再清除)
(2)补充说明
clearTextField()的内部实现⽅式是先长按⽂本框然后全选删除,导致有些编辑框⽆法通过调⽤该⽅法清除⽂本内容。这时最好⾃⼰写代码实现清除⽂本功能。⽰例代码:
//将光标移动到⾏尾,使⽤backspace进⾏逐个删除
//判断条件中w是编辑框为空时所显⽰的hint⽂本对象;当hint出现时,说明该编辑框内的⽂本已清空
while(!w.exists()){
}
4、获取对象的属性与属性的判断
(1)获取对象的属性-相关API
返回值API说明
Rect getBounds()获得对象矩形坐标,矩形左上⾓坐标与右下⾓坐标
int getChildCount()获得下⼀级⼦类数量
String getClassName()获得对象类名属性的类名⽂本
String getContentDescription()获得对象的描述属性的描述⽂本
String getPackageName()获得对象包名属性的包名⽂本
String getText()获得对象的⽂本属性中的⽂本
Rect getVisibleBounds()返回可见视图的范围,如果视图的部分是可见的,只有可见部分报告的范围
(2)获取⽗类与⼦类节点-相关API
返回值API说明
UiObject getChild(UiSelector selector)获得对象的⼦类对象,可以递归获取⼦孙当中某个对象
UiObject getFromParent(UiSelector selector)从⽗类获取⼦类,按照UiSeletor获取兄弟类(递归)
(3)属性的判断-相关API
返回值API说明
boolean isCheckable()检查对象的checkable属性是否为true
boolean isChecked()检查对象的checked属性是否为true
boolean isClickable()检查对象的clickable属性是否为true
boolean isEnabled()检查对象的enabled属性是否为true
boolean isFocusable()检查对象的focusable属性是否为true喷嘴清洗
boolean isFocused()检查对象的focused属性是否为true
boolean isLongClickable()检查对象的longclickable属性是否为true
boolean isScrollable()检查对象的scrollable属性是否为true
boolean isSelected()检查对象的selected属性是否为true
5、⼿势的操作
(1)⼿势相关操作
两指平移
多指平移
两指合拢 o---> <---o
两指扩张 <---oo--->
(2)相关API
返回值API说明
boolean performMultiPointerGesture(PointerCoords[]... touches)执⾏单⼿指触控⼿势,可定义任意⼿势,与形
boolean performTwoPointerGesture(Point startPoint1, Point startPoint2,
Point endPoint1, Point endPoint2, int steps)
执⾏任意两个⼿指触控⼿势,模拟两个⼿指⼿
boolean pinchIn(int percent, int steps)⼿势操作,两点向内收缩
boolean pinchOut(int percent, int steps)⼿势操作,两点向外张开
6、判断对象是否存在
(1)相关API
返回值API说明
boolean waitForExists(long timeout)等待对象出现
boolean waitUntilGone(long timeout)等待对象消失
boolean exists()检查对象是否存在
UiDevices类:提供了⼀些列⽅法和属性来模拟在⼿机上的实际操作,获取设备信息:屏幕分辨率、选装状态、亮屏、灭屏...操作:按键、坐标操作、滑动、拖拽、截图⼀、UiDevice类简介
1、UiDevice代表设备状态。如屏幕的⼤⼩、旋转⽅向、按压各种按键等。
2、UiDevice为单例模式,可有2种⽅式获取其实例。
(1)Instance();--->推荐
(2)getUiDevice.pressHome();---->在类A中封装⽅法,⽅法被类B调⽤的时候会出现空指针异常
3、主要功能
(1)获取设备信息:屏幕分辨率、选装状态、亮灭屏......
(2)操作:按键、坐标操作、滑动、拖拽、截图......
(3)功能
⼆、按键与KEYCODE使⽤
1、点击按键相关API
UiDevice实例调⽤以下⽅法即可实现点击按键操作。
返回值⽅法名描述
boolean pressBack()模拟短按返回back键
boolean pressDPadCenter()模拟按轨迹球中点按键
boolean pressDPadDown()模拟轨迹球向下按键
boolean pressDPadLeft()模拟轨迹球向左按键
boolean pressDPadRight()模拟轨迹球向右按键
boolean pressDPadUp()模拟轨迹球向上按键
boolean pressDelete()模拟短按删除delete按键
boolean pressEnter()模拟短按回车键
boolean pressHome()模拟短按HOME键
boolean pressKeyCode(int keyCode, int metaState)模拟短按键盘代码keycode
boolean pressKeyCode(int keyCode)模拟短按键盘代码keycode
boolean pressMenu()模拟短按menu键
boolean pressRecentApps()模拟短按最近使⽤程序boolean pressSearch()模拟短按搜索键
2、KEYCODE 键盘映射码
(1)KeyEvent:按键事件,每个键盘映射码都保存在keyEvent的常量中。
(2)META Key
<1>辅助功能键: ALT、SHIFT、CAPS_LOCK
<2>辅助功能键的状态
激活状态metaState
base META_key未被激活0
caps SHIFT或CAPS_LOCK被激活时1
fn ALT被激活2
caps_fn ALT,SHIFT或CAPS_LOCK同时被激活
3
<3>⽰例
三、获取坐标与坐标点击
1、坐标相关知识
(1)⼿机屏幕坐标:从左上⾓(0,0)开始到右下⾓(X,Y)
(2)dp:设备独⽴像素,例如,320像素显⽰到640像素上要拉伸⼀倍
(3)Point:代表⼀个点(x,y)
2、坐标相关API
UiDevice实例调⽤以下⽅法即可实现获取坐标和点击操作。
返回值⽅法名描述
boolean click(int x, int y)使⽤坐标点击屏幕
int getDisplayHeight()获取屏幕⾼度
Point getDisplaySizeDp()获取显⽰尺⼨返回显⽰⼤⼩(设备独⽴像素);屏幕旋转返回的显⽰⼤⼩调整
int getDisplayWidth()获得屏幕宽度
3、Uiautomator Viewer
(1)功能:获取屏幕快照,并通过快照获取到控件的属性。
(2)启⽤⽅式
⽅式⼀、启动路径:adt/sdk/tools/UiautomatorViewer
⽅式⼆、Eclipse/DDMS/Devices/UiautomatorViewer
(3)屏幕快照参数之控件坐标
通过UiautomatorViewer获取屏幕快照,选中⽬标控件,通过Node Detail / bounds[左上⾓顶点坐标][右下⾓顶点坐标] 可获取到控件的位置。
4、⽰例
(1)
(2)
int h = Instance().getDisplayHeight();
int w = Instance().getDisplayWidth();
(3)
UiObject object = new UiObject(soutceId("控件Id"));//根据ID获取控件

本文发布于:2024-09-23 12:24:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/102776.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   属性   控件   获取   屏幕   坐标
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议