UiAutomator for android 巧换角度
2015-06-02 15:50
465 查看
本文章主要描述UIAutomator测试中遇到子节点无法寻觅到父节点的问题
1. 问题描叙
我在一个示例项目中引用到了UIAutomator测试,在一个动态listView中,要点击5:00下的item选项,并且其中的test都是动态生成的(即不可用text属性获取控件),且无desc属性。为了适应多种分辨率坐标属性也不可用(系统获取除外)。要分别点击到图片,和内容。
![](http://img.blog.csdn.net/20150602153452269)
二图是一个布局示意图:
![](http://img.blog.csdn.net/20150602153238280)
2.常规思路
一般遇到这种问题,我的的常规想法,是事先通过.text(“5:00”)来获取此对象object(图中深色区域),然后通过object.getFromParent(selector)来获取父亲布局对象,再向上寻根得到最外的布局maxfatherObject,再由在外的父节点向下搜索,到满足条件的子孙节点。maxfatherObject.getChild(selector),事实上由于是自定义的模板,Id都是复用的,失去唯一性。另外还可能其他时间线也可能存在item,所以最大布局的index不能作为确定的参数。
第3行代码仅依靠classname是无法定位当前对象的,系统会默认为listView的第一个index=0的布局,这样造成的结果是,系统报错not found exception.
3.另寻它径
我们可以通过 .scrollIntoView(object); 从list中找到时间线,然后拖到ListView最上边,这可以通过rect来系统获取list在屏幕中的四个顶点的坐标,即只需要包时间线的Y坐标和list顶点坐标一致即可,然后就可以通过id来定位到具体控件了,如果一个时间线上存在多个在窗口内的item,我们就可以用classname结合instance(或index)来定位,再找到相应的子控件了,在这就不一一讨论了.
下面是具体代码:
3.其他
写此文,仅为和大家相互学习,如果有牛大大,请多多指点,欢迎私聊,勿口水战.
1. 问题描叙
我在一个示例项目中引用到了UIAutomator测试,在一个动态listView中,要点击5:00下的item选项,并且其中的test都是动态生成的(即不可用text属性获取控件),且无desc属性。为了适应多种分辨率坐标属性也不可用(系统获取除外)。要分别点击到图片,和内容。
二图是一个布局示意图:
2.常规思路
一般遇到这种问题,我的的常规想法,是事先通过.text(“5:00”)来获取此对象object(图中深色区域),然后通过object.getFromParent(selector)来获取父亲布局对象,再向上寻根得到最外的布局maxfatherObject,再由在外的父节点向下搜索,到满足条件的子孙节点。maxfatherObject.getChild(selector),事实上由于是自定义的模板,Id都是复用的,失去唯一性。另外还可能其他时间线也可能存在item,所以最大布局的index不能作为确定的参数。
1. UiScrollable mtime = new UiScrollable(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_time_item_tv_time_value").text("5:00")); 2. UiObject father = mtime.getFromParent(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_time_item_title_panel")); 3. UiObject maFather = father.getFromParent(new UiSelector().className("android.widget.RelativeLayout")); 4. UiObject sonlay = mafather.getChild(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_time_item_content_panel").index(1)); 5. sonlay.click();
第3行代码仅依靠classname是无法定位当前对象的,系统会默认为listView的第一个index=0的布局,这样造成的结果是,系统报错not found exception.
3.另寻它径
我们可以通过 .scrollIntoView(object); 从list中找到时间线,然后拖到ListView最上边,这可以通过rect来系统获取list在屏幕中的四个顶点的坐标,即只需要包时间线的Y坐标和list顶点坐标一致即可,然后就可以通过id来定位到具体控件了,如果一个时间线上存在多个在窗口内的item,我们就可以用classname结合instance(或index)来定位,再找到相应的子控件了,在这就不一一讨论了.
下面是具体代码:
public void testfindItem() throws UiObjectNotFoundException{ UiScrollable scroll =new UiScrollable(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_content_list")); UiObject mtime = new UiObject(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_time_item_tv_time_value").text("6:00")); scroll.scrollIntoView(mtime); sleep(4000); Rect lr=scroll.getVisibleBounds(); //Rect(int left,int top,int right,int bottom; int x1 = lr.left; int y1 = lr.top; head.dragTo(x1+1, y1, 80) ; System.out.println("默认最大滚动次数:"+scroll.getMaxSearchSwipes()); sleep(3000); UiObject pic = new UiObject(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_time_workorder_item_layout_iv_image")); UiObject content = new UiObject(new UiSelector().resourceId("com.starlight.mobile.android.ama:id/calendar_day_time_workorder_item_layout_rl_content")); pic.click(); sleep(5000); UiDevice.getInstance().pressBack(); sleep(5000); content.clickAndWaitForNewWindow(); sleep(5000);
3.其他
写此文,仅为和大家相互学习,如果有牛大大,请多多指点,欢迎私聊,勿口水战.
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories