appium工作原理详讲

article/2025/9/23 8:47:40

appium简介

appium是一个移动端自动化框架,它采用C/S的设计模式,支持多类开发语言(java python js c#…)、支持多平台(ios android),支持跨平台使用(windows linux)。它适用于原生或混合移动应用;

appium继承了webDriver协议(也就是selenium 2),在其基础上做了扩展,使用JSON wire protocol协议驱动安卓和ios移动应用;

appium工作原理(安卓为例)

首先需要了解,appium不同的版本默认使用的不同的执行引擎
目前最新的版本是UIAutomator2(谷歌官方sdk提供的自动化工具)
appium就是将UIAutomator底层工具集成进来,通过一系列手段完成自动化测试

Appium1.13版本以后

在这里插入图片描述

脚本中调用apppium api 如何和appium-server通信?

脚本中调用了appium的某个API(比如findElementById),本质发送http请求到appium-server【基于WebDriver协议,通过Json Wire Protocol协议以json形式发送请求信息给appium server端】,appium服务始终监听客户端(脚本)请求,完整流程如下:

【再此过程中,脚本充当客户端,appium-server充当服务端】

前提:启动appum服务 ,可以看到如下图,其实是appium启动了一个http接口,默认端口号是4723在这里插入图片描述
这里appium-server启动后会对外暴露了一个服务接口地址:http:127.0.0.1:4723/wd/hub,那么只需要我们的脚本按照该接口的规范,就可完成调用;

详细流程

  1. 首先创建启动AppiumDriver【想要通过Appium来执行我们的自动化脚本,首先我们需要实例化AppiumDriver】 , 通过appium自带的AndridDriver/IosDriver(都继承于AppiumDriver,而AppiumDriver基于WebDriver做了再次封装,实现了WebDriver)来访问appium服务,即脚本通过4723端口访问对外暴露的接口地址,发送post请求,将我们的参数传递给appium-server;
    4723端口是脚本和appium-server通信的端口

例如,脚本中实例化driver:
AndroidDriver driver=new AndroidDriver<~>
(new URL(“http:127.0.0.1:4723/wd/hub”),caps);

  • [这里caps是desired capabilities属性配置,作为参数,根据DesiredCapabilities对象设置所有参数,以此来实例化Driver]
  • appium通过webdriver.Remote()传递appium的server地址和启动的client信息desired_caps

脚本向appum服务发送请求

//POST  /wd/hub/session ,参数如下(举例)
//包含安装包以及手机设备信息等
{"desiredCapabilities": {"unicodeKeyboard": true, "deviceName": "D8YDU16325002121", "newCommandTimeout": "120", "noReset": false, "resetKeyboard": true, "appPackage": "com.boyaa.lordland.sina", "platformName": "Android", "appActivity": "com.boyaa.lordland.sina.Game"}
}
  • [post请求 {{url}}/wd/hub/session, {{url}} 为全局变量是http://127.0.0.1:4723 ]

至此 driver启动成功,脚本(appium客户端)成功发送请求到appium服务器;

Appium server接受到请求后该如何和设备建立通讯,完成指定操作?

【再此过程中,,appium-server充当客户端,netty server充当服务端】

详细流程

1.appium启动脚本开始执行后,首先会进行一系列初始化操作(这里在启动appium示打出log,可以进一步分析),如上图示,主要如下行为:
使用adb命令安装辅助工具appium-setting到手机设备上
appium本地安装包路径下有appium-setting的安装包(setting.apk.debug.apk),路径:
node.js/npm_modules/node_modules/appium/node_modules/io.appium.setting/apks

使用adb命令安装辅助工具uiautomator2.server和uiautomator2.server.test到手机设备上
appium本地安装包路径下有uiautomator2.server和uiautomator2.server.test的安装包(appium-uiautomator2-server-vx.x.x.apk 和 appium-uiautomator2-server-debug-androidTest.apk ),路径:
node.js/npm_modules/node_modules/appium/node_modules/appium-uiautomator2.server/apks

  • [uiautomator2.server一个是驱动模块,负责创建会话session ]
  • appium调用Android Driver 为客户端生成一个session 仅在第一次请求时,且有对应的sessionid(代表打开的设备),且将sessionid返回给客户端并保存,再次访问携带作为唯一标识,关闭Driver(driver.quit()) 示session生命周期结束
  • [uiautomator2.server.test是服务器模块,当驱动模块初始化完成,监听appium服务发送的请求,将请求发送给真正底层的UiAutomator2 ]

2.第一步完成,检测到uiautomator2.server.test服务可用;

3.端口映射,forwarding System:8200 to devices 6790,即当电脑上的8200端口收到请求会转发到手机的6790端口;
8200是appium在电脑上占用的端口,主要为了和手机做端口映射
6790是手机设备上启动uiautomator2占用的端口

4.启动手机上的uiautomator2.server.test,会创建一个netty server(对socket进一步封装,比socket高级的通讯框架),该netty server端口号就是6790,用来操作待测app;

初始化完成 至此,AppiumDriver 启动成功,会话创建完成,打开app;
日志如示:[HTTP]<-- POST /wd/hub/session 500 65473 ms - 1421

[服务器会生成唯一session,随后调用相关方法生成sessionId,用来标识session对象。同时会把sessionId返回给客户端(脚本)保存,之后每次请求都会携带sessionId]

注:可以在appium执行完后控制台log如下:
[Appium] New AndroidDriver session created successfully, session a942b672-b86d-44a4-bd46-14a6cd516f11 added to master session list
[debug] [BaseDriver] Event ‘newSessionStarted’ logged at 1515135795839 (15:03:15 GMT+0800 (中国标准时间))

5.执行测试脚本;

例如,脚本中查找元素,完成点击操作:
driver.find_element_by_id(‘com.android.calculator2:id/digit1’).click()

控制台可以看到 ,脚本向服务发送请求
(1)POST /wd/hub/session/{sessionId}/element {"using":"id","sessionId":"xxxxxxxxxx","value":"com.android.calculator2:id/digit1"}发送了post请求,调用的是AppiumDriver.findElement方法,返回找到该元素的id,比如:{"ELEMENT":"1"};(2) 上面查找到的请求返回的id ,会作为参数进行传递,脚本再次想服务器发送请求
POST   /wd/hub/session/{sessionId}/element/1/click ,这里的1就是上个步骤返回的该元素的id;(3)在手机端的点击成功后,返回{“value”:true, “status”:0},最终返回 到客户端就是true,至此完成整个流程;

6.根据测试脚本指令完成指定自动化操作(比如:click)再将结果指令返回;

Appium1.13版本之前在这里插入图片描述

主要区别:
1.端口映射有差异(4724端口作为appium在电脑上占用的端口,主要为了和手机做端口映射
4724是手机设备上启动uiautomator1占用的端口)

2.执行引擎不同,adb命令在手机设备上安装
appiumbootstrap.jar---->中间件
【Bootstrap是Appium在初始化的时候推送到安卓手机上的一个UiAutomator测试脚本,脚本作用:在手机端开启一个SocketServer(通讯模块),用来监听Appium服务发过来的命令发送给UiAutomator来执行处理】
(adb shell 进入终端下/data/local/tmp路径存在有该jar,appium执行后生成的),用以操作待测app;

3.启动appiumbootstrap.jar,在设备上创建socket服务
appium-server 和手机设备建立通信;

4.appiumbootstrap监听到4724端口由appium发送过来的相关请求,将请求转换成UiAutomator1能够识别的命令发给UiAutomator1进行处理;

除上述之外,原理基本和Appium1.13以后的版本一致;

  • 待补充:安卓和ios自动化区别

其他

补充 常用命令
1.appium deskop启动命令:
Appium -g Deskop\appium.log
启动appium服务同时打出工作日志保存到本地文件appium.log

2.adb命令获取手机sdk版本:
adb.exe -p 5037 -s 127.0.01:62001 shell getprop ro.build.version.sdk

3.检测设备是否正常可用:
adb.exe -p 5037 -s 127.0.01:62001 shell echo ping

4.查看显示安卓设备上的log日志:
adb shell logcat

5.查看当前设备名称:
adb devices

6.查看当前打开的app包名和activity的名称:
adb shell “dumpsys window | grep mCurrentFocus”

7.安装应用程序:
adb install -r [apk文件]

8.卸载应用程序:
adb uninstall[包名]

以上是个人学习汇总,如有问题欢迎沟通~


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

相关文章

Appium自动化测试基础 — APPium基本原理

1、APPium自动化测试架构 APPium是一个C/S架构的自动化测试框架&#xff0c;APPium的核心其实是一个暴露了一系列REST API的server。&#xff08;也就是Appium的核心是一个提供了一组REST API的Web服务器。&#xff09; 这个server的功能其实很简单&#xff1a;监听一个端口&a…

Appium的工作原理终于搞清楚了

目录 1. Appium简介 1.1 Appium的理念 1.2 Appium 的设计 1.3 Appium 的概念 2. Appium原理架构 3. appium的工作流程 4. Appium-Uiautomator2-Server 4.1 Appium-Uiautomator2-Server简介 4.2 appium-uiautomator2-server运行原理 4.3 bootstrap vs appium-uiautoma…

APP自动化测试系列之Appium介绍及运行原理

在面试APP自动化时&#xff0c;有的面试官可能会问Appium的运行原理&#xff0c;以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS&#xf…

Appium工作原理

一、Appium工作原理 1、Appium启动的时候&#xff0c;会创建一个http\\127.0.0.1:4723\wd\hub服务端&#xff08;中转站&#xff09; 2、4723端口接收client(也就是测试脚本)发来的请求&#xff0c;解析对应的请求 3、appium server把对应的请求发给bootstrap.jar&#xff0c;它…

蓝桥杯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风中的蜗牛