Appium-Uiautomator2-Server原理分析_迷途的少年的博客-程序员ITS301_appium-uiautomator2-server

技术标签: appium  

简单概括一下:

ps. 我们都知道appium只有在uiautomator2下可以实现对toast的识别,那是因为Google新增了AccessibilityService服务,重写该服务可以实现对Notification和Toast内容的捕捉

appium-uiautomator2-server

  • 通信模块使用了Netty Server,较之bootstrap使用的ServerSocket,Netty是一个高性能、异步驱动的NIO框架,占用内存少,性能更好。

运行原理

  • 客户端通过传递desired capabilities给appium node server来创建一个session, appium server根据automationName去启动对应的driver,默认是android-driver。
  • automationName设为UIAutomator2,appium会调用appium-uiautomator2-driver,同时将uiautomator2 server的两个apk安装到测试设备上
    1. io.appium.uiautomator2.server.apk,执行handlers
    2. io.appium.uiautomator2.server.test.apk,只有一个test,用于启动server

  • AppiumServlet ,管理请求的路由,将driver发过来的请求转发给对应Handler.
  • Handler,调用UiAutomator V2去执行指定操作,操作的结果经AppiumResponse统一封装
  • AppiumResponse,操作结果返回给appium-uiautomator2-driver,再将结果返给客户端



作者:charles0427
链接:https://www.jianshu.com/p/d8457a06c7b7
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Appium是 c/s模式的
appium是基于 webdriver 协议添加对移动设备自化api扩展而成的
webdriver 是基于 http协议的,第一连接会建立个 session 会话,并通过 post发送一个 json 告知服务端相关测试信息

IOS 原理图( 来源于:百度 )

appium ios封装了 封装了 封装了 apple 的 Instruments I框架,主要用了 框架,主要用了 Instrument里的 UIAutomation(Apple  的自动化测试框架),然后在设备中注 自动化测试框架),然后在设备中注 入  bootstrap.js 进 行监 听。
Client ent是我们编写的 webdriver脚本 ,中间是 appium启动 server (默认监听 4723 端口 ),
appium server  调用 instruments.js启动 ⼀一个 socket server ,同时分出一个 ,子进程运⾏instruments.app 将 bootstrap.js(一个 UIAutomation 脚本)注 ⼊入到 devices⽤于和外界进行交 。
最后 Bootstrap.js将执行的结果返回给 将执行的结果返回给 appium server  ,appium server再将结果返 回给 appium client 。

Android原理图(  来源于:百度)

 

 4.2 以后是基于 uiautomator框架实现查找注入事件的, 框架实现查找注入事件的,框架实现查找注入事件的, 4.2 以前则是 instrumentation i框架的,并封装成一个叫 框架的, Selendroid 这玩意提供服务
Client ent是我们编写的 webdriver 脚本。中间是 appium启动 server  (默认监听  4723 端口 ),
appium server  会把请求转发给中间件 会把请求转发给中间件 Bootstrap.jar  ,它是用java写的,安装在 手机上 .Bootstrap监听 4723端口并接收appium  的命令,最终通过调 的命令过调 用 UiAutomator U 的命令来实现。
Bootstrap将执行的结果返回给 将执行的结果返回给 appium server 。
Appiumserver再将结果返回给 client端。

 

Appium的原理

WebDriver script:我们的测试脚本(java or python)

Appium:

  会首先开启一个监听4723端口的server,接收测试脚本发送过来的对应请求,再将对应的请求发送给中间件Bootstrap.jar(注意这里的请求不是整个脚本文件,而是对应的命令请求,比如:点击一个元素就是一条请求)

Bootstrap.jar:

  监听4724端口由appium发送过来的相关请求,并且将请求转换成UiAutomator可以识别的命令发给UiAutomator进行处理

 

二、初步认识appium工作过程

1.appium是c/s模式的 
2.appium是基于webdriver协议添加对移动设备自动化api扩展而成的,所以具有和webdriver一样的特性,比如多语言支持 
3.webdriver是基于http协议的,第一连接会建立一个session会话,并通过post发送一个json告知服务端相关测试信息 
4.对于android来说,4.2以后是基于uiautomator框架实现查找注入事件的,4.2以前则是instrumentation框架的,并封装成一个叫Selendroid提供服务 
5.客户端只需要发送http请求实现通讯,意味着客户端就是多语言支持的 
6.appium服务端是node.js写的,所以你安装的时候无论哪个平台都是先装node,然后npm install -g appium安装(翻墙墙)

 

三、bootstrap介绍

1)Bootstrap作用:

Bootstrap是Appium在初始化的时候推送到安卓手机上的一个UiAutomator测试脚本,该脚本的唯一一个测试方法所做的事情是在手机端开启一个SocketServer(通信模块),用来监听Appium从PC端过来的命令发送给UiAutomator来执行处理。

它会监听4724端口获得命令然后pass给UiAutomator来做处理。

 

2)Bootstrap在appium中扮演的角色:

首先,Bootstrap是uiautomator的测试脚本,它的入口类bootstrap继承于UiautomatorTestCase,所以Uiautomator可以正常运行它,它也可以正常使用uiautomator的方法,这个就是appium的命令可以转换成uiautomator命令的关键;

其次,bootstrap是一个socket服务器,专门监听4724端口过来的appium的连接和命令数据,并把appium的命令转换成uiautomator的命令来让uiautomator进行处理;

最后,bootstrap处理的是从pc端过来的命令,而非一个文件。

 

四、所使用的技术

Android上使用了instrumentation和uiautomator两套技术

iOS使用uiautomation

同时还支持firefox, 并可扩展其他平台

默认开启4723端口接受webdriver请求 ,4723是appium服务的,专门和脚本打交道;

默认开启4724用于和Android设备通讯

 

五、Capabilities

Capabilities是由客户端发送给Appium服务器端的用来告诉服务器去启动哪种我们想要的会话的一套键值对集合。当中也有一些键值对是用来在自动化的过程中修改服务器端的行为方式。

 

六、自我理解的工作原理

Appium启动时会创建一个http:127.0.0.1:4723/wd/hub服务端(相当于一个中转站),脚本会告诉服务器我要做什么,服务端再去跟设备打交道,服务端完成了脚本交给他的任务之后

服务端和设备如何通讯?

服务端和设备默认使用4724端口进行通讯的,底层调用uiautomator工具,在测试的时候服务端会给设备扔一个jar包就是appiumbootstrap.jar,会启动这个包,启动之后会在手机上创建一个socket服务,暴露的就是4724的端口;相对于socket服务来说,appium服务端又是一个客户端;

服务端的4724可以修改,设备上的不可以;服务端收到脚本传递过来的命令之后,通过电脑上的4724端口,想设备上的4724端口发送指令,appiumbootstrap.jar收到指令后回去完成点击,滑动其他的操作,完成之后再通过服务给服务端一个相应。服务端收到之后再去相应脚本

 

服务端和脚本如何通讯?

通过接口来访问,意味着服务端和脚本可以不在一起,只要能访问到127.0.0.1:4723这个地址就可以
--------------------- 
作者:jffhy2017 
来源:CSDN 
原文:https://blog.csdn.net/jffhy2017/article/details/69220719 
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42293590/article/details/87251183

智能推荐

城市间紧急救援 (25 分)(C语言)_R_1220的博客-程序员ITS301

利用结构数组及全局变量,不含指针

sftp传文件到远程服务器,如何使用SFTP保护与远程服务器的文件传输_吴婧羡的博客-程序员ITS301

在本文中,您可以了解–如何设置SFTP(安全文件传输协议),这将帮助我们将文件从本地计算机传输到安全的远程服务器。FTP(文件传输协议)是一种非常流行的方法,用于将文件从一台计算机传输到另一台计算机或从远程服务器传输。SFTP代表安全文件传输协议,它是一个单独的协议,该协议使用SSH来保护连接并进行文件传输,从而遍历远程服务器和本地计算机上的文件系统。如何使用SFTP进行连接SFTP使用SSH协议...

【半原创】wdcp_v2升v3的脚本及相关操作方法说明_yuedudadan的博客-程序员ITS301_wdcp v2升v3

因v3版本是完全重构版,结构上有很大的变化,升级也就麻烦些,不能直接在后台升级 这里整理一个升级脚本,供v2的用户使用或参考(只升级wdCP后台,环境参考其它教程),如下wget http://down.wdlinux.cn/in/upv2to3.shsh upv2to3.sh正常情况下,执行完,就可以了 完成后,需登录新后台,根据提示设置mysql密码及导入数据,将v2里的站点相关的数据导入

Gstreamer播放教程1: playbin usage_X_R*R的博客-程序员ITS301_gstreamer playbin

文章目录1.Goal2.介绍3.实现1.compile2.code4.解析1.数据定义2.函数定义3.flag操作4.playbin属性设置5.处理键盘响应6.main loop7.analyze_streams8.handle_keyboard5.讨论1.Goal展示了如何自定义playbin元素。如何了解在文件中包含多少流,以及如何切换如何收集关于每个流的信息2.介绍更频繁地,可以找到多个音频,视频和字幕流嵌入在一个文件中。 最常见的情况是常规电影,其中包含一个视频,一个音频流(立体声或

3D点云深度学习PointNet源码解析——conv2D,fc,max_pooling_Vodake的博客-程序员ITS301

PointNet在实际搭建网络结构时,其实是将N∗3N∗3N*3的点云当作图片处理,即height=N,width=3。作者对其搭建网络所用到的各种层进行了二次封装,存放于tf_util.py中。本文主要对常用到的conv2D,fc,max_pool源码进行分析。def _variable_with_weight_decay(name, shape, stddev, wd, use_xav...

python中数组(numpy.array)的基本操作_Meringue_zz的博客-程序员ITS301_numpy array

Python中提供了list容器,可以当作数组使用。但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3]。就需要三个指针和三个整数对象。对于数值运算来说,这种结构显然不够高效。Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组,也没有各种运算函数。因而不适合数值运算。NumPy的出现弥补了这些不足。

随便推点

DDos防护系列之2--DDos防御策略_wenph2008的博客-程序员ITS301

前一篇文章讲述了什么是DDos,DDos的种类等。这一节我们讲述DDos的防御策略。我们按照DDos的攻击类型来讲解每一种类型对应的防御策略。一、DDos攻击类型有以下一些类型,但不限于:畸形报文、传输层(4层)DDoS攻击、Web应用DDoS攻击、DNS DDoS攻击、连接型DDoS攻击。1. 畸形报文每中报文都有相对应的标准格式,如果不符合这种格式就属于畸形报文,我们可

【Ubuntu系统】之安装SSH服务(XShell连接linux系统详解)_Kevin Tang的博客-程序员ITS301

作为一名真正的代码骑士,必须横穿Windows的同时要直捣Linux系统。 由于项目需要使用linux系统进行一系列的部署开发,对于习惯了操作Windows界面的开发者来说,必须提前进行一系列的准备工作,在虚拟机上安装了Ubuntu系统,当前版本为16.04.2。安装好之后,自然不想使用虚拟机界面进行操作,因为不可以全屏,操作起来十分不便,因此使用XShell 进行远...

android.database.CursorIndexOutOfBoundsException: Index <m> requested, with a size of <n>_hailushijie的博客-程序员ITS301

android.database.CursorIndexOutOfBoundsException: Index <m> requested, with a size of <n> 提供解决上述问题的两条解决方案

产品经理需要了解的算法——热度算法和个性化推荐_ai_1046067944的博客-程序员ITS301_合集的热度计算

本文系转载,如有不妥之处,欢迎随时留言沟通交流,谢谢~https://36kr.com/p/5084292.html1. 算法的发展阶段个性化推荐不是产品首次发布时就能带的,无论是基于用户行为的个性化,还是基于内容相似度的个性化,都建立在大量的用户数和内容的基础上。产品发布之初,一般两边的数据都有残缺,因此个性化推荐也无法开展。所以在产品发展的初期,推荐内容一般采用更加聚合的“热度...

lombok插件安装后maven引入依赖依旧报红的问题_决影的博客-程序员ITS301_lombok依赖报红

项目场景:新手第一次使用lombok时,在安装插件以及确定maven依赖的setting.xml配置文件下的库地址(推荐使用阿里云,注释掉本地库地址。当然这个还要看应用场景啦)都确定没有问题的情况下,使用lombok时可能会遇到的问题。问题描述:在上述背景下,安装好idea对应版本的lombok之后maven依赖的引入依旧报红。先简单说一下安装吧:就是第一个,图标是一个小辣椒的。安装完成之后会提示重启idea,重启之后发现maven引入的依赖依旧报错。这个时候有两种选择,如果问题成因复杂,可以考虑

“std“ 没有成员 “make_unique“_lucky penguin的博客-程序员ITS301_make_unique在std里面么

make_unique 是C++14 标准里面的确保自己的编译器gcc版本至少是gcc5添加头文件 #include&lt;memory&gt;片

推荐文章

热门文章

相关标签