一、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. linux centos7 重启后网络出现问题

    2021-08-04 重启虚拟机后发现网络出了问题,输入 ip a 查看网络,出现以下情况 查看配置文件 cat /etc/sysconfig/network-scripts/ifcfg-ens33  ...

  2. css之px、em、rem

    rem是css3新定义的设置字体大小属性,常用的两种字体大小设置有下面2种:1. px为单位2.em为单位(百分比用法跟em类似) PX为单位 在Web页面初期制作中,我们都是使用"px&q ...

  3. Linux查看英伟达GPU信息

    命令: nvidia-smi 结果:

  4. Geode member发现机制

    Geode member发现机制 Apache Geode 为集群和客户端服务器间提供了多种member 发现机制,具体如下: Peer Member Discovery Standalone Mem ...

  5. Python - 执行顺序、执行入口

    Python 是如何执行的?执行顺序是怎么样? 至上而下,逐行执行 #!usr/bin/env python # -*- coding:utf-8 _*- """ # a ...

  6. 浅谈 JVM GC 的安全点与安全区域

    OopMap 前文我们说到,JVM 采用的可达性分析法有个缺点,就是从 GC Roots 找引用链耗时. 都说他耗时,他究竟耗时在哪里? GC 进行扫描时,需要查看每个位置存储的是不是引用类型,如果是 ...

  7. 原子操作cas

    一.概念, 基于处理器指令,把比较和交换合成一个指令完成,保证了原子性: 因为是针对一个内存地址值的,一个内存地址指向一个变量,所以只对一个共享变量能保证原子性: 二.原子操作类 锁只有synchro ...

  8. 自定义-starter

    目录 说明 编写启动器 新建项目测试我们自己写的启动器 分析完毕了源码以及自动装配的过程,可以尝试自定义一个启动器来玩玩! 自动装配的过程 SpringBoot-静态资源加载-源码 SpringBoo ...

  9. ysoserial CommonsColletions6分析

    CC6的话是一条比较通用的链,在JAVA7和8版本都可以使用,而触发点也是通过LazyMap的get方法. TiedMapEntry#hashCode 在CC5中,通过的是TiedMapEntry的t ...

  10. golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct

    问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...