本人之前以前撰文描写叙述Appium和UIAutomator框架是怎样定位Android界面上的控件的。

今天我们换一个渊源更留长,当今更盛行的框架Robotium,实践下看它又是怎样对控件进行定位的。

1. 背景

为保持这个系列的一致性,我们继续用SDK自带的NotePad实例应用作为我们的试验目标应用,可是这次不不过像曾经一样主要环绕Menu Option里面的那个"Add note”控件进行定位,而是会设计到NotePad上的多个不同的控件定位。但主要环绕的还是Notepad的NotesList这个Launchable activity了,以下先看下UIAutomatorViewer以下捕获的我们会涉及到的不同界面吧。
  • NotesList Activity的第一个页面列表中会包括note3note9的笔记

  • NoteList Activity往下拉后还会看到有note1note2以及两个反复的名称为note的笔记

  • 点击系统的menu后会出现“Add note”这个menu entry供我们測试验证用


2. 通过控件的文本信息text进行定位

Robotium里面的非常多方法都支持直接输入text作为參数进行操作,比方clickOnText,clickLongOnText等,通过text来查找控件是最快捷显而易见的。
下面我们用clickOnText以及其重载方法进行说明,其它的以text方式查找的方法类似(我们当然也能够直接调用Solo.clickOnButton(String text)来限制仅仅通过text方法来查找button控件了)。

2.1Solo.clickOnText(String text)

2.1.1 演示样例

		solo.clickOnText("^note$");
assertTrue(solo.searchText("^note$"));

找到第一个text绝对等于note的控件并进行点击。

2.1.2 分析和建议

以上演示样例有两点须要指出来引起注意的:
  • Robotium会自己主动往下滚动直到定位到目标控件为止:这就是为什么以上演示样例不用先进行scrolldown动作就能够直接查找到在第二个页面的“note”的原因
  • Robotium假设查找到的满足条件的控件多于一个的话,默认会返回第一个
  • Robotium依据text进行控件定位的时候默认就是支持用正則表達式的
比方把以上样例改成以下就会断言失败:
		solo.clickOnText("note");
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 演示样例

		solo.clickOnText("^note$", 2);
assertTrue(solo.searchText("^note$"));

2.2.2 解析

假设通过text查找回来的控件有超过一个,那么我们能够在基于1的基础上从左到右自上往下的顺序指定须要的是第几个控件。

2.3 Solo.clickOnText(String text, int match, boolean scroll)

2.3.1 演示样例

		solo.clickOnText("^note2$", 1, false);
assertTrue(solo.searchText("^note2$"));

2.3.2 解析

最后一个參数是指定是否自己主动scrolldown去查找控件。

3. ListView子控件定位

假设要定位的控件是在一个ListView里面的,那么除了能够使用以上的text方式进行定位之外,我们还能够通过指定控件在该ListView的地几行进行定位。

3.1Solo.clickInList(int line):指定行数进行定位

3.1.1 演示样例

		solo.clickInList(2);
assertTrue(solo.searchText("^note8$"));

3.1.2 解析

点击第一个ListView的第2行。那么假设界面有多于一个ListView怎么办呢?那么就要看以下这种方法了。

3.2 Solo.clickInList(int line, int index):同一时候指定第几个ListView的第几行进行定位

3.2.1  演示样例

		solo.clickInList(2, 0);
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,也就是说项目project中的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 演示样例

		solo.clickLongOnTextAndPress("note9", 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  演示样例

		View view = null;
view = solo.getView("android:id/text1",1);
solo.clickOnView(view);

6.1.2 分析

这段代码所做的事情就是去获得从0数起的第1个ResourceId为”android:id/text1"的控件。

这里为什么须要填写index呢?事实上我们要注意Android的Activity以下的控件的ResourceId是同意反复的,比方NotePad上面的ListView里面的每个Note的ResourceId事实上都是"android:id/text1".所以这样的情况下我们必须要加上index来区分开我们须要的是第几个note。
比方下面代码得到的将是ListView里面的第一个Note
		View view = null;
view = solo.getView("android:id/text1");
solo.clickOnView(view);

6.2 Solo.getView(Class<T> viewClass, int index)

6.2.1 演示样例

		View view = null;

		view = solo.getView(TextView.class,1);
solo.clickOnView(view);
点击从0開始的第1个TextView类型的控件,也就是下图中的note4。依照从左到右自上往下的顺序,<span style="font-family: Arial, Helvetica, sans-serif;">这里的第0个是ListView的Title名称为Notes的 那个TextView:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20141004182018767?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1YmFpdGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</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类型 || FQCN
  • Appium
    :String类型 || FQCN

7 无需定位的控件

我们经常使用到的两个系统控件是不须要定位的,一个是系统的Menu键,一个是系统的goBack。可是注意Menu以下的Menu Entry还是须要定位的,比方我们样例中的”Add note“这个Menu Entry。

8 还有吗?

以上列出了Robotium中对本人当前最重要的获取控件的方法,当然Solo里面另一些其它的方法,但不是easy理解就是如今用不上,所以就不一一陈述了
  • 通过坐标点操作控件 :easy理解,就是获得坐标点然后点击屏幕坐标。
  • 获取和操作WebView控件 :如今用不上,到时实用到了再去深究
  • 还有其它吗?

Item

Description

Warning

Author

天地会珠海分舵

转载请注明出处!

很多其它精彩文章请查看本人博客!

Blog Address

http://blog.csdn.net/zhubaitian

Robotium之Android控件定位实践和建议(Appium/UIAutomator姊妹篇)的更多相关文章

  1. 转载:Robotium之Android控件定位实践和建议(Appium/UIAutomator姊妹篇)

    来源于:http://blog.csdn.net/zhubaitian/article/details/39803857 1. 背景 为保持这个系列的一致性,我们继续用SDK自带的NotePad实例应 ...

  2. Robotium之Android控件定位实践和建议

    本人之前曾经撰文描述Appium和UIAutomator框架是如何定位Android界面上的控件的. UIAutomator定位Android控件的方法实践和建议Appium基于安卓的各种FindEl ...

  3. MonkenRunner通过HierarchyViewer定位控件的方法和建议(Appium/UIAutomator/Robotium姊妹篇)

    1. 背景 在使用MonkeyRunner的时候我们经常会用到Chimchat下面的HierarchyViewer模块来获取目标控件的一些信息来辅助我们测试,但在MonkeyRunner的官网上是没有 ...

  4. MonkenRunner通过HierarchyViewer定位控制的方法和建议(Appium/UIAutomator/Robotium侣)

    1. 背景 正在使用MonkeyRunner当我们经常使用Chimchat下面HierarchyViewer模块获得目标控制的一些信息,以协助我们测试.但在MonkeyRunner官方的说法是没有看到 ...

  5. 【转】UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39777951 在本人之前的一篇文章<<Appium基于安卓的各种FindEle ...

  6. UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    在本人之前的一篇文章<<Appium基于安卓的各种FindElement的控件定位方法实践和建议>>第二章节谈到Appium可以通过使用UIAutomator的方法去定位And ...

  7. UIAutomator定位Android控件的方法

    UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...

  8. 【转】Appium基于安卓的各种FindElement的控件定位方法实践

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39754041#t11 AppiumDriver的各种findElement方法的尝试,尝试 ...

  9. Appium基于安卓的各种FindElement的控件定位方法实践和建议

    AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用. 1. findElementByName 1.1 示例 el = driver.fin ...

随机推荐

  1. eclipse自动生成的appcompat_v7出错

    用eclipse新建Android工程时,自动生成的appcompat_v7出错,有个红色交叉,而且新建的Android工程有一个红色感叹号. 这时你去看看你新建的Android工程是不是没有生成R文 ...

  2. JavaSE_ 反射 目录(27)

    JavaSE学习总结第27天_反射 & 设计模式 & JDK5.7.8新特性27.01 反射_类的加载概述和加载时机27.02 反射_类加载器的概述和分类27.03 反射_反射概述27 ...

  3. .NET中的IO操作之文件流(一)

    读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...

  4. web压缩gzip响应

    String data = "ggrgrgw4gergergregerge"; byte b[] = data.getBytes(); String gzipValue = req ...

  5. MVC-03 控制器(3)

    Controller负责处理浏览器来的所有要求,并决定响应什么属性给浏览器,以及协调Model与View之间的数据传递.在ASP.NET MVC中有好几种传递数据给视图的方式,例如从ASP.NET M ...

  6. 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了

    系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...

  7. BZOJ 1088 扫雷Mine (递推)

    题解:如果确定了第一排前两个数,那么剩下的数是唯一确定的,所以只要分情况讨论即可. #include <cstdio> #include <cstring> int n,a[1 ...

  8. linux下笔记本有线网卡"未受管理"

    前段时间因为在弄一个笔记双网卡共享上网的事情把笔记本的有线网卡弄环了,连接的时候一直出现如下情况: 1)有线网卡:未受管理 2)无线网卡:每次登录的时候必须把原来登录过的信息删除掉,然后重新输入密码, ...

  9. 操蛋的UITableView重用机制

    1,背景 你可能会遇见一下情况: 使用UITableView加载数据,比如你的每一个cell上面有一个UITextField,当你在第一个cell的UITextField中写下了内容,开始下滑UITa ...

  10. robomongo

    Robomongo 是一个可视化的mongodb数据库工具,提供对mongodb的操作,javascript执行及语法高亮提示. 安装教程