zoukankan      html  css  js  c++  java
  • iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

    1.原理与变迁

    1.1 环境版本变迁

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    从版本变迁可以得知:

    • iOS 8.0 到 9.3 之间的时候一直以 instruments 下的 UIAutomation为驱动底层技术

    查阅资料说弊端是由于 instruments 的限制,单台 mac 只能对应单台设备,由于现在9.3之前的版本很少了,所以我在学习的时候也就忽略了这部分的内容,仅作为了解);

    • iOS 9.3 之后的版本推出 XCUITest 工具,用以替代 UIAutomation,这个时候Appium需要1.6.0以上的版本才可以支持;

    截止我写这篇博客,appium的版本已经更新到了1.15,所以这个也不用担心版本不够的问题了

    再来看Appium对IOS原生定位方式Predicate的一段说明:

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • Appium 要求在 iOS 10 以上版本才可以用此方法,因为 iOS 10 之后苹果直接废了 UIAutomation ( Xcode8 之后);而 Facebook 推出 WebDriverAgent 成为了主流(实现的 Server 能够支持单台 Mac 对应多个设备);
    • Appium 在 iOS 9.3 后全面采用 WebDriverAgent 的方案。

    上面提到了 XCUITest、WebDriverAgent,现在又说用 Appium,那么他们之间到底是什么关系,用 Appium 做 iOS 自动化的架构原理又是如何?

    1.2 架构原理

    XCUITest 是苹果开发的一个做 iOS 自动化测试的框架,需要了解些 Swift 等 iOS 编程知识,而 WebDriverAgent 是 Facebook 开发的一个 iOS 自动化测试工具。我们可以先看下面的这张原理图:

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    WDA 在 Client 创建了一个 Server,在手机端安装了一个叫作 WebDriverAgentRunner 的一个应用;这个应用会接收来自 Server 的指令,并连接底层的 XCTest.framwork,让 XCTest.framwork 调用苹果 API 来操作手机进行自动化。

    而 Appium 是把 WebDriverAgentRunner 给集成进去了,因此实现了 Appium 的跨平台能力。

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    2.环境命令

    这里对安装运行过程中的一些命令和环境问题做个总结归纳,具体的实施细节和踩坑可在文章末尾处查看上一篇文章。

    2.1 常用命令

    这里发现 TesterHome 社区有位同学总结的很全面细致,就直接引用了。

    1)libimobiledevice / ideviceinstaller 库,相当于 Android 的 adb,是 Appium 底层用到的工具之一,用于获取 iOS 设备信息,常用命令如下:

    • 查看当前所连接的设备
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 安装应用
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 卸载应用
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 查看设备已安装的应用
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 获取设备信息
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 其他系统文件信息
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    2)ios-deploy 常用命令

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    3) carthage,项目依赖管理。主要是 WebDriverAgent 使用,WebDriverAgent 是用它做项目依赖的;公司 iOS 项目也使用 carthage,类似于 java 的 maven;

    4) ios-deploy、ideviceinstaller 类似 android 的 adb;

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

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    2.2 环境总结

    上面提到的那位同学依然总结的很好,当然,具体的实施细节有需要的伙伴依然可以参考作者之前的文章

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    3. Appium 的 iOS 自动化实现

    这里使用上一篇介绍的 Appium 自带的测试软件 UICatalog 来进行演示

    3.1 控件属性获取

    在 Android 自动化的时候,我们用 uiautomatorview 或者 Appium-desktop 可以实现 DOM 的解析以获取元素属性,iOS 同样也有两种方法:

    1)WebDriverAgent - Inspector

    在WDA启动后,浏览器输入http://192.168.0.105:8100/inspector便可以得到如下场景

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    但是这个工具不是很好用,无法进行交互且可能因为环境版本问题而造成使用不顺利,所以我们还是推荐使用 Appium-desktop

    2)appium-desktop

    这个对于用appium做过移动端自动化的应该很熟悉了,打开解析后就是如下场景

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    3.2 定位方式

    我们现在以定位Buttons并点击为例从上图的dom中我们可以看到iOS的控件有type、value、name、label等属性。

    • name和label大多数都是一样的,可以把name理解为id,直接使用AccessibilityId可以完成定位(也是最常用的定位方式):
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • iOS自动化还支持原生IosNsPredicate定位方式,这种方式灵活度很高,可以指定任意属性:
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    备注:上面的是用"=="的形式,也是最常用的一种方式,除此之外,官网说明中还提供了各种吧运算符和逻辑符号等:

    • 基础比较
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 布尔值
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • 逻辑操作符
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    iosDriver.findElementByIosNsPredicate
    ("type=='XCUIElementTypeStaticText' AND name=='Buttons'").click();
    • 字符串比较
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • Xpath

    当然少不了万能的Xpath,iOS自动化也支持xpath定位:

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    还有很多操作,例如LIKE通配符等,因为平常用到的比较少,我也就没继续研究,绝大多数情况使用AccessibilityId、xpath、IosNsPredicate配上简单的比较符就足够了。

    3.3 Capabilities设置

    这里仅列出与Android自动化中Capabilities设置不同的地方

    • platformName:系统名,填写ios
    • deviceName:设备名称,Android中只要有值就行,但是iOS中需要你填写正确的设备名称,可以使用instruments -s命令查找
    • platformVersion:手机的系统版本,填写9.3以上就可以了,因为之前介绍过appium在iOS 9.3版本以后才支持 XCUITest ;实测填写9.3以前的版本会报错
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    这个参数可能还和appium的版本有关,实测使用appium-desktop自带的1.15版本的server,不使用platformVersion也可以运行成功,本地的1.14版本的appium-server运行就必须有此参数;所以保险起见还是都加上为好。

    • udid:手机的id号,真机的时候需要填写,可以通过idevice_id -l命令获得,也可以填写auto,系统会自动执行idevice_id命令去获得
    • xcodeOrgId:签名ID,在使用苹果账号构建完成项目后会生成一个ID号,在构建记录中的sign中获取
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • bundleId:需要启动的应用的bundleId,类似于Android中的包名一样
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    • xcodeSigningId:固定写法,填写iPhone Developerautom
    • ationName:填写XCUITest,指定使用XCUITest定位
    • usePrebuiltWDA:填写true的话就使用上一次加载好的WDA,增加执行效率
    • app:填写App在本地的路径

    以上就是常用的一些基本的Capabilities配置,其他更多的配置可参考官方文档。

    4.运行效果

    理论需要实践来论证,检验一下实际运行效果

    4.1 测试代码

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    以上所有的定位方式均实际运行测试通过,运行效果一样,下面就只展示一种定位方式的运行效果,其余的可自行验证

    4.2 运行效果

    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式

     

    (文章来源于霍格沃兹测试学院)

  • 相关阅读:
    React Native移动框架功能研究
    移动app框架inoic功能研究
    使用Ivy管理项目中的依赖
    使用Ant自动化我们的java项目生成
    Java构建工具Ant小记(一)
    打造Ubuntu下Java开发环境
    解决系统系统管理员不允许使用保存的凭据登录远程计算机
    Ubuntu全新安装firefox最新版本
    jQuery Ready 与 Window onload 的区别(转)
    程序员的素养
  • 原文地址:https://www.cnblogs.com/hogwarts/p/12786948.html
Copyright © 2011-2022 走看看