本文为霍格沃兹测试学院优秀学员课程学习笔记,想一起系统进阶的同学文末加群交流。
** 1.原理与变迁**
1.1 环境版本变迁
从版本变迁可以得知:
- 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
的一段说明:
-
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 自动化测试工具。我们可以先看下面的这张原理图:
WDA 在 Client 创建了一个 Server,在手机端安装了一个叫作 WebDriverAgentRunner
的一个应用;这个应用会接收来自
Server 的指令,并连接底层的 XCTest.framwork
,让 XCTest.framwork
调用苹果 API 来操作手机进行自动化。
而 Appium 是把 WebDriverAgentRunner
给集成进去了,因此实现了 Appium 的跨平台能力。
** 2.环境命令**
这里对安装运行过程中的一些命令和环境问题做个总结归纳,具体的实施细节和踩坑可在文章末尾处查看上一篇文章。
2.1 常用命令
这里发现 TesterHome 社区有位同学总结的很全面细致,就直接引用了,章节末尾会附上原文链接。
1)libimobiledevice / ideviceinstaller 库,相当于 Android 的 adb,是 Appium
底层用到的工具之一,用于获取 iOS 设备信息,常用命令如下:
-
查看当前所连接的设备
-
安装应用
-
卸载应用
-
查看设备已安装的应用
-
获取设备信息
-
其他系统文件信息
2)ios-deploy 常用命令
carthage
,项目依赖管理。主要是WebDriverAgent
使用,WebDriverAgent
是用它做项目依赖的;公司 iOS
项目也使用carthage
,类似于 java 的 maven;
4) ios-deploy、ideviceinstaller 类似 android 的 adb;
5) authroize-ios,iOS 授权工具,主要用于模拟器中一些权限的授权;
2.2 环境总结
上面提到的那位同学依然总结的很好,因为原文注明了禁止转载,所以尊重原创(原创确实不易,自己写博客就会有体会~)
这部分就直接附上链接,供大家去原文参考:
https://testerhome.com/topics/10068
当然,具体的实施细节有需要的伙伴依然可以参考作者之前的文章
** 3. Appium 的 iOS 自动化实现**
这里使用上一篇介绍的 Appium 自带的测试软件 UICatalog 来进行演示
3.1 控件属性获取
在 Android 自动化的时候,我们用 uiautomatorview 或者 Appium-desktop 可以实现 DOM 的解析以获取元素属性,iOS
同样也有两种方法:
1)WebDriverAgent - Inspector
在WDA启动后,浏览器输入http://192.168.0.105:8100/inspector便可以得到如下场景
但是这个工具不是很好用,无法进行交互且可能因为环境版本问题而造成使用不顺利,所以我们还是推荐使用 Appium-desktop
2)appium-desktop
这个对于用appium做过移动端自动化的应该很熟悉了,打开解析后就是如下场景
3.2 定位方式
我们现在以定位Buttons并点击为例从上图的dom中我们可以看到iOS的控件有type
、value
、name
、label
等属性。
-
name
和label
大多数都是一样的,可以把name
理解为id
,直接使用AccessibilityId
可以完成定位(也是最常用的定位方式): -
iOS自动化还支持原生
IosNsPredicate
定位方式,这种方式灵活度很高,可以指定任意属性:
备注: 上面的是用"=="
的形式,也是最常用的一种方式,除此之外,官网说明中还提供了各种吧运算符和逻辑符号等:
* 基础比较
* 布尔值
* 逻辑操作符
* *
iosDriver.findElementByIosNsPredicate("type=='XCUIElementTypeStaticText' AND name=='Buttons'").click();
-
字符串比较
- Xpath
当然少不了万能的Xpath,iOS自动化也支持xpath定位:
还有很多操作,例如LIKE
通配符等,因为平常用到的比较少,我也就没继续研究,绝大多数情况使用AccessibilityId
、xpath
、IosNsPredicate
配上简单的比较符就足够了,感兴趣研究的同学可参考官网:
http://appium.io/docs/en/writing-running-appium/ios/ios-
predicate/index.html#boolean-value-predicates
3.3 Capabilities设置
这里仅列出与Android自动化中Capabilities设置不同的地方
-
platformName
:系统名,填写ios -
deviceName
:设备名称,Android中只要有值就行,但是iOS中需要你填写正确的设备名称,可以使用instruments -s
命令查找 -
platformVersion
:手机的系统版本,填写9.3以上就可以了,因为之前介绍过appium在iOS 9.3版本以后才支持XCUITest
;实测填写9.3以前的版本会报错
这个参数可能还和appium的版本有关,实测使用appium-
desktop自带的1.15版本的server,不使用platformVersion
也可以运行成功,本地的1.14版本的appium-
server运行就必须有此参数;所以保险起见还是都加上为好。
-
udid
:手机的id号,真机的时候需要填写,可以通过idevice_id -l
命令获得,也可以填写auto
,系统会自动执行idevice_id
命令去获得 -
xcodeOrgId
:签名ID,在使用苹果账号构建完成项目后会生成一个ID号,在构建记录中的sign中获取 -
bundleId
:需要启动的应用的bundleId,类似于Android中的包名一样 -
xcodeSigningId
:固定写法,填写iPhone ``Developer``autom
-
ationName
:填写XCUITest
,指定使用XCUITest
定位 -
usePrebuiltWDA
:填写true
的话就使用上一次加载好的WDA
,增加执行效率 -
app
:填写App在本地的路径
以上就是常用的一些基本的Capabilities
配置,其他更多的配置可参考官方文档:
http://appium.io/docs/en/writing-running-appium/caps/index.html#ios-only-
using-xcuitest
https://github.com/appium/appium-xcuitest-driver
** 4.运行效果**
理论需要实践来论证,检验一下实际运行效果
4.1 测试代码
以上所有的定位方式均实际运行测试通过,运行效果一样,下面就只展示一种定位方式的运行效果,其余的可自行验证
4.2 运行效果
** 推荐阅读**
对于想系统进阶提升测试开发技能的同学,这里推荐霍格沃兹测试学院出品的 《测试开发从入门到高级实战》 系统进阶班课程,有针对 iOS
自动化测试的独家特色课程( 大厂海量用户 App 实战案例总结,可能是市面上最具深度的 iOS 自动化测试 课程 )。
4 个月由浅入深,强化集训,测试大咖通过 8+ 企业级项目实战演练,带你一站式掌握 BAT 测试开发工程师必备核心技能(
对标阿里巴巴P6+,挑战年薪50W+ )!学员 直推 BAT 名企测试经理,普遍涨薪 50%+!
其他资料:
**
**
appium官方相关:
http://appium.io/docs/en/drivers/ios-xcuitest/
http://appium.io/docs/en/writing-running-appium/finding-elements/
http://appium.io/docs/en/writing-running-appium/caps/index.html#appium-
desired-capabilities
http://appium.io/docs/en/drivers/ios-xcuitest-real-devices/
http://appium.io/docs/en/commands/element/find-element/
http://appium.io/docs/en/writing-running-appium/ios/ios-
predicate/index.html#boolean-value-predicates
https://github.com/appium/appium-xcuitest-driver
testerhome相关:
https://testerhome.com/topics/4904
https://testerhome.com/topics/10068
Facebook官方相关:
https://github.com/facebookarchive/WebDriverAgent
https://github.com/facebookarchive/WebDriverAgent/wiki/Starting-WebDriverAgent
简书相关:
https://www.jianshu.com/p/422741e37ece
戳“阅读原文”,了解更多测试进阶技术!
来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力
QQ交流群:484590337
公众号 TestingStudio
点击获取更多信息