UiAutomator2.0 - 获取同行控件
问题:
UI测试时,在同一个界面出现相同的属性的控件(如图),对于这种控件的获取很是无奈。如果直接通过控件id去查找的话总是会返回界面该类型的第一个控件。

解决:
1.UiObject2 中已经给出了解决方法,可以通过 getParent()方法处理。缺点:由于UiObjec2t控件与视图进行绑定,当视图变化后该控件对象就被销毁了。所以多次使用则非常不便利
@Test
public void testCase_Btn(){
       UiObject2 switchBtn = device.findObject(By.text("Automatic 24‑hour format"))
               .getParent().getParent().findObject(By.res("android:id/switch_widget"));
       if(switchBtn.isChecked()){
           switchBtn.click();
       }
       assertTrue("switch btn is open", !switchBtn.isChecked());
}
2.UiObject中通过id + instance 去能查找到控件,但是界面变动的话脚本也得变动,可靠性不强。只能采取折中的方式来获取了。不多说,直接上代码。
UiObject switchBnt3 = device.findObject(new UiSelector().resourceId("android:id/switch_widget").instance(2));
测试类:
@Test
public void testCase_Btn() throws UiObjectNotFoundException {
       UiObject timeFormat = device.findObject(new UiSelector().text("Automatic 24‑hour format"));
       UiObject switchBtn = ControlObj.getUiObject(timeFormat);
       if(switchBtn.isChecked()){
           switchBtn.click();
       }
       assertTrue("switch btn is open", !switchBtn.isChecked());
}
帮助类:
package com.zzw.commonutils.commons;
import android.graphics.Rect;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiCollection;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObjectNotFoundException;
import android.support.test.uiautomator.UiSelector;
import android.util.Log;
/**
 * @author zzw
 */
public class ControlObj {
    private static final String TAG = ControlObj.class.getSimpleName();
    public static UiObject getUiObject(UiObject obj) throws UiObjectNotFoundException {
        UiCollection list = new UiCollection(new UiSelector().resourceId("com.android.settings:id/list"));
        UiObject switchBtn = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
                .findObject(new UiSelector().resourceId("android:id/switch_widget"));
        return getUiObject(list, obj,switchBtn );
    }
    /**
     * 获取同行的控件
     * @param uic UiCollection
     * @param uio The same row UiObject as the target UiObject
     * @param uio2 Target UiObject
     * @return An UiObject
     * @throws UiObjectNotFoundException maybe can't find UiObject
     */
    public static UiObject getUiObject(UiCollection uic, UiObject uio, UiObject uio2) throws UiObjectNotFoundException {
        UiObject obj = null;
        UiSelector uis = uio2.getSelector();
        Log.i(TAG, "getUiObject: "+  uic.getChildCount(uis));
        for(int i=0; i< uic.getChildCount(uis); i++){
            UiObject uiObject = uic.getChildByInstance(uis, i);
            boolean result = isSameLine(uio, uiObject);
            Log.i(TAG, "getUiObject: "+result );
            if(result){
                obj = uiObject;
                break;
            }
        }
        if(obj == null){ throw new RuntimeException("Get "+ uio.getSelector()+" same line UiObject error");}
        return obj;
    }
    /**
     * 判断两个控件是否在同一行
     * @param obj1 UiObject 1
     * @param obj2 UiObject 2
     * @return return true, if is same line
     * @throws UiObjectNotFoundException maybe can't find UiObject
     */
    private static boolean isSameLine(UiObject obj1, UiObject obj2) throws UiObjectNotFoundException {
        Rect first = obj1.getBounds();
        Rect second = obj2.getBounds();
        Log.i(TAG, "isSameLine: f:"+ first + ", s"+second);
        // 比较区域
        return first.top< second.bottom && first.bottom > second.top ;
    }
}
UiAutomator2.0 - 获取同行控件的更多相关文章
- Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件
		这篇的内容非常easy,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个button分别命名了吧? 如今要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http ... 
- 获取android控件的高度
		问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ... 
- .net获取select控件中的文本内容
		.net获取select控件中的文本内容 2009-11-28 21:19小V古 | 分类:C#/.NET | 浏览1374次 <select id="SecType" st ... 
- 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector
		[源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ... 
- WPF:获取DataGrid控件单元格DataGridCell
		转载:http://blog.csdn.net/jhqin/article/details/7645357 /* ------------------------------------------- ... 
- 巧用Handler获取View控件信息
		众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ... 
- C# 获取往控件中拖进的文件或文件夹的信息
		C# 获取往控件中拖进的文件或文件夹的信息(原创) 在做C#的WinForm开发的时候,有时需要用户往指定的控件中拖进文件或者文件夹.然后根据用户拖进来的文件或者文件夹获取其信息并进行下一 ... 
- Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
		核心 : /// 获取 子控件高度 func sizeHeaderToFit(view:UIView) { view.setNeedsLayout() view.layoutIfNeeded() le ... 
- 获取IE (控件)的所有链接(包括Frameset, iframe)
		获取IE (控件)的所有链接(包括Frameset, iframe) IE 顶层 body 节点通过IHTMLElement->get_all 方法无法获取iframe 里面的节点列表 CCom ... 
随机推荐
- Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
			题意:博弈题面 给出一个数字序列 (>=11) 有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手 数字序列一定是奇 ... 
- 【CF1063F】String Journey 哈希
			题目大意 给你一个字符串 \(s\),让你找出最大的 \(k\),满足:能从 \(s\) 中选出 \(k\) 个不重叠的字符串 \(t_1,t_2,\ldots,t_k\),且 \(\forall i ... 
- 拆系数FFT
			学习内容:国家集训队2016论文 - 再谈快速傅里叶变换 模板题:http://uoj.ac/problem/34 1.基本介绍 对长度为L的\(A(x),B(x)\)进行DFT,可以利用 \[ \b ... 
- abp添加动态菜单
			abp中MenuDefinition封装了导航栏上的主菜单的属性,MenuItemDefinition则封装了子菜单的属性,子菜单可以引用其他子菜单构成一个菜单树. MenuDefinitio成员如下 ... 
- laravel 读写分离源码解析
			前言:上一篇我们说了<laravel 配置MySQL读写分离>,这次我们说下,laravel的底层代码是怎样实现读写分离的. 一.实现原理 说明: 1.根据 database.php ... 
- JS学习笔记Day18
			一.轮播图 二.重力弹球 三.计时器 
- openvpn搭建
			以ubuntu系统为例: 1.安装openvpn和easy-rsa,easy-rsa主要用来设置CA(证书颁发机构) $ sudo apt-get update $ sudo apt-get inst ... 
- express起一个代理服务器,webpack-dev-server同时起多个
			由于系统业务比较复杂,微前端(多页应用)实现期望用一个app一个webpack的形式,这样可以更好隔离,而且每个app的webpack config可以定制. Nginx在前端项目中安装比较麻烦,所以 ... 
- Unity历史
			Unity历史 2004年诞生于丹麦阿莫斯特 2005年06月:Unity 1.0发布 2006年06月:Unity 1.5发布 2007年10月:Unity 2.0发布,增加地形引擎.实时动态阴影, ... 
- Python高级笔记(五)--实例方法、静态方法和类方法
			1. 类属性.实例属性 类属性在内存中只保存一份 实例属性在每个对象中都要保持一份 obj.__class__.country="xxx": 可以修改类属性 2. 实例方法.静态方 ... 
