来源于:http://blog.csdn.net/zhubaitian/article/details/39803857

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作为参数进行操作,比如clickOnText,clickLongOnText等,通过text来查找控件是最快捷显而易见的。
以下我们用clickOnText以及其重载方法进行说明,其他的以text方式查找的方法类似(我们当然也可以直接调用Solo.clickOnButton(String text)来限制只通过text方法来查找button控件了)。

2.1Solo.clickOnText(String text)

2.1.1 示例

  1. solo.clickOnText("^note$");
  2. 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".所以这种情况下我们必须要加上index来区分开我们需要的是第几个note。
比如以下代码得到的将是ListView里面的第一个Note
  1. View view = null;
  2. view = solo.getView("android:id/text1");
  3. solo.clickOnView(view);

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

6.2.1 示例

  1. View view = null;
  2. view = solo.getView(TextView.class,1);
  3. 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/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1YmFpdGlhbg==/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类型 || FQCN
  • Appium  :String类型 || FQCN

7 无需定位的控件

我们常用到的两个系统控件是不需要定位的,一个是系统的Menu键,一个是系统的goBack。但是注意Menu下面的Menu Entry还是需要定位的,比如我们例子中的”Add note“这个Menu Entry。
 

8 还有吗?

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

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

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

    本人之前以前撰文描写叙述Appium和UIAutomator框架是怎样定位Android界面上的控件的. UIAutomator定位Android控件的方法实践和建议 Appium基于安卓的各种Fin ...

  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. October 3rd 2016 Week 41st Monday

    Better to light one candle than to curse the darkness. 与其诅咒黑暗,不如燃起蜡烛. Sitting in the darkness and wa ...

  2. September 11th 2016 Week 38th Sunday

    Nothing happens unless first a dream. 一切始于梦想. When everything seems to be going against you, remembe ...

  3. August 14th, Week 34th Sunday, 2016

    To live is to function, that is all there is in living. 活着就要发挥作用,这就是生活的全部内容. I often joke that my dr ...

  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。

    前言 上一篇中讲解了加好友的流程,本篇将介绍好友管理,群组管理的右键菜单功能.当然由于菜单项目太多,都实现也得花费时间.只讲解一下我是如何从不知道怎么实现右键菜单到会自定义菜单的一个过程.另外呢,针对 ...

  5. IOS中定时器NSTimer的开启与关闭

    调用一次计时器方法: myTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(scro ...

  6. EVE ToDo

    1. 打捞无人机 2. 无人机命中

  7. CLR via C#(17)--接口

    CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...

  8. vim: vs sp 调整窗口高度和宽度

    转自:http://www.cnblogs.com/xuechao/archive/2011/03/29/1999292.html vim多窗口有时候需要调整默认的窗口宽度和高度,可以用如下命令配合使 ...

  9. Jquery easy UI 上中下三栏布局 分类: ASP.NET 2015-02-06 09:19 368人阅读 评论(0) 收藏

    效果图: 源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  10. HTML - DOCTYPE

    HTML - DOCTYPE HTML 5 doctype <!DOCTYPE html> HTML4.01 Based on SGML. so the browser need the ...