一、点击与长按
1.组件区域位置关系:
Rect 对象代表一个矩形区域:[left,Top][ARight,Bottom](即左上角图标到右下角图标)
2.点击与长按相关API:
返回值 | API | 说明 |
---|---|---|
boolean | click() | 点击对象 |
boolean | clickAndWaitForNewWindow(long time out) | 点击对象,等待新窗口出现,参数为等待超时时常 |
boolean | clickAndWaitForNewWindow() | 点击对象,等待新窗口出现(默认超时5.5s) |
boolean | clickBottomRight() | 点击对象的右下角 |
boolean | clickTopLeft() | 点击对象的左上角 |
boolean | longClick() | 对对象执行长按操作 |
boolean | longClickBottomRight() | 长按对象的右下角 |
boolean | longClickTopLeft() | 长按对象的左上角 |
例如:
public void testDemo1() throws UiObjectNotFoundException{ UiObject clock=new UiObject(new UiSelector() .resourceId("com.android.deskclock:id/analog_appwidget")); clock.click();//点击对象中点 UiDevice.getInstance().pressBack(); clock.clickAndWaitForNewWindow(10000);//点击对象,等待新窗口出现,时间为10s UiDevice.getInstance().pressBack(); clock.clickAndWaitForNewWindow();//点击对象,等待新窗口出现,时间为默认时间5.5s UiDevice.getInstance().pressBack(); clock.clickBottomRight();//点击右下角 UiDevice.getInstance().pressBack(); clock.clickTopLeft();//点击左上角 UiDevice.getInstance().pressBack(); clock.longClick();//长按(如果想要增加长按时间可以使用swipe)}
二、拖拽与滑动
//可以拖拽到一个点或一个组件上;可以上下左右滑动一段距离
1.拖拽与滑动相关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) | 拖拽对象向上滑动 |
例如:
public void testDemo2() throws UiObjectNotFoundException, RemoteException{ UiObject object1=new UiObject(new UiSelector().text("相机")); //将对象拖拽到指定坐标 object1.dragTo((128-64)/2+64,417-100, 20); //将对象拖拽到指定对象位置上 UiObject object2=new UiObject(new UiSelector().text("短信")); object1.dragTo(object2, 5);//补偿越短越容易出现两个对象互换位置的情况 //swipe(杀进程操作演示) UiDevice.getInstance().pressRecentApps();//点开最近使用程序员 UiObject object3=new UiObject(new UiSelector() .resourceId("com.android.systemui:id/app_thumbnail_image")); object3.swipeLeft(10);//向左滑动关闭进程}
三、输入文本与清除文本
返回值 | API | 说明 |
---|---|---|
boolean | setText(String text) | 在对象中输入文本(只能输入英文) |
void | clearTextFiled() | 清除编辑框中的文本 |
示例一:
public void testDemo3() throws UiObjectNotFoundException{ UiObject setText=new UiObject(new UiSelector() .resourceId("com.android.mms:id/embedded_text_editor")); setText.setText("123abc");//输入文本 sleep(2000); setText.clearTextField();//清除文本}
注意事项:
1.他的输入步骤是先长按来选中要输入的文本框,然后输入文本,但是若在文本框已有文本的情况下输入文本会丢失原文本,也就是说他会先长按要输入的文本框,这样就执行了全选操作,然后再进行输入文本的操作,这样原先的文本就没有了
2.他的清除步骤是先长按来全选文本—然后点Del键
3.可能不同的输入框会出现不同的情况,解决方法参考示例二
示例二:
public void testDemo3() throws UiObjectNotFoundException{ //获取接收者 UiObject i=new UiObject(new UiSelector() .resourceId("com.android.mms:id/recipients_editor")); UiObject i1=new UiObject(new UiSelector().text("接收者")); i.setText("iiiiiiiiii");//输入文本"iiiiiiii" //将光标移动至行尾,然后循环删除,直至文本框变为默认的"接受者"为止 while (!i1.exists()){ UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_DEL); }}
四、获取对象属性与属性判断
1.获取对象的属性
返回值 | API | 说明 |
---|---|---|
Rect | getBounds() | 获得对象矩形坐标,矩形左上角坐标与右下角坐标 |
int | getChildCount() | 获得下一级子类数量 |
String | getClassName() | 获得对象类名属性的类名文本 |
String | getContentDescription() | 获得对象的描述属性的描述文本 |
String | getPackageName() | 获得对象包名属性的包名文本 |
String | getText() | 获得对象的文本属性中的文本 |
Rect | getVisibleBounds() | 返回可见视图的范围,如果视图部分是可见的,只有可见部分报告的范围 |
例如:
public void testDemo4() throws UiObjectNotFoundException{ // 获取信息栏的好友框 UiObject i=new UiObject(new UiSelector().resourceId("com.android.mms:id/recipients_editor")); String rec=i.getText();//获取文本 System.out.println("Text is : "+rec);//输出文本 assertEquals("接收者", rec);//对比文本(预期值,实际值) System.out.println("Class name is : "+i.getClassName());//输出并输出类名 System.out.println("Child cound is : "+i.getChildCount());//输出下一级子类数量 System.out.println("Bound left is : "+i.getBounds().left);//输出对象矩形左坐标 System.out.println("Content description is : "+i.getContentDescription());//输出对象的描述属性的描述文本 System.out.println("Package name is : "+i.getPackageName());//输出对象包名 System.out.println("Visible bounds right is : "+i.getVisibleBounds().right);//输出可见范围的右边视图}
2.获取父类与子类节点
返回值 | API | 说明 |
---|---|---|
UiObject | getChild(UiSelector selector) | 获得对象的子类对象,可以递归获取子孙当中某个对象 |
UiObject | getFromPrent(UiSelector selector) | 从父类获取子类,按照UiSelector获取兄弟类(递归) |
例如:
public void testDemo5() throws UiObjectNotFoundException{ //getChild() //定位父类 UiObject down =new UiObject(new UiSelector() .resourceId("com.cyanogenmod.filemanager:id/navigation_view_details_item") .index(3)); //定位子类 UiObject download=down.getChild(new UiSelector() .resourceId("com.cyanogenmod.filemanager:id/navigation_view_item_name")); //点击 download.click(); sleep(2000); UiDevice.getInstance().pressBack(); //getFromParent() 定位兄弟父类 UiObject down =new UiObject(new UiSelector() .resourceId("com.cyanogenmod.filemanager:id/navigation_view_details_item") .index(3)); //定位要点击的父类的兄弟类 UiObject music=down.getFromParent(new UiSelector() .resourceId("com.cyanogenmod.filemanager:id/navigation_view_details_item") .index(5)); //点击 music.click();}
3.属性的判断
返回值 | 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 |
例如:
public void testDemo6() throws UiObjectNotFoundException{ //找到对象 UiObject wlan=new UiObject(new UiSelector() .resourceId("com.android.settings:id/switchWidget") .instance(0)); //如果wlan.isCheckable()为false则开启 if(!wlan.isCheckable()){ wlan.click(); }}
五、手势的操作
1.手势操作相关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) | 手势操作,两点向外张开(百分比,步数) |
例如:
public void testDemo7() throws UiObjectNotFoundException{ //选中被操作目标 UiObject web=new UiObject(new UiSelector().className("android.widget.FrameLayout")); web.pinchOut(80, 20);//以20步的速度两点向外扩张80%(也就是放大) sleep(2000); web.pinchIn(80, 20);//以20步的速度两点向内扩张80%(也就是缩小) //声明变量 Point startPoint1,startPoint2,endPoint1,endPoint2; startPoint1 = new Point(); startPoint2=new Point(); endPoint1=new Point(); endPoint2=new Point(); //自定义起点区域 startPoint1.x=15;startPoint1.y=156; startPoint2.x=30;startPoint2.y=173; //自定义终点区域 endPoint1.x=215;endPoint1.y=156; endPoint1.x=230;endPoint1.y=173; //模拟两个手指从左向右滑动 web.performTwoPointerGesture(startPoint1,startPoint2,endPoint1,endPoint2,20);}
六、判断对象是否存在
1.判断对象是否存在相关API
返回值 | API | 说明 |
---|---|---|
boolean | waitForExists(long timeout) | 等待对象出现 |
boolean | waitUntilGone(long timeout) | 等待对象消失 |
boolean | exists() | 检查对象是否存在 |
例如:
public void testDemo8() throws UiObjectNotFoundException{ //点击联系人--判断是否有联系人,没有则创建联系人 //获取联系人对象 UiObject LianXiRen=new UiObject(new UiSelector().text("联系人")); //判断联系对象是否存在,如果存在则点击 if(LianXiRen.exists()){ LianXiRen.click(); } UiObject create=new UiObject(new UiSelector().text("创建新联系人")); //等待5秒判断是否有[创建新联系人]按钮,如果有则说明界面内没有联系人 if(create.waitForExists(5000)){ System.out.println("没有联系人,需要创建"); create.click(); } //开始创建步骤...}