第2章2节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NotesList简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。

NotePad窗口Activity之NotesList简介



上一节我们简要描述了测试对象NotePad的主要功能模块,那么这一节开始我们就会对每个模块进行相应的阐述,这样读者就算没有真正去安装和玩过这个应用也不会影响大家对本书的阅读理解了。

我们首先看的就是NotesList这个Activity窗口。在你的安卓手机上找到NotePad这个应用的图标之后,就可以点击该图标进入到该Activity了:

? 图2-2-1 NotesList Activity窗口

该Activity窗口的的名字我们可以用sdk自带的工具hierarchyviewer来获得,该工具是存放在你的SDK的tools目录下面的,比如在我的机器上是”/Users/apple/Develop/sdk/tools/hierarchyviewer”。用户可以指定该路径来打开该工具,当然,如果你的环境变量已经设置好的话,也可以直接输入”hierarchyviewer”命令来打开。无论你的工作环境是Windows还是Linux还是MAC,其原理是一致的。

这里我们在安卓已经打开NotesList这个Activity的时候,在主机端运行hierarchyviewer工具,该工具列出的信息如下:

?图2-2-2 hierarchyviewer工具列出的不完整Activity名称

从上图可以看到,在该工具的主界面列出了所有打开的Activity窗口的名字,其中粗体的部分代表是顶层的Activity窗口,也就是说当前在目标安卓机器上看到的窗口。该窗口名字也叫做组件(component),由两个部分组成:斜杠分隔符前面一部分”com.example.android.notepad”是NotePad应用的包名,在目标机器上全局唯一;分隔符后面一部分是Activity的名字,在这里没有显示完整,完整的NotesList的Activity名字应该是”com.example.android.notepad.NotesList”。我们可以把鼠标放到该控件名字里面来让hierarchyviewer把Activity显示完整如下:

图2-2-3 hierarchyviewer工具列出的完整Activity名称

在获得NotesList这个Activity的名字主要的目的是在编写MonkeyRunner脚本时可以指定该名字来打开NotePad应用。

NotesList这个窗口由几个部分组成,查看一个窗口的控件信息可以通过另外一个叫做uiautomator的工具来完成。该工具同样是在你的sdk目录下的tools下面可以找到,但需要提一下的是,该工具是在Android 4.1及之后的版本才有的,因为它是随着UiAutomator这个新的UI自动化框架一起出来的。下面我们先列出各个控件的简要描述:

  • 标题: NotesList界面中所有日记共享同一个标题,该标题是一个文本TextView控件
  • 日记列表: 所有的日记都会在日记列表这个ListView控件中进行显示

下面我们先来看下在uiautomator中捕获到的标题控件信息的具体内容:

图2-2-4 NotesList标题控件

从上图可以看到NostList标题是一个TextView,uiautomatorviewer中它的文本内容是”Notes”;resource-id是”android:id/title”,MonkeyRunner可以通过该id定位到该标题控件;bounds属性表示该控件的边界范围,由左上角的绝对坐标和右下角的绝对坐标进行定义(但系统选项菜单会不一样,我们第4小节会进行描述)。我们可以通过该边界决定MonkeyRunner模拟点击该控件时的有效位置,一般做法是取各个坐标边界的中间值,比如上面的左上角x坐标6加上右下角x坐标474再除以2就是我们点击的x坐标240;左上角6坐标39加上右下角y坐标74再除以2就是我们点击的y坐标56,所以最终的点击坐标就应该是[240,56]。

当然该控件还有很多其他信息,但因为MonkeyRunner都用不上,所以就不一一列举了。

下面我们继续去看一下NotesList这个窗口中的另外一个控件-日记内容列表ListView的内容:

图2-2-5 NotesList日记列表ListView

因为当前还没有增加任何日记,所有该控件显示的是一个空列表。我们增加两个日记后,日记列表内容将如下所示:

图2-2-6 NotesList日记

上图左边显示新增加日记的标题,右边是uiautomatorviewer所显示的该日记的属性,可以看到每个日记是一个TextView类型的控件,而这些日记的父控件就是日记类容列表ListView控件。



作者:天地会珠海分舵

微信公众号:TechGoGoGo

微博:http://weibo.com/techgogogo

CSDN:http://blog.csdn.net/zhubaitian

时间: 2024-10-23 02:17:20

第2章2节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NotesList简介(原创)的相关文章

第2章4节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之菜单简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. NotePad窗口Activity之菜单简介 这里我们总共用到两种类型的菜单,一种叫做Context Menu,就是上下文菜单:一种叫做Option Menu,就是我们按下系统菜单按键后会弹出来的系统菜单选项. Not

第2章3节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NoteEditor简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 我们在增加和编辑一个日记的时候会从NotesList这个Activity进入到NoteEditor这个Activity.增加和编辑的时候的控件都是一样的,只是他们的标题内容会有区别. 下面我们先来通过hierarchy

第4章4节《MonkeyRunner源码剖析》ADB协议及服务: ADB命令行客户端使用简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 从前面几个小节我们知道ADB命令行客户端是存在与主机端的一个命令,用户可以使用该命令来发送服务请求到ADB服务器,ADB服务器再判断该服务请求是主机服务请求还是本地服务请求来决定是否应该将请求传送给远程adbd守护进程

第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. ADB服务器端在接受到ADB客户端发送过来的命令后会进行相应的处理,如果是主机服务就在ADB服务器内部进行处理,如果是本地服务就会发送给Android目标机器端的adbd守护进程进行处理. 因为ADB相关的源代码不在我

老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1

老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个主要的事情: 715行startAdb:开启AndroidDebugBridge 722-723行:初始化android设备监控并启动DeviceMonitor设备监控线程. 其中第一点我们上一小节已经做了详尽分析了,那么我们往下就去分析下第2点. Dev

老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件 从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行.Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种: 需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系

老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类 每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行了事,而有些是需要在解析后创建相应的事件类实例并添加到命令队列里面排队执行.负责这部分工作的就是命令翻译类.那么我们往下还是继续在MonkeySourceNetwork这个范畴中MonkeyCommand类是怎么一回事: 图6-3-1 MonkeyCommand族谱 图中间的MonkeyCommand是一个接口,

老李推荐: 第1章1节《MonkeyRunner源码剖析》概述:前言

老李推荐: 第1章1节<MonkeyRunner源码剖析>概述:前言 前言 相信大家做过安卓移动平台UI自动化开发的必然会用过,至少听过MonkeyRunner这个名字.MonkeyRunner是一个针对安卓平台的UI自动化测试框架,这个框架的其中一个但绝不是唯一的优点是支持用当今非常流行和高效的Python语言来进行脚本开发.同时,它相比Instrumentation框架或者基于Instrumentation的自动化测试框架最大的优点之一就是可以跨应用测试. 这本书不会有什么序言或者致谢什么

第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 上一节我们描述了monkey的命令处理入口函数run是如何调用optionProcess方法来解析命令行参数的.启动参数主要时去指导Monkey时怎么运行起来的,但Monkey作为MonkeyRunner框架的一部分,