Appium Android Bootstrap源代码分析之简单介绍

news/2024/8/26 13:27:00 标签: 移动开发, 开发工具, json

在上一个系列中我们分析了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是以UiAutomatorTestCase的方式执行的,所以这里的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



虚拟类,其它真实CommandHandlerclick的父类


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就是上面AndroidElementid这个成员变量。每有一个新的控件从appium pc端过来这个值就会加一

Click

execute


CommandHandler

处理点击命令的类。

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

其它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

扫描码:

http://blog.csdn.net/zhubaitian




转载于:https://www.cnblogs.com/brucemengbm/p/6767206.html


http://www.niftyadmin.cn/n/1791003.html

相关文章

Friedman test 和 Bonferroni-Dunn test 整理

Friedman test 和 Bonferroni-Dunn test 是作者写论文时遇到的,经查阅相关文献&#xff0c;内容整理如下&#xff0c;如有错误&#xff0c;还望指正。

webservice接口与HTTP接口学习笔记

一、webservice 的概念 Web 是使应用程序可以与平台和编程语言无关的方式进行相互通信的一项技术。Web 服务是一个软件接口&#xff0c;它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换…

公司某项眼下端技术积累

最佳实践 BootStrap jquery jquery插件 sea.js/require.js Grunt 前期技术选型 BootStrap Backbone.js require.js jquery插件ExtJSAngular.jsBootStrap jquery jquery插件前端技术选型总结&#xff1a; 之所以选择 BootStrap jquery jquery插件 的原因是由于ExtJS或…

Python学习【第18篇】:进程理论基础

进程理论基础背景知识 顾名思义&#xff0c;进程即一个软件正在进行的过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统&#xff0c;是操作系统最核心的概念&#xff0c;也是操作系统提供的最古老的也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕…

力扣第88题:合并两个有序数组

给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存 n…

python语句与语法

Python的语句与语法 语句角色例子赋值创建引用值aApple,bbike调用执行函数log.write(mylog)打印调用打印对象print(1,hello)if/elif/else选择动作if a in b: print(a)for/else序列迭代for i in list: print(i)while/else一般循环while True: print(True)pass空占位符for i in l…

Python Day5

一、本节内容 模块 模块&#xff0c;用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程&#xff0c;函数式编程则完成一个功能&#xff0c;其他代码用来调用即可&#xff0c;提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来&#xff0c;可能需…

懒汉式单例模式在多线程下问题的解决方法

package demo8;/*** author xianyu* version 1.0* date 2020/4/20 14:30* 单例模式&#xff1a; 懒汉式单例模式*/ public class singleInstance1 {public static void main(String[] args) {for (int i 0; i < 1000; i) {Thread t new Thread(()->{Teacher.getInstanc…