一、iOS Appium 原理

1.1 iOS 9.3 系统之前自动化测试

1.1.1 Native 自动化

这是 iOS 9.3 系统之前自动化测试的架构模式。通过 Android Appium 原理的学习 ,我们很容易理解 iOS Appium 原理:

  • Appium Client 端执行代码发送到 Appium Server 端(Server 集成了苹果官方的 Instruments);
  • Server 端将一行行代码翻译成一条条指令,同时在手机上注入 bootstrap.jar ;
  • Server 与该 jar 包通信将指令传给 bootstrap.jar,jar 包调用手机里的自动化测试框架(UIAutomation),UIAutomation 框架执行指令。

1.1.2 Hybrid(WebView)自动化

通过 Android Appium 原理的学习,Android 4.4 系统之后,Appium 支持使用 ChromeDriver 进行对 Hybrid 页面的自动化测试。那么 iOS 上是怎么做的呢?
iOS 上早期苹果官方就一直提供 iOS webkit debug proxy(这是苹果官方自己开发的私有的通信协议),Appium 集成了该框架,通过它传递指令。

1.2 iOS 9.3 系统之后自动化测试

Appium 在 iOS 下工具的变革

  • iOS 9 之前一直以 instruments 下的 UIAutomation 为驱动底层技术(弊端由于 instruments 的限制,单台 mac 只能对应单台设备);
  • iOS 9.3 时代推出 XCUITest 工具,用以替代 UIAutomation;
  • iOS 10 时代苹果直接废弃了 UIAutomation、Facebook 推出 WebDriverAgent(实现的 server 能够支持单台 mac 对应多个设备);
  • Appium 在 iOS 9.3 后全面采用 WebDriverAgent 的方案。

1.2.1 关于 WebDriverAgent

  • FaceBook 出品;
  • 实现了一个 server,通过 server 可以远程控制 iOS 设备:启动应用、关闭应用、点击、滚动等操作;
  • 通过连接 XCTest.framework 调用苹果的 API 执行动作;
  • 支持多个设备同时进行自动化;
  • Appium、Macaca 已经集成。

但是 WebDriverAgent 仅仅只提供了一个 server(和 inspect 进行元素定位),并没有像 Appium 一样提供 java 或 python 的 Client 端去写脚本,脚本执行的时候发送指令给 server,然后去运行。WebDriverAgent 要求你自己去实现 Client 端,即拿 Java/ Python 的 WebDriver 库进行封装,然后发送指令。 所以 WebDriverAgent 其实就类似于 Appium server,就只是一个 server。

1.2.2 关于 iOS 9.3 之后的 Appium 自动化架构模式

Appium 很粗暴的把整个 WebDriverAgent 直接集成到自己的项目里,然后通信机制就走 WebDriverAgent,Appium 其实就提供了一个 Client 端的作用。
所以 iOS 9.3 系统之后自动化测试核心是 WebDriverAgent,Appium 就提供了一个 Client 端来写脚本和发送指令。

通过前面的学习,我们知道 Appium 自动化架构模式可以用一个抽象的架构表示,就是下面这样的:

 

iOS 9.3 以及之后的 Appium 自动化架构模式如下图所示:

 

从图中可以看出:

  • Client 端是 Appium 之前本身提供的;
  • Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整个集成进来,Instruments 是为了支持 iOS 9.3 之前的系统)
  • 最右边是一个手机
    • 之前 Server 是和 bootstrap.jar 通信,这里 WebDriverAgent 提供了 WebDriverAgentRunner(类似 bootstrap.jar 的功能),WebDriverAgent 与之通信;
    • WebDriverAgentRunner 是一个应用,Client 和 server 运行了之后,WebDriverAgentRunner 会被装到手机上,这个应用会接收来自 Server 的指令,并连接底层的 XCTest.framwork,并告诉 XCTest.framwork 操作手机进行自动化。

1.2.3 必装的软件

Xcode、command line tool、libimobiledevice、ios-deploy、carthage、WebDriverAgent、Appium。

  1. libimobiledevice / ideviceinstaller 库,相当于 android 的 adb,是 Appium 底层用到的工具之一,用于获取 iOS 设备信息。

其常用命令如下:

  • 查看当前所连接的设备

    idevice_id -l # 显示当前所连接设备的 udid
    instruments -s devices # 列出所有设备,包括真机、模拟器、mac

  • 安装应用

    ideviceinstaller -u [udid] -i [xxx.ipa] # xxx.ipa 为应用在本地的路径

  • 卸载应用

    ideviceinstaller -u [udid] -U [bundleId]

  • 查看设备已安装的应用

    ideviceinstaller -u [udid] -l # 查看设备安装的第三方应用
    ideviceinstaller -u [udid] -l -o list_user # 同上,查看设备安装的第三方应用
    ideviceinstaller -u [udid] -l -o list_system # 查看设备安装的系统应用
    ideviceinstaller -u [udid] -l -o list_all # 查看设备安装的所有应用

  • 获取设备信息

    ideviceinfo -u [udid] # 获取设备信息
    ideviceinfo -u [udid] -k DeviceName # 获取设备名称 同命令 idevicename
    idevicename # 同上
    ideviceinfo -u [udid] -k ProductVersion # 获取设备版本 10.3.3
    ideviceinfo -u [udid] -k ProductType # 获取设备类型 iPhone 8,1
    ideviceinfo -u [udid] -k ProductName # 获取设备系统名称

  • 其他系统文件信息

    ideviceinfo # 获取设备所有信息
    idevicesyslog # 获取设备日志
    idevicecrashreport -e test # 获取设备 crashlog,test 是文件夹需新建
    idevicediagnostics # 管理设备状态 - 重启、关机、睡眠等

  1. ios-deploy 常用命令

    ios-deploy -c # 查看当前链接的设备
    ios-deploy --[xxx.app] # 安装 APP
    ios-deploy --id [udid] --uninstall_only --bundle_id [bundleId] # 卸载应用
    ios-deploy --id [udid] --list_bundle_id # 查看所有应用
    ios-deploy --id [udid] --exists --bundle_id # 查看应用是否安装

  2. carthage,项目依赖管理,主要是 WebDriverAgent 使用,WebDriverAgent 是用它做项目依赖的;

    公司 iOS 项目也使用 carthage,类似于 java 的 maven;

  3. ios-deploy、ideviceinstaller 类似 android 的 adb;

  4. authroize-ios,iOS 授权工具,主要用于模拟器中一些权限的授权;

    npm install -g authroze-ios
    sudo authroze-ios

1.2.4 安装 WebDriverAgent

参考:https://www.cnblogs.com/mo-nian/p/15415781.html

1.2.5 开始跑脚本 Sample-Code

1.2.5.1 准备 APP

这里我们需要将 TestApp 重新编译才能使用。

  1. 进入 APP 其 xxx.xcodeproj 对应的目录,open WebDriverAgent.xcodeproj 打开项目;

  2. 修改该项目里 target 的 General 和 Build Settings 列表(和上面一样);

  3. 通过 Xcode 编译运行。

    或者通过 xcodebuild 命令通过命令行编译运行 xcodebuild -project TestApp.xcodeproj -target TestApp -sdk iphoneos10.3 -configuration
    development

1.2.5.2 准备脚本

  • iOS 项目的 Desired_caps
Desired_caps:{
’platformName’:’iOS’,
‘platformVersion’:’10.3.3’,
‘devideName’:’iPhone 7 Plus’,
‘udid’:’’, #如果是真机的话必须提供
‘app’:’~/appPath/app.app’, #app路径,如果只填bundleId,那就是通过id启动已有的App
}
  • iOS 的元素定位工具
  • 参考连接:https://www.cnblogs.com/mo-nian/p/15415633.html

    • Appium Desktop - Inspect
    • WebDriverAgent - Inspector
    • WEditor

WebDriver 本身的 API 详见:http://selenium-python.readthedocs.io/api.html

参考:https://testerhome.com/topics/10068

Appium iOS 原理的更多相关文章

  1. mac上搭建appium+IOS自动化测试环境(一)

    阅读须知 由于OS X系统最近才开始接触,所以有些东西也不是很清楚,这里只提供方法不提供原理,能解释清楚的我也会尽量解释.可能也有一些地方说的不严谨或有错的,还望大家指点一二. 实验环境 操作系统: ...

  2. 【Appium】Appium工作原理

    参考:http://www.cnblogs.com/zhjsll/p/5698878.html 原作者写的很好,所以直接放在这里. 一.什么是Appium Appium是一个开源.跨平台的测试框架,可 ...

  3. appium ios 真机自动化环境搭建

    近期由于工作需要,本小菜在弄appium+ios+iphone真机的移动自动化,在网上找寻各种资料,发现针对IOS方面的资料少之又少,公司其它部门的弄过的同事也寥寥无几,即使有,也是安卓方面的.本次书 ...

  4. Appium基础三:Appium实现原理

    1.web自动化测试用的selenium webdriver 是c/s模式,server端和client端是通过webdriver protocol实现的,而Appium是参考selenium开发的, ...

  5. [转载]Appium工作原理

    [Appium]Appium工作原理 2017-09-13 15:28 sophia194910 阅读(7658) 评论(0) 编辑 收藏 参考:http://www.cnblogs.com/zhjs ...

  6. 全网最全最细的appium自动化测试环境搭建教程以及appium工作原理

    一.前言 ​ 对于appium自动化测试环境的搭建我相信90%的自学者都是在痛苦中挣扎,在挣扎中放弃,在放弃后又重新开始,只有10%的人,人品比较好,能够很快并顺利的搭建成功.appium 自动化测试 ...

  7. Python+Appium运行简单的demo,你需要理解Appium运行原理!

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.Appium 的理念 四个原则 1.Web-Selenium 的运行原理 2.Appium ...

  8. Appium 工作原理及 Desired Capabilities

    一.Appium工作原理 脚本请求 --> 4723端口appium server --> 解析参数给PC端4724端口 --> 发送给设备4724端口 --> 通过设备472 ...

  9. Appium - iOS 各种问题汇总

    Appium - iOS 各种问题汇总 作者: Max.Bai 时间: 2014/10 Appium - iOS 各种问题汇总  1. Appium 滑动: swipe 有三种方式:  第一种:swi ...

随机推荐

  1. vue中的v-cloak指令

    v-cloak不需要表达式,它会在vue实例结束编译时从绑定的html元素上移除,经常和display:none;配合使用: <div id="app" v-cloak> ...

  2. JavaScript——字符串——模板字符串

    JavaScript--字符串--模板字符串 字符串可以用反引号包裹起来,其中的${expression}表示特殊的含义,JavaScript会将expression代表的变量的值和反引号中的其它普通 ...

  3. iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板

    写在前面   在文章"嵌入式Linux的CAN总线配置--基于迅为iTOP-4412开发板"中我给4412开发板配置了SPI转CAN模块,使用的是不带设备树的内核.在本篇文章中,要 ...

  4. JS009. 数组去重的多种方法总结与一步步优化

    两层for循环 这种函数的优点是兼容性好比较通用,缺点是时空复杂度都很直观的为O(n2),不利于维护和性能. var array = [1,1,'1','1'] function unique(arr ...

  5. AQS快速入门

    一.模板方法模式 父子类多态,父类中用一个方法调用执行所有所需要的方法: 父类: 子类: 主线程执行时候调用父类的模板方法: 二.AQS思想 sync都是独占锁,lock显示锁也是,只有读写锁是共享锁 ...

  6. 《微服务架构设计模式》读书笔记 | 第8章 外部API模式

    目录 前言 1. 外部API的设计难题 1.1 FTGO应用程序的服务及客户端 1.2 FTGO移动客户端API的设计难题 1.3 其他类型客户端API的设计难题与特点 2. API Gateway模 ...

  7. Redis-初见

    目录 启动and连接 JRedis 宝塔 Redis.conf RDB AOF(Append Only File) 发布和订阅 主从复制 一主二从 复制原理 宕机后的手动配置主机 哨兵模式 Redis ...

  8. 本地jvisualvm通过jstatd远程监控GC

    1.查找jdk路径 [root@xxx ~]# which java /data/soft/jdk1.8.0_221/bin/java 2.进入jdk的bin目录下添加指定安全策略文件,注意jdk路径 ...

  9. git config 选项

    git config  --global -- global 写入选项:写入全局的 ~/.gitconfig 文件而不是版本库的 .git/config,如果 ~/.gitconfig 文件不存在,则 ...

  10. lua中的sleep实现

    这篇文章主要介绍了Lua中实现sleep函数功能的4种方法,本文讲解了在一个死循环中设置一个跳出条件方法.调用系统的sleep函数法.Windows下ping命令法.socket库中select函数法 ...