在上一个系列中我们分析了UiAutomator的核心源代码,对UiAutomator是怎么执行的原理有了根本的了解。今天我们会開始另外一个在安卓平台上基于UiAutomator的新起之秀--Appium的源代码分析之旅。

本文在真个系列中会扮演一个简单介绍的角色,不会分析不论什么的代码。仅仅会先给大家一个主要的印象,方便大家在持有这个印象的基础上往下和本人一块分析。

1. Bootstrap定义及在Appium中扮演的角色

我们先看一下本人大概一个月之前刚接触appium时整理的一个高层架构图

以下一部分就是蓝色的就是bootstrap所在的位置,能够看到它是执行在我们的安卓目标測试机器端的,它会监听4724port获得命令然后pass给UiAutomator来做处理。

那么我们应该怎么来给bootstrap做一个定义呢?我不知道官方有没有做一个定义,可是依照我自己的语言,我会这样来定义它:

  • Bootstrap是Appium执行在安卓目标測试机器上的一个UiAutomator測试脚本。该脚本的唯一一个測试方法所做的事情是在目标机器开启一个socketserver来把一个session中Appium从PC端过来的命令发送给UiAutomator来执行处理。

这个定义说明了bootstrap在appium和uiautomator中到底处于一个什么样的角色:
  • 首先,它是一个uiautomator的測试脚本,它的入口类Bootstrap继承于UiAutomatorTestCase。所以UiAututomator能够正常执行它。它也能够正常的使用uiautomator的方法,这个就是appium的命令能够转换成uiautomator的命令的关键
  • 其次。它是一个socketserver。它专门监听4724port过来的appium的连接和命令数据。并把appium的命令转换成uiautomator的命令来让uiautomator进行处理
  • 最后,它处理的是appium从pc端过来的命令,而非一个文件。这在初次接触appium的朋友是非常easy困惑的,以为appium是整个脚本文件发送到目标机器再由bootstrap进行分析处理的,事实并不是如此

2. Bootstrap关键类一览表

上面寥寥几句道出了bootstrap的定义,那么往下我们就继续寥寥几行的把bootstrap这个jar包的关键类以及它的关键方法和对应的本人的一些说明给列出来。给大家现有一个draft idea每一个类大概是怎么一回事,这样我们往下的文章就比較好说。大家也比較好理解了。

Class

Key Method

Key Member

Parent

Description

Comment

Bootstrap

testRunServer

以一个UiAutomatorTestCase的方法的方式执行一个SocketServer来监听4724port

整个bootstrap是以UiAutomator的TestCase的方式执行的,所以这里的Bootstrap这个类必需要继承于UiAutomatorTestCase

SocketServer

handleClientData

读取socket进来的字串命令信息并转换成AndroidCommand命令然后调用runCommand命令运行命令进行返回

AndroidComma

ndType

enum AndroidCommandType {

ACTION,SHUTDOWN

}

安卓命令的类型,仅仅有两种,shutdown的处理方式和普通的action会不一样

AndroidComma

nd

action/getElement

JSONObject json;

AndroidCommandType cmdType;

从用户发过来的json命令信息得到真正的命令

CommandHand

ler

execute

虚拟类,其它真实CommandHandler如click的父类

AndroidComma

ndExecutor

execute

HashMap<

String,

CommandHan

dler> map

map是全部的命令字串和真实的CommandHandler的一个映射。

其成员函数execute就是通过字串命令找到map相应的handler然后运行的

AndroidComma

ndResult

AndroidCommandResult

JSONObject json

组织json格式返回值的类

AndroidElement

Click

UiObject el;

String id;

代表了一个控件

当中id是其在AndroidElementsHash维护的elements这个哈希表的key。并不是控件id。

AndroidElement

Hash

addElement

Hashtable<

String,

AndroidEle

ment>

elements;

维护这个session当前为止碰到过的全部控件的哈希表

注意key就是上面AndroidElement的id这个成员变量。每有一个新的控件从appium
pc端过来这个值就会加一

Click

execute

CommandHandler

处理点击命令的类。

真正运行的是传进来的AndroidCommand相应UiObject的Click方法

其它find,drag,setText等命令同理

Strategy

fromString

publicenumStrategy
{

CLASS_NAME

("class

name”),

CSS_SELECT

OR("css

selector”)

,

ID(“id"),

NAME(“name

"),

LINK_TEXT(

"link

text"),

PARTIAL_LI

NK_TEXT(“p

artial

link

text"),

XPATH(“xpa

th"),

ACCESSIBIL

ITY_ID(“ac

cessibilit

y id”),

ANDROID_UI

AUTOMATOR(

"-android

uiautomato

r");

查找控件命令的策略类

find这个CommandHandler会依据用户给出的不同策略来用不同的方式进行控件查找。比方用xpath的方式和用uiautomator的方式是不一样的

这里类在我们往下的分析文章中会做进一步的阐述,所以在这里你仅仅须要由一个rough的idea这些类大概是怎么一回事就能够了。

3. Bootstrap执行流程简单介绍

本来想画一个类图来描写叙述bootstrap的架构的。但通过以上的类表能够看出来bootstrap里面的关键类基本没有真正用到面向对象中的继承,由于它们基本上都没有父类。事实上我们也能够理解,每一个类都不算复杂做的事情都不是非常多,就算略微须要做多点事情,组合其它的类来做就好了。

所以这里我也放弃给大家提供类图了。就提供我自己手画的(还是那句话,本人的macbook pro上没有安装对应的收费流程图软件)一个以处理appium从pc端过来的click命令的流程为样例的顺序图,大家先有一个初步的idea。看不明确也没有关系。我后面会另外开一篇文章专门来描写叙述这个流程以把全部的关键类给串起来的。




 

作者

自主博客

微信

CSDN

天地会珠海分舵

http://techgogogo.com

服务号:TechGoGoGo

扫描码:

tp=webp" alt="" style="max-width:100%; margin:0px; padding:0px; height:auto!important; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

http://blog.csdn.net/zhubaitian



Appium Android Bootstrap源代码分析之简单介绍的更多相关文章

  1. Appium Android Bootstrap源代码分析之启动执行

    通过前面的两篇文章<Appium Android Bootstrap源代码分析之控件AndroidElement>和<Appium Android Bootstrap源代码分析之命令 ...

  2. Appium Android Bootstrap控制源代码的分析AndroidElement

    通过上一篇文章中<Appium Android Bootstrap源代码分析之简单介绍>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一 ...

  3. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

  4. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...

  5. Appium Android Bootstrap源码分析之控件AndroidElement

    通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...

  6. Android HandlerThread 源代码分析

    HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...

  7. Android HttpURLConnection源代码分析

    Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...

  8. Android KLog源代码分析

    Android KLog源代码分析 Android KLog源代码分析 代码结构 详细分析 BaseLog FileLog JsonLog XmlLog 核心文件KLogjava分析 遇到的问题 一直 ...

  9. Android 消息处理源代码分析(1)

    Android 消息处理源代码分析(1) 在Android中,通常被使用的消息队列的代码在文件夹\sources\android-22\android\os下,涉及到下面几个类文件 Handler.j ...

随机推荐

  1. Gradle for Android(三)多渠道打包、配置签名信息

    多渠道打包 国内有太多Android App市场,每次发版几十个渠道包.还好Android Gradle给我们提供了productFlavors,我们可以对生成的APK包进行定制. productFl ...

  2. HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛 - 初赛(1)

    题目链接   题意:给出n个矩形,求能覆盖所有矩形的最小的矩形的面积. 题解:对所有点求凸包,然后旋转卡壳,对没一条边求该边的最左最右和最上的三个点. 利用叉积面积求高,利用点积的性质求最左右点和长度 ...

  3. linux free 命令 ,讲解得比较好

    解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...

  4. entitymanager 进行数据序列化

    场景:同一个方法里,需要将前一部分执行的数据保存到数据库.后半部分读取数据时从数据库里获取,而不是获取到缓存里的数据. 理解eneityManager的这三个方法的作用和区别,首先需要分清楚Persi ...

  5. ObjectInputStream&ObjectOutputStream工具类

    序列化:将数据保存到文件:ObjectOutputStream; 反序列化:将文件中的数据显示出来:ObjectInputStream;   在反序列化程序中运行后能够正常输出Person的相关信息, ...

  6. Flex接收51单片机发送过来的16进制数据转换为String

    private static function toHex(bytes:ByteArray):String{ var pos:int =bytes.position; bytes.position=0 ...

  7. 第三步:搭建JAVA项目

    创建一个JAVA项目,如图: 然后给项目起一个名字,直接点击完成. 下载lucene包解压后放到JDK安装后的lib文件夹里,如图: 首先要导入lucene包,对准项目名右击>构建路径>配 ...

  8. AC日记——小M的作物 bzoj 3438

    3438 思路: 最小割(完全不懂看的题解): s向每个作物连边,s-x ai,x-t bi: 然后s向作物集合连边,cia: 作物集合拆点向t连边,cib: 作物集合第一个点向作物连边INF: 作物 ...

  9. Java android DES+Base64加密解密

    服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Ba ...

  10. 解析转换json xml 集合 ado

    json提取 string str = "[{\"JUDGE_RESULT\":\"B类\",\"JUDGE_RESULT\":\ ...