1. Appium介绍

Appium是由nodejs的express框架写的Http Server。Appium不是它自己创建一套新的测试框架,是将现有的优秀的框架进行了集成,以Selenium WebDriver的协议(JsonWireProtocol/Restful web service)统一起来. 使得这个框架满足很多的需求。Appium启动自动化测试后,在被测设备上启动一个server,监听来自Appium server的指令。不同的平台(如IOS,Android)采用不同的运行和交换方式。Appium将某个桩程序“侵入”平台,用于接受指令,来完成测试脚本的运行。

  1. 特性:

    1. 跨平台, native hybrid webview(H5)
    2. 跨设备, android iOS
    3. 跨app,可以在多个app之间交互
    4. 不依赖APP开源代码( Android 对H5的支持需要代码支持,这里不细说)
    5. 支持Selenium WebDriver / Selenium Grid
    6. 跨语言, java python ruby nodejs
    7. Open Source
  2. appium加载的过程图解:

  1. 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. ui automator执行命令
  2. 初步认识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(需要FQ)。
  3. bootstrap介绍、
    1.  bootstrap的作用

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

  1. Bootstrap

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

  1. 所使用的技术

    1. Android上使用了instrumentation和uiautomator两套技术
      ios使用uiautomation
    2. 同时支持Firefox,并可扩展其他平台。
    3. 默认开启4723端口接收webdriver请求可,4723是appium服务,专门和脚本打交道;
    4. 默认开启4724,用于和Android设备通讯,新版本的appium Android增加了UIautoamator2的支持,iOS换成了XCUItest
  2. capabilities

capabilities是一些键值对的集合。客户端将键值对发送给appium服务端,用来告诉服务端怎样开始测试。

  1. 工作原理

    1. 启动方式:Appium启动时会创建一个http://127.0.0.1:4723/wd/hub服务端(相当于一个中转站),脚本会告诉服务器我要做什么,服务端再去跟设备打交道。
    2. 整体架构:

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

  1. 原理图

  1. session

Session在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息,对应到这里其实就是desiredCapabilities中的配置信息参数。脚本通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了,由于这是第一次请求创建session,所有并没有一个已创建的session id,所以appium server会调用android driver(appium升级到2.0.0后,原有的AppiumDriver函数变成抽象函数了,需更改为AndroidDriver)为client生成一个session并且生成一个与此session相关联的session id,这个 session id将被在本次响应中返回给客户端保存,当下次脚本发出操作请求时就会自带session id为唯一标识,代表所打开的设备,Appium server会按照此session id把这个session检索出来使用,脚本向appium server发送的请求即是存在于创建的session中的。

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

  1. 数据传递过程

解析参数给PC端4724端口 ——> 发送给设备4724端口 ——> 通过设备4724端口发给bootstrap.jar ——> Bootstrap.jar把命令发给uiautomator:

创建session成功之前,就已将bootstrap.jar放入手机中,并开启设备上的基于appium bootstrap的socket服务,绑定本机和boostrap通信的端口号4724用于和Android设备通讯,默认监听4724端口,等待client的连接。

Appium server将脚本的请求解析后给到4724端口,通过设备的4724端口转发解析后的请求, 此时,对于socket服务来说,appium server就充当了client的角色,appium server通过4724端口主动去请求设备上的socket服务,即向socket服务发送请求,即bootstrap.jar,Bootstrap.jar再把Appium的命令转换成uiautomator的命令来让uiautomator进行处理。有请求就有返回,socket接收到请求后会做出响应,原路返回给脚本,然后脚本再进行下一次的请求。

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。appium和手机的通信过程,主要是数据交换的一个过程,socket的作用是就是为了实现双向通信,它需要一对端口号,对应到这里就是4724,手机端的bootstrap就是socket-server端,appium server就是socket-client端。

关于socket的通信原理,先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

Appium原理-20190831相关推荐

  1. Appium原理初步--Android自动化测试学习历程

    章节:自动化基础篇--Appium原理初步(第七讲) 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomat ...

  2. Python自动化-APPium原理解析与实际测试案例分享

    目录结构 一.Appium概述 Appium架构原理 运行原理 1)Appium服务器 2)Bootstrap.jar 3)Appium客户端 二.Appium组件 三.Appium环境搭建 Node ...

  3. 干货|app自动化测试之Appium 原理 与 JsonWP 协议分析

    想要使用 Appium 进行测试,那么就一定要先了解Appium的原理.Appium 不仅能够实现移动端的 JSONWP,并且延伸到了 Selenium 的 JSONWP,它能够控制不同移动设备的行为 ...

  4. Appium原理学习笔记

    一.Appium 概念 appium 是一个移动端自动化测试开源工具,跨平台.支持android,ios原生应用,web应用和混合应用. 特点:appium类库封装了标志的Selenium客户端类库. ...

  5. appium 原理解析

    Appium是 c/s模式的 appium是基于 webdriver 协议添加对移动设备自化api扩展而成的 webdriver 是基于 http协议的,第一连接会建立个 session 会话,并通过 ...

  6. appium原理及api

    appium 测试移动端UI自动化 appium 哲学 移动端自动化测试而单独开发一套api接口 appium是基于selenium做的二次扩展 android uiautomator IOS uia ...

  7. appium底层实现原理解析

    appium原理 转自  木木L玲 一.什么是Appium Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台 ...

  8. App自动化测试-原理与安装-Appium+Python+网易mumu模拟器

    App自动化测试(学习笔记一)--Appium原理与安装 APP自动化初始 Appium原理 Appium安装 Java jdk 1.8版本 Android sdk appium desktop ap ...

  9. APP自动化测试-12.Appium日志分析(原理)

    APP自动化测试-12.Appium日志分析 文章目录 APP自动化测试-12.Appium日志分析 前言 一.应用启动 二.元素定位与操作 总结 前言 以Android原生应用为例,记录使用appi ...

最新文章

  1. 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出
  2. 某程序员吐槽:免费教妹子Java编程,妹子却不让自己找她闲聊!
  3. 剑指offer 24:二叉搜索树的后序遍历序列
  4. bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
  5. 场地测量的方法和程序_建筑施工测量的内容与方法
  6. 输出两个整数中最大的书c语言,c语言程序设计实验指中导书-2.doc
  7. ProjectEuler 005题
  8. 其它项目中引用AirSIm模块报错NullReferenceException: Object reference not set to an instance of an object
  9. 联想K系引领智能电视潮流,Android 4.0将成行业标配
  10. PHP鼠标滑过变色命令,WordPress鼠标悬停变色的修改方法
  11. 【OpenStack】【Keystone】安装与配置详解
  12. 比较ipv6有状态与无状态地址分配工作特点_IPv6环境获取IPV6地址,无状态地址分配,一分钟了解下...
  13. 句子分类_Bert做新闻标题文本分类
  14. Select2异步ajax方式加载数据
  15. 【2020/05/29 开庭】韦东山:闲鱼与盗版更配,坚决打击盗版,起诉到底绝不和解!
  16. 大数据——DBT:dbt集成数据质量监控插件elementary(生产环境篇)
  17. macbook蓝牙pan未连接_macOS Catalina 10.15.1 连接iPad 13.2.2 分屏失败的解决办法
  18. 安装Redis使用make命令出现make /bin/sh: cc: 未找到命令 make[1]: 离开目录“/usr/local/mytools/redis-5.0.0/src“
  19. 苏雅欣课后作业四 个人总结
  20. 解决:RuntimeError: Expected object of scalar type Int but got scalar type Double

热门文章

  1. C++ 算法篇 高精度
  2. 全球经济走势及我国制造业的发展方向
  3. Javacript中parentElement和parentNode的简单用法[0303]
  4. QLExpress 系列入门教程-03-QLExpress 自定义函数,宏定义,拓展操作符
  5. 工程师讲解 | T507实现SPI转CAN 全过程
  6. 科技有意思丨当威风凛凛的保安机器人掉进了水里……
  7. 查SCN 及它scn所对的时间点
  8. Springboot发送邮件实现注册激活
  9. 网易实习一面(游戏测试开发)
  10. 计算机作业实验环境写什么,(大学计算机作业)实验报告模板.doc