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[包名]

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

appium工作原理详讲相关推荐

  1. ASP.NET页面与IIS底层交互和工作原理详解(一)

    第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实 ...

  2. FTP协议及工作原理详解

    FTP协议及工作原理详解 1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的 ...

  3. 卡尔曼滤波工作原理详解

    卡尔曼滤波工作原理详解 网上看到有不少的博客翻译 How a Kalman filter works, in pictures, 这篇文章中非常有趣的解释了卡尔曼滤波,. 但是目前很多翻译的文章中公式 ...

  4. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  5. sync.Map低层工作原理详解

    sync.Map低层工作原理详解 目录 为什么需要sync.Map?适合什么场景? sync.Map内部实现基本原理及结构体分析 sync.Map低层工作原理 1. 为什么需要sync.Map?适合什 ...

  6. ASP.NET页面与IIS底层交互和工作原理详解 (二)

    第三回: 引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IHttpHandler ...

  7. camera (13)---智能手机双摄像头工作原理详解:RBG +RGB, RGB + Mono

    智能手机双摄像头工作原理详解:RBG +RGB, RGB + Mono 由于双摄技术的快速发展,目前已经衍生出了几种不同的双摄硬件和算法配置解决方案.不同手机厂商可能有不同的双摄配置,比如华为荣耀P9 ...

  8. 有刷直流电机工作原理详解

    有刷直流电机工作原理详解 来源:网络整理• 2018-05-10 09:00 • 56380次阅读 有刷直流电机被广泛用于从玩具到按钮调节式汽车坐椅的应用中.有刷直流 (Brushed DC,BDC) ...

  9. 晶体三极管结构及其工作原理详解

    晶体三极管基本概述 晶体管是一种与其他电路元件结合使用时可产生电流增益.电压增益和信号功率增益的多结半导体器件.因此,晶体管称为有源器件,而二极管称为无源器件.晶体管的基本工作方式是在其两端施加电压时 ...

  10. Appium学习日记(一)——Appium工作原理及其主要组件

    Appium工作原理及其主要组件 Appium的工作原理(how Appium works)   Appium的核心是一个服务器,它侦听符合API规范WebDriver的传入HTTP请求.对于那些过去 ...

最新文章

  1. html 遇到多个class时取当前行参数
  2. 微软等数据结构+算法面试100题全部答案集锦
  3. centos 搭建git服务器
  4. Jenkins真正地完整迁移流程(亲测有效)
  5. Asterisk NAT
  6. leetcode597. 好友申请 I :总体通过率(SQL)
  7. [渲染层错误] multipolyline.styles: 样式id_【译】关于 SPA,你需要掌握的 4 层
  8. CvvImage.h和CvvImage.cpp
  9. 纯手工获取的WINDOWS 7 32位 SP1后续补丁集ver201509的官方下载地址
  10. NOPIExcel读写扩展
  11. 2022钉钉杯A题思路及代码:银行卡电信诈骗危险预测
  12. Scratch编程(八)扩展模块:文字朗读模块
  13. 计算机视觉 || Canny算子实现边缘分割并进一步处理
  14. 我的世界1.7.10服务器修改器,1.7.10tmi内置修改器
  15. tibco rv java实例_java – 我不允许使用Tibco Rendezvous确认消息的任何原因?
  16. 多维时序 | MATLAB实现CNN-LSTM多变量时序预测
  17. 做一个学(chou)习(ka)游戏(一)
  18. 获得新成就1024勋章
  19. Python中的long类型
  20. (转载)OpenNI最新安装教程(图文教程)

热门文章

  1. asdm 对应 java 版本,asdm不能登录问题;浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整...
  2. mysql创建新用户并设置密码时报错:Your password does not satisfy the current policy requirements
  3. 4.3 CMMI4级——定量项目管理(Quatitative Project Management)
  4. 以消费者为中心,服装行业如何应用人工智能提升客流量?
  5. 读后感--《魔鬼数学:大数据时代,数学思维的力量》
  6. Python 监控linux之dstat
  7. WEB数据库管理平台kb-dms:功能简介【一】
  8. 【老生谈算法】matlab实现追赶法算法——追赶法算法
  9. 有效集法(Active Set),内点法(Interior-Point)及序列二次规划(SQP)法
  10. 汽车维修企业管理【1】