一、iOS Appium 原理

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

 iOS 9.3 以前的架构模式

1.1.1 Native 自动化

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

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 下工具的变革

1.2.1 关于 WebDriverAgent

但是 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 自动化架构模式可以用一个抽象的架构表示,就是下面这样的:
 Appium 架构模式

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

iOS 9.3以及之后的 Appium 自动化架构模式

从图中可以看出:

1.2.3 必装的软件

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

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

其常用命令如下:

  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

  1. 从 FB 的 GitHub 上下载 WebDriverAgent

    http://github.com/facebook/WebDriverAgent

  2. 初始化项目

    在 WebDriverAgent 目录下执行:./Scripts/bootstrap.sh

  3. 编译 WebDriverAgent

    1. open WebDriverAgent.xcodeproj(会使用默认打开工具 Xcode 打开项目)。
    2. 修改 WebDriverAgent.lib 以及 WebDriverAgentRunner 这两个 target 下的 General 和 Build Settings 列表(前者是在 mac 上运行的,后者是在手机上运行的)。
    3. General 列表需要修改:签名 Signing 和 BundleId: 签名 Signing:可以用个人免费开发者证书,用任意 AppleId 可申请;BundleId:之前 BundleId 是绑定了 FB team 的证书的,不能使用,所以要改一个新的。 Build Settings 列表需要修改 BundleId 和 上一步一样。
    4. WebDriverAgentRunner 是在手机上运行的,要想在手机上安装,需要和上一步一样修改 General 和 Build Settings 列表。
    5. 手机上设置 - 通用 - 描述文件 里信任一下该证书。
    6. Xcode - Product - Test,会安装 WebDriverAgentRunner 并启动 WebDriverAgent 这个 server。
  4. 替换 Appium 下的 WebDriverAgent:删除原 WebDriverAgent 文件夹,把编译好的 WebDriverAgent 放进去即可

    1. 如果用 npm 安装的目录在:cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/;
    2. 如果用 desktop 安装的目录在:/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/)

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 准备脚本

Desired_caps:{
’platformName’:’iOS’,
‘platformVersion’:’10.3.3’,
‘devideName’:’iPhone 7 Plus’,
‘udid’:’’, #如果是真机的话必须提供
‘app’:’~/appPath/app.app’, #app路径,如果只填bundleId,那就是通过id启动已有的App
}

这里说说 Appium Desktop - Inspect 是怎么使用的。
- 打开并启动 Appium Desktop,点击软件右上角第一个按钮 “ start inspector session”;
- 会出现弹窗,弹窗里配置好 Desired_caps。

注意
webdriver.py 里只延展定义了针对移动端的 API,is_displayed()、.is_enabled()() 等这些 API 可以去看 WebDriver 即 Slenium 2 本身的。

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

未完待续~


↙↙↙阅读原文可查看相关链接,并与作者交流