在上一个系列中我们分析了UiAutomator的核心源代码,对UiAutomator是怎么执行的原理有了根本的了解。今天我们会開始另外一个在安卓平台上基于UiAutomator的新起之秀--Appium的源代码分析之旅。
本文在真个系列中会扮演一个简单介绍的角色,不会分析不论什么的代码。仅仅会先给大家一个主要的印象,方便大家在持有这个印象的基础上往下和本人一块分析。
1. Bootstrap定义及在Appium中扮演的角色
以下一部分就是蓝色的就是bootstrap所在的位置,能够看到它是执行在我们的安卓目标測试机器端的,它会监听4724port获得命令然后pass给UiAutomator来做处理。
那么我们应该怎么来给bootstrap做一个定义呢?我不知道官方有没有做一个定义,可是依照我自己的语言,我会这样来定义它:
- Bootstrap是Appium执行在安卓目标測试机器上的一个UiAutomator測试脚本。该脚本的唯一一个測试方法所做的事情是在目标机器开启一个socketserver来把一个session中Appium从PC端过来的命令发送给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执行流程简单介绍
作者 | 自主博客 | 微信 | CSDN |
天地会珠海分舵 | http://techgogogo.com | 服务号:TechGoGoGo 扫描码: | http://blog.csdn.net/zhubaitian |