一、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 授权工具,主要用于模拟器中一些权限的授权;

    1. npm install -g authroze-ios
    2. 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
  1. Desired_caps:{
  2. platformName’:’iOS’,
  3. platformVersion’:’10.3.3’,
  4. devideName’:’iPhone 7 Plus’,
  5. udid’:’’, #如果是真机的话必须提供
  6. app’:’~/appPath/app.app’, #app路径,如果只填bundleId,那就是通过id启动已有的App
  7. }
  • 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. 解决 conda tensorflow failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED

    参考解决方案1:https://stackoverflow.com/questions/38303974/tensorflow-running-error-with-cublas 参考解决方案2:ht ...

  2. 学习 Webpack5 之路(优化篇)

    一.前言 从 0 到 1 学习的朋友可参考前置学习文章: 学习 Webpack5 之路(基础篇) 学习 Webpack5 之路(实践篇) 前置文章 学习 Webpack5 之路(基础篇) 对 webp ...

  3. MySQL5.7 高可用高性能配置调优

    [client]default-character-set = utf8mb4[mysqld]### 基本属性配置port = 3306datadir=/data/mysql# 禁用主机名解析skip ...

  4. JDK和环境配置,eclipse安装与使用

    本博客部分参照https://blog.csdn.net/PGY0000/article/details/79256720 (记住要尊重别人的劳动产品) 原博客给的链接和后面的安装过程有点不一样,不能 ...

  5. kubernetes部署一个应用程序

    文章原文 部署 nginx Deployment 如果你已经完成了Kubernetes的搭建,那我跟我一块来部署第一个应用程序吧.没有完成 Kubernetes 集群搭建的,请参考文档 使用 kube ...

  6. 虚拟机使用scp传输文件提示“WARNING REMOTE HOST IDENTIFICATION HAS CHANGED”解决方式

    虚拟机使用scp传输文件提示"WARNING REMOTE HOST IDENTIFICATION HAS CHANGED"解决方式 简单的说就是虚拟机里保存的认证密钥不正确了,需 ...

  7. CSS003. 盒子水平垂直居中简写属性(place-items)

    place-items  CSS 中的 place-items 是一个简写属性 ,它允许你在相关的布局(如 Grid 或 Flexbox)中可以同时沿着块级和内联方向对齐元素 (例如:align-it ...

  8. javaScript对象——function对象

    1.基本对象和Function(函数)方法对象 2.概念 3.创建function对象的三种方式: 第一种不建议使用 2.3两种方式就是方法名位置不同,建议使用: 4.方法调用只要名字对,实参不一定完 ...

  9. AWVS13批量添加目标脚本

    # -*-coding:utf-8-*- # @Author:malphite.tang import json import requests from queue import Queue req ...

  10. 使用ECS和OSS搭建个人网盘

    体验简介 本场景将提供一台配置了Centos 7.7版本的ECS实例(云服务器)和对象存储OSS实例.通过本教程的操作,您可以基于ECS和OSS快速搭建一个个人网盘. 体验此场景后,可以掌握的知识有: ...