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 ...
随机推荐
- Cordova Upload Images using File Transfer Plugin and .Net core WebAPI
In this article, I am going to explain ,"How to Upload Images to the server using Cordova File ...
- Spring MVC 使用介绍(十四)文件上传下载
一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...
- 加载hive-jdbc driver时报错:java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
这是因为缺少一个hadoop-common包,引入即可: <dependency> <groupId>org.apache.hadoop</groupId> < ...
- Day 1 下午
POINT 1 贪心 每一步都取当前的最优解的思想:一般来说符合直观思路,需要严格的证明:OI中使用多个错误的贪心策略进行加成有时会有良好的效果 例一给定N个农民,第i个农民有Ai单位的牛奶,单价Pi ...
- 简单实现SSO
方案一:原理:基于SSO Server 端的登录情况,跳转至SOO-client的各个端. 每次返回一个 ticker 随机票据值识别. 配置服务端 执行 :git clone https://git ...
- JSSDK调用微信原生的功能上传图片保存到自己的服务器中
第一件事首先是微信的选择图片功能,就是微信发朋友圈选择图片的时候那个界面 //调用微信拍照功能 wx.chooseImage({ count: 1, // 默认9 sizeType: ['origin ...
- CF1155E Guess the Root
题意:交互,有一个10次多项式,你可以询问50次当x为某个取值时多项式的值.你需要回答这个多项式的零点. 解:询问11个数然后高斯消元解方程得出系数.然后枚举定义域看有无0点. #include &l ...
- 第七周java学习总结
学号 20175206 <Java程序设计>第七周学习总结 教材学习内容总结 第八章: 主要内容 String类 StringTokenizer类 Scanner类 StringBuffe ...
- 基于前后端分离的Nginx+Tomcat动静分离
1.什么是动静分离 "动"与"静" 在弄清动静分离之前,我们要先明白什么是动,什么是静. 在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就 ...
- axios传参
get //通过给定的ID来发送请求 axios.get('/user?ID=12345') .then(function(response){ console.log(response); }).c ...