Appium Android Bootstrap源码分析之简介

2019-06-29 作者:计算机教程   |   浏览(185)

3. Bootstrap运行流程简介

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

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

图片 1

作者 自主博客 微信服务号及扫描码 CSDN
天地会珠海分舵 http://techgogogo.com 服务号:TechGoGoGo扫描码: http://blog.csdn.net/zhubaitian

5. 小结

  • Appium的bootstrap这个jar包以及里面的o.appium.android.bootstrap.Bootstrap类是通过uiautomator作为一个uiautomator的测试包和测试方法类启动起来的
  • Bootstrap测试类继承于uiautomator可以使用的UiAutomatorTestCase
  • bootstrap会启动一个socket server并监听来自4724端口的appium的连接
  • 一旦appium连接上来,bootstrap就会不停的去获取该端口的appium发送过来的命令数据进行解析和执行处理,然后把结果写到该端口返回给appium
  • bootstrap获取到appium过来的json字串命令后,会通过AndroidCommand这个命令解析器解析出命令action,然后通过AndroidCommandExecutor的action到CommandHandler的map把action映射到真正的命令处理类,这些类都是继承与CommandHandler的实现类,它们都要重写该父类的execute方法来最终通过UiObject,UiDevice或反射获得UiAutomator没有暴露出来的QueryController/InteractionController来把命令真正的在安卓系统中执行
  • appium获取控件大概有两类,一类是直接通过Appium/Android Driver获得,这一种情况过来的appium查找json命令字串是没有带控件哈希表的控件键值的;另外一种是根据控件的父类控件在控件哈希表中的键值和子控件的选择子来获得,这种情况过来的appium查找json命令字串是既提供了父控件在控件哈希表的键值又提供了子控件的选择子的
  • 一旦获取到的控件在控件哈希表中不存在,就需要把这个AndroidElement控件添加到该哈希表里面
作者 自主博客 微信服务号及扫描码 CSDN
天地会珠海分舵 http://techgogogo.com 服务号:TechGoGoGo扫描码: http://blog.csdn.net/zhubaitian

 


在上一个系列中我们分析了UiAutomator的核心源码,对UiAutomator是怎么运行的原理有了根本的了解。今天我们会开始另外一个在安卓平台上基于UiAutomator的新起之秀--Appium的源码分析之旅。 本文在真个系列中会扮演一个简介的角色,不会分析任何的代码,只会先给大家一个基本的印象,方便大家在持有这个印象的基础上往下和本人一块分析。

通过前面的两篇文章《Appium Android Bootstrap源码分析之控件AndroidElement》和《Appium Android Bootstrap源码分析之命令解析执行》我们了解到了Appium从pc端发送过来的命令是如何定位到命令相关的控件以及如何解析执行该命令。那么我们剩下的问题就是bootstrap是怎么启动运行的,我们会通过本篇文章的分析来阐述这个问题,以及把之前学习的相关的类给串起来看它们是怎么互动的。

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

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

图片 2 下面一部分就是蓝色的就是bootstrap所在的位置,可以看到它是运行在我们的安卓目标测试机器端的,它会监听4724端口获得命令然后pass给UiAutomator来做处理。 那么我们应该怎么来给bootstrap做一个定义呢?我不知道官方有没有做一个定义,但是按照我自己的语言,我会这样来定义它:

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

这个定义说明了bootstrap在appium和uiautomator中究竟处于一个什么样的角色:

  • 首先,它是一个uiautomator的测试脚本,它的入口类Bootstrap继承于UiAutomatorTestCase,所以UiAututomator可以正常运行它,它也可以正常的使用uiautomator的方法,这个就是appium的命令可以转换成uiautomator的命令的关键
  • 其次,它是一个socket服务器,它专门监听4724端口过来的appium的连接和命令数据,并把appium的命令转换成uiautomator的命令来让uiautomator进行处理
  • 最后,它处理的是appium从pc端过来的命令,而非一个文件。这在初次接触appium的朋友是很容易困惑的,以为appium是整个脚本文件发送到目标机器再由bootstrap进行分析处理的,事实并非如此

2. 创建socket服务器并初始化Action到CommandHandler的映射

我们先看下SocketServer的构造函数:

  public SocketServer(final int port) throws SocketServerException {      keepListening = true;      executor = new AndroidCommandExecutor();      try {        server = new ServerSocket(port);        Logger.debug("Socket opened on port "   port);      } catch (final IOException e) {        throw new SocketServerException(            "Could not start socket server listening on "   port);      }      }

它做的第一个事情是先去创建一个AndroidCommandExecutor的实例,大家应该还记得上一篇文章说到的这个类里面保存了一个静态的很重要的action到命令处理类CommandHandler的实例的映射表吧?如果没有看过的请先去看下。

建立好这个静态映射表之后,构造函数下一步就似乎去创建一个ServerSocket来给Appium从PC端进行连接通信了。

 

本文由永利电子游戏网站发布于计算机教程,转载请注明出处:Appium Android Bootstrap源码分析之简介

关键词: