前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Appium运行原理与机制

Appium运行原理与机制

作者头像
赵云龙龙
发布2019-07-11 10:14:30
2.4K0
发布2019-07-11 10:14:30
举报
文章被收录于专栏:python爱好部落python爱好部落

做测试开发的童鞋都知道,UI自动化你绕不开selenium, webdrvier, appium框架,那么这三者之间有什么关联,它们的原理是什么呢?

简单来说就是:

Selenium2 将浏览器原生的API封装成WebDriver API ,webdriver 是基于 http协议的;

appium是基于 webdriver 协议添加对移动设备自动化api扩展而成的,基于tcp/ip协议(使用了socket接口)

appium-IOS 和安卓都差不多,有细小差别,分PC和手机两块讲:

1、首先是PC端, 测试人员执行测试脚本(java,python等脚本)通过appium client 转换为json格式传递给appium server

2、 appiumserver 启动了一个监听端口例如4724, 同时向手机端adb push 一个bootstrap.jar/bootstrap.js 的脚本,手机端通过该脚本同时监听端口4724

3、PC和手机端就通过这个端口实现了通信和交互,基于socket通信(一个封装了TCP/IP协议的接口)

4、手机端通过该端口传输的命令执行APP, bootstrap里面封装了安卓和苹果的自动化测试框架UIautomator(低版本的安卓是instrumentation ) 执行相应的命令

5、执行完操作后通过端口返回给PC端,PC端根据返回结果 json 做校验,同时也知道了操作是否执行成功

初步认识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。

1.bootstrap的作用 bootstrap是Appium运行在安卓测试机的一个UIAutomator测试脚本,该脚本的唯一功能就是在目标机器开启一个socket服务器来把一个session中Appium从PC端过来的命令发送给UiAutoamtor来执行处理。 它会监听4724端口获得命令,然后交给UiAutomator来处理。

2.bootstrap 首先,bootstrap是uiautomator的测试脚本,它的入口类bootstrap继承于UiautomatorTestCase,所以Uiautomator可以正常运行它,它也可以正常使用uiautomator的方法,这是就是appium的命令可以转换成uiautomator的关键; 其次,,bootstrap是一个socket服务器,专门监听4724端口过来的appium的连接和命令数据,并把appium的命令转换成uiautomator的命令来让uiautomator进行处理; 最后,bootstrap处理的是从PC端传过来的命令

appium的架构原理如图所示,由客户端和服务端组成,客户端与服务端通过JSON进行通信;

各部分的含义: (1)Appium服务器。它是一个基于node.js的HTTP服务器。主要功能是接受从Appium客户端发起的链接,监听客户端发送来 命令,将命令发送到bootstrap.jar(IOS为bootstrap.js)执行,并将命令的结果通过HTTP应答反馈给Appium客户端。 (2)Bootstrap.jar。Bootstrap.jar是在Android手机上运行的一个应用程序,它在手机上扮演TCP服务器的角色,当appium服务器需要运行命令时,Appium服务器与Bootstrap.jar建立TCP通讯,并把命令发送给Bootstrap.jar;Bootstrap.jar负责运行测试命令。 (3)Appium客户端。主要是指实现了Appium功能的webdriver协议的客户端Library,他负责与Appium服务器建立连接,并将测试脚本的指令发送给服务端。包括:python、Java、Ruby等。 (4)Seesion。Appium的客户端和服务端之间进行通信必须在一个session的上下文中进行。客户端发起通信的时候会首先发送一个叫做“Desired Capabilities”的JSON对象给服务端。服务端接收到该数据后,会创建一个session并将session的ID返回给客户端,之后客户端会用该session的ID发送后续的命令。 (5)Desired Capalities。Desired Capalities是一组设置的键值对,用于通知Appium服务端建立需要的session,其中一些设置可以改变Appium的运行行为。

appium的整体架构是C/S模式,整体流程(返回顺序为逆向):脚本请求 ——> 4723端口appium server ——> 解析参数给PC端4724端口 ——> 发送给设备4724端口 ——> 通过设备4724端口发给bootstrap.jar ——> Bootstrap.jar把命令发给uiautomator

Session 的作用就是它在appium服务上保持设备的状态信息,供在任何时间进行访问,在多次的操作行为中,存储在 Session对象中的配置信息将不会丢失,而是在整个用户会话中一直存在下去,整个测试进程中设备与程序的联系不会断开,也不需要每次都发送带配置信息的请求,程序都知道对哪个设备进行测试操作。当测试结束后,需关闭webdriver,driver.quit()会关闭所有关联窗口和session,并且也会把进程也关闭。

好像有点难理解,可以这么来解释: webdriver, 就是工程师, Boss说,webdriver, 你去搞定客户的问题。 webdriver立即给客户打电话,客户解决了问题。 然后结果通过webdriver反馈给Boss, Boss就知道结果了。

appium,是工程师, Boss写封邮件,命令apppium, 你去解决非洲客户问题。 Appium赶忙送了一个小弟刘无能去乌干达。 刘无能到达以后,赶紧申请了一条专线跟总部汇报的。 Appium赶紧下了一条指令给刘无能。 刘无能指挥当地工人干活,解决客户问题。 反过来,客户的反馈,通过刘无能,然后电话打个appium,最后反应到Boss那里。

这里,打电话就是http协议; 写邮件就是sockt协议. 刘无能就是bootstrap 专线就是session 当地工人就是uiautomator(Android), uiautomation(IOS)

这样就容易理解些了吧。所以开始启动起来特别的慢,能够明白了它都干了些什么了吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python爱好部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档