Appium工作原理

article/2025/9/23 9:01:15

一、Appium工作原理

 

1、Appium启动的时候,会创建一个http\\127.0.0.1:4723\wd\hub服务端(中转站)
2、4723端口接收client(也就是测试脚本)发来的请求,解析对应的请求
3、appium server把对应的请求发给bootstrap.jar,它是用java写的,安装在手机上的,在手机上监听4724端口,最终调用UiAutomator命令来实现操作
4、执行的结果由bootstrap返回给appium server  ,appium server再把结果返回给client
之前,Appium通过appium-android-bootstrap实现与UIAutomator v1的交互

现在大部分都使用UiAutomator2 ,针对Google推出的 UIAutomator V2,UiAutomator2修复了v1中遇到的大多数问题,最重要的是实现了与Android系统更新的分离

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

uiautomator2原理:
将automationName设置为uiautomator2,appium会调用appium-uiautomator2-driver,同时将uiautomator2 server的两个apk安装到测试设备上,
io.appium.uiautomator2.server.apk,执行handlers
io.appium.uiautomator2.server.test.apk,只有一个test,用于启动server

 

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

IOS工作原理

appium IOS封装了Apple的Instruments框架,主要用了Instrument里面的UI Automation,然后在设备中注入bootstrap.js进行监听

1、appium 启动server(监听4723端口),用于和脚本通信,
2、收到请求后,server调用instruments.js启动一个socket server,同事分离出一个子进程运行instruments.app,讲bootstrap.js注入device,用于和外界交互
3、bootstrap.js把执行的结果返回给appium server

Appium从1.6.0 开始支持XCUItest框架, 
XCUITest是IOS官方维护的一个自动化测试框架,在iOS 10/xcode8 苹果完全去掉了以前的 UIAutomation 的技术支持,所以现在,要进行IOS的app自动化,只能使用XCUITest。

appium使用的模块是appium-xcuitest-driver,其中引用的Facebook提供的WDA方案来驱动iOS的测试,WDA编译应用在真机中必须配置development team和provisioning profil
 

二、Appium的加载过程

 

1)调用Android adb完成基本的系统操作

2)向Android上部署bootstrap.jar

3)Bootstrap.jar Forward Android的端口到PC机器上

4)Pc上监听端口接收请求,使用webdriver协议

5)分析命令并通过forward的端口发给bootstrap.jar

6)Bootstrap.jar接收请求并把命令发给uiautomator

7)Uiautomator执行命令

Appium工作过程

1、appium是C/S模式的,分为appium-server和appium-client;
2、appium是基于webdriver协议,添加了对移动设备自动化api的扩展,所以具有和webdriver一样的特性,比如多语言支持;
3、webdriver是基于http协议的,第一次连接会建立一个session回话,并通过post请求发送一个json告知服务端相关测试信息;
4、对于Android来说,4.2以后是基于UiAutomator框架实现查找注入事件的
5、appium服务端是node.js编写的HTTP服务器,将现有的优秀的框架进⾏了集成

二、初步认识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测试脚本,该脚本的唯一一个所做的事情是在目标机器开启一个socket服务器来把一个session中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端过来的命令,而非一个文件。

从源代码中能够看到:

这个类是继承UiAutomatorTestCase的,这样它就能被UIAutomator作为测试用例类来运行了。而UiAutomatorTestCase类是继承自 Junit TestCase (Junit),可以直接使用它的一些方法和Junit单元测试框架中的Assert断言机制。
Bootstrap创建一个socketserver并监听4724端口,通过该端口可以与Appium服务端进行通信。
通过循环监听获取Appium服务端发送过来的指令,就可以进行相应的处理了。
 

package io.appium.android.bootstrap;  
import io.appium.android.bootstrap.exceptions.SocketServerException;  
import com.android.uiautomator.testrunner.UiAutomatorTestCase;  
/** 
 * The Bootstrap class runs the socket server. uiautomator开发的脚本,可以直接在pc端启动 
 */  
public class Bootstrap extends UiAutomatorTestCase {   
  public void testRunServer() {  
    SocketServer server;  
        try {  
          // 启动socket服务器,监听4724端口。  
          server = new SocketServer(4724);  
          server.listenForever();  
        } catch (final SocketServerException e) {  
          Logger.error(e.getError());  
          System.exit(1);  
        }  
      }  
    } 
 

四、所使用的技术

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这个地址就可以

九、 Appium客户端与Appium服务端之间的指令信息传递示例
1.点击“Start Server”(Host,Port保持默认即可),启动Appium服务端

2.Appium服务端启动之后,会自动跳转到服务端控制台。

3.执行Appium客户端脚本,即可在服务端控制台看到对应日志,下图中截取了Appium服务端的部分日志。

现将示例中所有指令相关的日志筛选出来。通过以下的日志可以看出,每一个指令都有对应的Http请求与响应:
【–> POST】是Appium客户端向Appium服务端发送的请求,后面是指令转换成的json格式数据。
【<-- POST】是以HTTP响应的方式返回执行结果,状态码【200】表示成功。
具体示例:

person_center =driver.find_element_by_id(“content_rb_mine”) # 获取“个人中心”元素
[HTTP] --> POST /wd/hub/session/5e720862-8c45-450b-a115-d86dfd436bbe/element
[HTTP] {“using”:“id”,“value”:“content_rb_mine”}
[HTTP] <-- POST /wd/hub/session/5e720862-8c45-450b-a115-d86dfd436bbe/element 200 1251 ms - 137
 


http://chatgpt.dhexx.cn/article/Ly2tSrAA.shtml

相关文章

蓝桥杯C/C++ 基础练习 十六进制转八进制 C语言

题目&#xff1a; 分析&#xff1a; 思路&#xff1a;先将十六进制转为二进制&#xff0c;然后将二进制转为八进制 遇到的问题如下&#xff1a; 1、输入格式和输出格式&#xff0c;决定了需要用数组存储十六进制数、二进制数以及八进制数。由于有多个字符串&#xff08;多位…

蓝桥杯——十六进制转八进制(Java解法)

这道题其实挺难的&#xff0c;之前做过一次&#xff0c;用的十六进制转化为十进制&#xff0c;然后用十进制再转化为八进制&#xff0c;代码很简单&#xff0c;用的jdk上自带的进制转换进行换算。 import java.util.Scanner; /** * author 作者 E-mail: WYJ 1627407425qq.com…

蓝桥杯-十六进制转八进制(Java)

蓝桥杯-十六进制转八进制(Java) 最近在练习算法题&#xff0c;打算应付一下下学期的蓝桥杯&#xff0c;写写博客记录一下我的学习过程&#xff0c;对算法感兴趣的朋友可以给小编点点关注(重要的事情加上强调标志&#xff0c;o(&#xffe3;︶&#xffe3;)o)&#xff0c;这个假…

蓝桥杯C语言 十六进制转八进制

十六进制转八进制 思路分析&#xff1a; 39十六进制先转换为4位二进制&#xff0c;3为0011&#xff0c;9为1001&#xff0c;所以39的二进制为00111001,又把二进制转化为3位八进制&#xff0c;从右边开始数&#xff0c;001为1&#xff0c;111为7&#xff0c;所以39的八进制为71。…

十六进制转换八进制

问题描述 给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。   接下来n行&#xff0c;每行一个由09、大写字母AF组成的字符串&#xff0c;表示要转换的十六进制正整数&#xff0…

蓝桥杯练习:C语言十六进制转八进制

这题对我来说是有点难度的,最后做出来,但是提交显示 运行错误,看不出哪里出错了. 我的思路: 将十六进制转化为二进制,二进制最后转化为八进制. 首先将十六进制存入数组,然后将数组中每一位转化为对应的十进制数,之后将再将每一位十进制数转化为二进制数,将这些二进制数以每三…

C语言十六进制转八进制

思路&#xff1a;将十六进制先转为十进制再转为八进制 十六进制转十进制:与二进制转十进制类似。对十六进制每个数从左往右依次乘16的0,1,2,......并相加得到相应的十进制。 比如&#xff1a;对123ABC&#xff0c;1216&#xff08;0&#xff09;1116&#xff08;1&#xff09…

XPC U盘启动盘的制作

XPC U盘启动盘的制作 对于XPC目标机的启动&#xff0c;我们可以通过网络、硬盘或者 U盘启动目标机。这里介绍一下通过U盘的气动&#xff0c;因为这个相对而言比较简单。 选择一个4G以下的U盘&#xff0c;最好为2G选择一台XP系统的电脑&#xff08;最好为工控机&#xff0c;必…

XPC调试记录 :TwinCAT生成XML配置文件

XPC调试记录&#xff1a;生成XML配置文件20210316 1.连接目标控制器 硬件准备&#xff1a;用一根网线将配置有EtherCAT的电脑和EK1100&#xff08;BECOHOFF总线模块&#xff09;网线插槽X2(OUT)相连。&#xff08;正常初始化配置时对应指示灯闪烁&#xff09; &#xff08;1&a…

iOS 冰与火之歌 - 利用 XPC 过 App 沙盒

蒸米是阿里巴巴的移动安全工程师&#xff0c;香港中文大学博士&#xff0c;也是发现并命名了XcodeGhost的人。这次他所在的iOS安全小组发现了影响最新版iOS 9.3的0day漏洞。此漏洞杀伤力巨大&#xff0c;在非越狱手机上一个app应用可以利用这个漏洞做到读取或者修改沙盒外其他a…

xPC信号采集和分析(1)

背景介绍 在我的上篇文章用虚拟机在一台电脑上实现xPC实时仿真&#xff0c;进行xPC实时仿真的过程中&#xff0c;需要将仿真数据进行记录以便后续分析处理。xPC目标的信号采集过程是通过实时内核来完成的。实时应用程序的信号数据存储在目标机的RAM中&#xff0c;xPC目标程序支…

建模simulink - 手把手教你搭建xpc平台

概述 xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件再换仿真和测控系统开发。 目前mathworks已经放弃来xpc target这个说法,而改用…

xPC信号采集和分析(2)

背景介绍 上一篇文章xPC信号采集和分析&#xff08;1&#xff09;里面&#xff0c;解决了自己在使用第二种方法&#xff1a;信号记录模式对xPC数据进行记录过程中的一些问题。 然而很多情况下&#xff0c;我们需要采用第三种信号跟踪模式对实时任务中的数据进行实时传输并可视…

matlab中xpcapi库的调用,关于MATLAB中xpc实时控制平台搭建的心得

Xpc target主机—目标机通讯平台的搭建 一、用u盘制作XPC的目标启动盘 U盘启动盘制作的关键是找对dos系统软件包和相应的读写软件,我也是找了很久而不得要领。开始时,我是下载了一个网上的dos系统软件包,然后用ultriso写入u盘中,然而并不成功,试了几次后,才找到合适的软件…

建模simulink - xpc自定义模块

概述 在实际项目设计中,使用simulink提供的基本模块很难实现的时候,此时就需要一种用户可以自定义的方式,定做自己的模块。 在这种情况下,Matlab的s函数应运而生,S-函数是系统函数(System Function)的简称,又称S-function,支持用户使用C语言、C++、Matlab等语言编写自己…

simulink模块,提供xpctarget下驱动源码

simulink模块&#xff0c;提供xpctarget下驱动源码 :77999632700099250风中的蜗牛

建模simulink - xpc自定义模块设置

概述 simulink建模不同于代码编程,整个项目以模块/模型为单元展开,在之前的文章中,小编已经介绍过如何自定义模块,以及设置参数等信息,不懂的小伙伴可以先移步看看以前的文章,正因为simulink的这种特性,所以此时模块/模型的展示信息就显得尤为重要。 注意 ★环境:matla…

建模simulink - xpc自定义模块库

概述 打开simulink Library Browser,可以看到,simulink官方只为我们提供一些基本模型库,而在实际开发过程中,这些模型库往往需要我们进行二次封装后才能在项目中使用。这时,我们可以创建专属自己的自定义库,把项目中写好的一些模型块放在库中进行统一管理。这样当遇到类似…

在 macOS 中如何使用 XPC 实现跨进程通讯?

以防丢失&#xff0c;转载自&#xff1a; http://davidleee.com/2020/07/20/ipc-for-macOS/ 如侵权&#xff0c;联系删除 最近需要在 Electron 项目上引入一个比较吃性能的大头功能&#xff0c;因为已经用 Objective-C 实现过一套稳定且性能也可接受的带 UI 方案了&#xff0c;…

matlab xpc 环境pci板卡驱动编写,XPC环境下PCI板卡驱动

当Simulink 与S-function 相互作用时&#xff0c;Simulink 所调用的第一个程序是mdlInitializeSizes&#xff0c;随后调用的是其它S-function 函数(所有的函数名均以mdl 开头)。 在仿真结束时&#xff0c;Simulink 调用mdlTerminate函数。 2.3.2预处理 该范例以以下的定义开头&…