Robotium之Android控件定位实践和建议
本人之前曾经撰文描述Appium和UIAutomator框架是如何定位Android界面上的控件的。
UIAutomator定位Android控件的方法实践和建议
Appium基于安卓的各种FindElement的控件定位方法实践和建议
今天我们换一个渊源更留长,当今更盛行的框架Robotium,实践下看它又是如何对控件进行定位的。
1. 背景
为保持这个系列的一致性,我们继续用SDK自带的NotePad实例应用作为我们的试验目标应用,但是这次不仅仅是像以前一样主要围绕Menu Option里面的那个"Add note”控件进行定位,而是会设计到NotePad上的多个不同的控件定位。但主要围绕的还是Notepad的NotesList这个Launchable activity了,下面先看下UIAutomatorViewer下面捕获的我们会涉及到的不同界面吧。 NotesList Activity的第一个页面列表中会包含note3到note9的笔记
NoteList Activity往下拉后还会看到有note1到note2以及两个重复的名称为note的笔记
点击系统的menu后会出现“Add note”这个menu entry供我们测试验证用
2. 通过控件的文本信息text进行定位
Robotium里面的很多方法都支持直接输入text作通ky"http://www.it165.net/qq/" target="_blank" class="keylink">qqyzsr9vfjQ0LLZ1/ejrLHIyOdjbGlja09uVGV4dKOsY2xpY2tMb25nT25UZXh0tcijrM2ouf10ZXh0wLSy6dXSv9i8/srH1+6/7L3dz9S2+NLXvPu1xKGjCtLUz8LO0sPH08NjbGlja09uVGV4dNLUvLDG5NbY1Ni3vbeovfjQ0Mu1w/ejrMbky/u1xNLUdGV4dLe9yr2y6dXStcS3vbeowOAmIzIwMjg0O6OoztLDx7WxyLvSsr/J0tTWsb3TtffTw1NvbG8uY2xpY2tPbkJ1dHRvbihTdHJpbmcgdGV4dCnAtM/e1sbWu82ouf10ZXh0t723qMC0sunV0mJ1dHRvbr/YvP7Byymhowo8aDQ+Mi4xU29sby5jbGlja09uVGV4dChTdHJpbmcgdGV4dCk8L2g0Pgo8aDM+Mi4xLjEgyr7A/TwvaDM+CjxwcmUgY2xhc3M9"brush:java;"> solo.clickOnText("^note$"); assertTrue(solo.searchText("^note$"));
找到第一个text绝对等于note的控件并进行点击。
2.1.2 分析和建议
以上示例有两点需要指出来引起注意的: Robotium会自动往下滚动直到定位到目标控件为止:这就是为什么以上示例不用先进行scrolldown动作就可以直接查找到在第二个页面的“note”的原因Robotium如果查找到的满足条件的控件多于一个的话,默认会返回第一个Robotium根据text进行控件定位的时候默认就是支持用正则表达式的 比如把以上例子改成下面就会断言失败:
1.
solo.clickOnText(
"note"
);
2.
assertTrue(solo.searchText(
"^note$"
));
在这里点击的将会列表最上面的日记,在我们的例子中就是“note9”。为什么呢?因为note1到note9以及note都包含了“note”这个text,而以上代码中的参数在正则表达式中的意思是“查找文本中包含note字串的控件进行点击”。所以我们必须把它改成"^note$"以精确查找text绝对等于note的控件。 那么如果这样子还是有重复的控件怎么办呢?请往下看。
2.2 Solo.clickOnText(String text, int match)
2.2.1 示例
1.
solo.clickOnText(
"^note$"
,
2
);
2.
assertTrue(solo.searchText(
"^note$"
));
2.2.2 解析
如果通过text查找回来的控件有超过一个,那么我们可以在基于1的基础上从左到右自上往下的顺序指定需要的是第几个控件。
2.3 Solo.clickOnText(String text, int match, boolean scroll)
2.3.1 示例
1.
solo.clickOnText(
"^note2$"
,
1
,
false
);
2.
assertTrue(solo.searchText(
"^note2$"
));
2.3.2 解析
最后一个参数是指定是否自动scrolldown去查找控件。
3. ListView子控件定位
如果要定位的控件是在一个ListView里面的,那么除了可以使用以上的text方式进行定位之外,我们还可以通过指定控件在该ListView的地几行进行定位。
3.1Solo.clickInList(int line):指定行数进行定位
3.1.1 示例
1.
solo.clickInList(
2
);
2.
assertTrue(solo.searchText(
"^note8$"
));
3.1.2 解析
点击第一个ListView的第2行。那么如果界面有多于一个ListView怎么办呢?那么就要看下面这个方法了。
3.2 Solo.clickInList(int line, int index):同时指定第几个ListView的第几行进行定位
3.2.1 示例
1.
solo.clickInList(
2
,
0
);
2.
assertTrue(solo.searchText(
"^note8$"
));
3.2.2 解析
其中第一个参数是行数,第二个参数指的是第几个ListView,按照我的经验,就是基于1,界面从左到右从上到下的顺序这个ListView所处的位置。
4. ActionBar控件定位
Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器。它可以作为活动的标题,突出活动的一些关键操作(如“搜索”、“创建”、“共享”等)、作为菜单的灵活使用,还可以实现类似TabWidget的标签功能以及下拉导航的功能,系统能够很好根据不同的屏幕配置来适应ActionBar的外观。因为在NotePad中没有实现ActionBar功能,所以我们这章节使用的是小米自带的便签进行描述说明。
4.1 Solo.clickOnActionBarHomeButton()
该方法的目的就是点击ActionBar左上角的Home或者Up的icon导航到上一页
4.2 Solo.clickOnActionBarItem(int id)
参数整型id指的是R.id,也就是说项目工程中的R.java里面的id。
5. 通过控件的排列顺序来定位
在上面的3.2.2章节我们已经体验过如何通过指定第几个ListView来定位控件了。事实上很多控件都可以通过指定控件在界面上的排列顺序来定位,就以click相关的方法为例子,我们就可以找出以下这些针对不同控件的排列顺序来定位的方法 Solo.clickOnButton(int index)
Solo.clickOnCheckBox(int index);
Solo.clickOnEditText(int index)
Solo.clickOnImage(int index)
Solo.clickOnImageButton(int index)
Solo.clickOnRadioButton(int index)
这种定位方式如同MonkeyRunner通过坐标点进行定位的方式一样存在局限性,很大一个就是当界面控件顺序有调整的时候就要立刻进行测试代码的维护更新。
5.1 示例
1.
solo.clickLongOnTextAndPress(
"note9"
,
2
);
2.
solo.clickOnButton(
0
);
5.2 分析
以上代码所做的事情就是 长按note9那个笔记
在弹出menu中选择由0数起的第2个menu entry,也就是“Edit Title”点击界面从左到右由上往下由0数起的第0个Button,也就是“ok“这个Button
6. 通过控件的内部属性来定位
以上获取控件的方式和操作该控件都是在一个方法中就实现了的,其实Robotium也支持先获得控件,然后再针对控件慢慢进行操作了。 Robotium的Solo类中有一些列getView的重载方法就是专门做这个事情的。但是不像UIAutoamtor和Appium支持用众多的控件内部属性判断是否是目标控件,Robotium只支持通过两种控件内部属性来定位控件: ResrouceId:可以是字符串类型(通过UIAutomatorViewer获得)也可以是整型(通过R.java文件获得)ClassName:控件的Class(可以通过UIAutomatorViewer获得),不过注意不是字符串,而是真实的class
这里我们用getView来作为一个例子来说明如何通过控件内部属性获得控件,以起到一个抛砖引玉的左右。当然除了getView,Robotium还支持其他的入getViews,getCurrentViews等方法,但原理一致,就不累述了。
6.1 Solo.getView(String/int id,[int index])
6.1.1 示例
1.
View view =
null
;
2.
view = solo.getView(
"android:id/text1"
,
1
);
3.
solo.clickOnView(view);
6.1.2 分析
这段代码所做的事情就是去获得从0数起的第1个ResourceId为”android:id/text1"的控件。
这里为什么需要填写index呢?其实我们要注意Android的Activity下面的控件的ResourceId是允许重复的,比如NotePad上面的ListView里面的每一个Note的ResourceId其实都是"android:id/text1".所以这种情况下我们必须穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq808nPaW5kZXjAtMf4t9a/qs7Sw8fQ6NKqtcTKx7XavLi49m5vdGWhowqxyMjn0tTPwrT6wuu1w7W9tcS9q8rHTGlzdFZpZXfA78PmtcS12tK7uPZOb3RlCjxwcmUgY2xhc3M9"brush:java;"> View view = null; view = solo.getView("android:id/text1"); solo.clickOnView(view);
6.2 Solo.getView(Class<T> viewClass, int index)
6.2.1 示例
1.
View view =
null
;
2.
3.
view = solo.getView(TextView.
class
,
1
);
4.
solo.clickOnView(view);
1.
点击从
0
开始的第
1
个TextView类型的控件,也就是下图中的note4。按照从左到右自上往下的顺序,<span style=
"font-family: Arial, Helvetica, sans-serif;"
>这里的第
0
个是ListView的Title名称为Notes的 那个TextView:</span>
1.
<span style=
"font-family: Arial, Helvetica, sans-serif;"
><img src=
"http://img.blog.csdn.net/20141004182018767?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh3YmFpdGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"
alt=
""
/>
2.
</span>
6.2.2 解析
注意这里的类名viewClass和UIAutomator(New UiSelector().className(String className))以及Appium(AppiumDriver.findElementByClassName(String className))的通过className查找时填写的类的格式和类型是不一样的,就以TextView为例: Robotium :Class类型 || 不需要FQCN(也就是不需要写成andoid.widget.Textview,这在UIAutomator和Appium中是必须的)UIAutomator: String类型 || FQCNAppium :String类型 || FQCN
7 无需定位的控件
我们常用到的两个系统控件是不需要定位的,一个是系统的Menu键,一个是系统的goBack。但是注意Menu下面的Menu Entry还是需要定位的,比如我们例子中的”Add note“这个Menu Entry。
8 还有吗?
以上列出了Robotium中对本人当前最重要的获取控件的方法,当然Solo里面还有一些其他的方法,但不是容易理解就是现在用不上,所以就不一一陈述了 通过坐标点操作控件 :容易理解,就是获得坐标点然后点击屏幕坐标。获取和操作WebView控件 :现在用不上,到时有用到了再去深究还有其他吗?
Robotium之Android控件定位实践和建议的更多相关文章
- Robotium之Android控件定位实践和建议(Appium/UIAutomator姊妹篇)
本人之前以前撰文描写叙述Appium和UIAutomator框架是怎样定位Android界面上的控件的. UIAutomator定位Android控件的方法实践和建议 Appium基于安卓的各种Fin ...
- 转载:Robotium之Android控件定位实践和建议(Appium/UIAutomator姊妹篇)
来源于:http://blog.csdn.net/zhubaitian/article/details/39803857 1. 背景 为保持这个系列的一致性,我们继续用SDK自带的NotePad实例应 ...
- MonkenRunner通过HierarchyViewer定位控件的方法和建议(Appium/UIAutomator/Robotium姊妹篇)
1. 背景 在使用MonkeyRunner的时候我们经常会用到Chimchat下面的HierarchyViewer模块来获取目标控件的一些信息来辅助我们测试,但在MonkeyRunner的官网上是没有 ...
- 【转】UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)
原文地址:http://blog.csdn.net/zhubaitian/article/details/39777951 在本人之前的一篇文章<<Appium基于安卓的各种FindEle ...
- UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)
在本人之前的一篇文章<<Appium基于安卓的各种FindElement的控件定位方法实践和建议>>第二章节谈到Appium可以通过使用UIAutomator的方法去定位And ...
- UIAutomator定位Android控件的方法
UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...
- 【转】Appium基于安卓的各种FindElement的控件定位方法实践
原文地址:http://blog.csdn.net/zhubaitian/article/details/39754041#t11 AppiumDriver的各种findElement方法的尝试,尝试 ...
- Appium基于安卓的各种FindElement的控件定位方法实践和建议
AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用. 1. findElementByName 1.1 示例 el = driver.fin ...
- 探究android控件及布局
控件(widget) 1. TextView(该控件的一些需要注意的属性,下同) gravity="center"textSize="24sp"textColo ...
随机推荐
- linux中配置yum源
1.配置163或者阿里云yum源: 阿里云yum源地址:https://mirrors.aliyun.com/centos/6.9/os/x86_64/Packages/ 阿里云给出的解决办法:htt ...
- HDU 2955 Robberies抢劫案(01背包,变形)
题意:要抢劫,但是抢每个银行都有被抓的概率,问在低于规定的被抓概率情况下最多能抢到多少钱. 输入:第一行为T,表示共T个测试例子.每个例子的第一行给出一个浮点数P,是规定被抓的概率上限.第一行还有一个 ...
- HDU1075 字典树 + 字符串映射
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 ,字典树的字符串映射. 题意是给你每个火星文单词对应的英语,然后让你把一篇火星文文章给翻译成英语 ...
- [转载]AngularJS入门教程01:静态模板
为了说明angularJS如何增强了标准HTML,我们先将创建一个静态HTML页面模板,然后把这个静态HTML页面模板转换成能动态显示的AngularJS模板. 在本步骤中,我们往HTML页面中添加两 ...
- centos下的安装mysql,jdk
mysql: 如果你是用rpm安装, 检查一下RPM PACKAGE:rpm -qa | grep -i mysql如果mysql已经安装在本机,则会列出mysql安装过的文件 ,像mysql-ser ...
- 可以使用可用的服务和参数调用在“eWorld.WCFImplement.ServiceImplement.ImageArchiveService”类型上使用“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找到的构造函数: 无法解析参数'eWorld.WCFBLL.ImageArchive.IDocumentOperation
可以使用可用的服务和参数调用在“eWorld.WCFImplement.ServiceImplement.ImageArchiveService”类型上使用“Autofac.Core.Activato ...
- 2018.6.15 Java对象序列化详解
一.定义 Serializable 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. ObjectOutputStream对象输出流 可以将实现了Seria ...
- 踩坑日志!viser-ng的使用
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
- Access数据库远程连接的实用方法
一般在远程文件夹开启文件共享即可通过像平常一样用连接字符串访问,注意共享的读写权限. 远程(如通过互联网)连接access数据库的示例: 首先,需要使用TCP/IP,ADO及XML(需要安装Micro ...
- 用gulp把less文件编译成css文件
第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...