iOS APP自动化:predicate定位

在iOS APP自动化测试中,最基本的操作就是元素定位了。与Android APP自动化测试一样,iOS也支持 ( XCUITest 或 UIAutomation测试框架) 使用属性值定位,比如id、className等元素属性,然而,有时候属性值并不是唯一的,appiumfacebook-wda等框架也封装了XPath定位方法,使用XPath和属性值定位方法基本可以定位到99%的元素。但是在性能方面,XPath的定位速度相对较慢,我们可以选择iOS特有的定位策略: predicate 和 class chain定位方法。本文介绍predicate定位方法, class chain定位将在下一篇文章中介绍。

Predicate语法

Predicate定位是iOS原生支持的定位方式,定位速度比较快,它可以通过使用多个匹配条件来准确定位某一个或某一组元素。

基本比较

符号说明示例
=, ==等于name == “通知”
>大于name > 10
<小于name < 10
>=, =>大于等于name >= 10
<=, =<小于等于name <= 10
!=, <>不等于name != “通知”

集合操作

符号说明示例
ANY , SOME满足表达式的任意元素ANY children.age < 18
ALL满足表达式的所有元素ALL children.age < 18
NONE不包含满足表达式的任意元素NONE children.age < 18
IN元素在集合中name IN { ‘Ben’, ‘Melissa’, ‘Nick’ }
BETWEEN位于某个范围1 BETWEEN { 0 , 33 }
array[index]数组array中指定索引的元素
array[FIRST]数组中的第一个元素
array[LAST]数组中的最后一个元素
array[SIZE]指定数组大小

布尔值

符号说明示例
TRUEPREDICATETRUE
FALSEPREDICATEFALSE

逻辑运算符

符号说明示例
AND, &&逻辑与name="通知" AND label="通知"
OR, ||逻辑或
NOT, !逻辑非

字符串比较

关键字说明示例
BEGINSWITH以某个字符串开始name BEGINSWITH "屏幕"
ENDSWITH以某个字符串结束name ENDSWITH "时间"
CONTAINS包含name CONTAINS "使用时间"
LIKE通配符name LIKE '*Total: $*'
MATCHES正则匹配value MATCHES '.*of 7'

默认情况下,字符串比较是大小写和变音敏感的,可以在关键字后面加上[cd][c]不区分大小写,[d]表示不区分变音符号。

变音符号是附加在字母上的符号,用于提示发音或区分相似的单词。很多语言使用变音符,比如法语、西班牙语等。比如法语单词:Pêche 桃子

Predicate定位示例

使用facebook-wda进行元素操作示例:

s = c.session('com.apple.Preferences') # 打开设置

s(predicate='name == "通知"').click()
s(predicate='name IN {"通知"}').click()
s(predicate='name="通知" AND label="通知"').click()

s(predicate='name BEGINSWITH "屏幕"').click() # 点击屏幕使用时间
s(predicate='name ENDSWITH "时间"').click()
s(predicate='name CONTAINS "使用时间"').click()
s(predicate='name LIKE "*使用*"').click()
s(predicate='name MATCHES ".*使用时间$"').click()
s(predicate='name MATCHES "^屏幕.*"').click()

s(predicate='name CONTAINS[c] "apple"').click()

s(predicate='visible==true AND name ENDSWITH "时间"').click()

参考文档:

  1. http://appium.io/docs/cn/writing-running-appium/ios/ios-predicate/
  2. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html
--THE END--

系列文章

1、Appium 介绍及环境安装
2、selenium/appium 等待方式介绍
3、App控件定位:Android 控件介绍及元素定位方法
4、Appium元素定位(一)
5、Appium元素定位(二):UiAutomator定位
6、Appium控件交互
7、Android WebView测试
8、AppCrawler自动遍历测试
9、自动遍历测试之Monkey工具
10、App自动化测试工具Uiautomator2
11、App自动化测试工具Airtest
12、Android手机管理平台搭建:STF和atxserver2
13、Windows上实现iOS APP自动化测试:tidevice + WDA + facebook-wda / appium
14、iOS APP自动化:predicate定位
15、iOS APP自动化:class chain定位方法
16、使用facebook-wda进行iOS APP自动化测试


<think>好的,用户想了解如何通过脚本或工具自动计算Android和iOS应用的启动耗时,进行性能测试。我需要先整理现有的知识,然后结合提供的引用内容给出具体的步骤和工具推荐。 首先,用户的问题分为Android和iOS两个平台,可能需要分别处理。根据引用内容,特别是引用1和引用4,提到了使用命令行工具和脚本来自动化获取启动时间。 对于iOS部分,引用1提到使用xcrun simctl命令来启动应用,并通过log show获取启动日志中的"Total pre-main"时间。这可能对应冷启动时间。需要详细说明如何编写脚本,包括启动应用、终止进程、获取日志的具体命令。另外,Instruments工具也是iOS性能测试的常用工具,引用1和引用2都提到了Xcode Instruments,可以用来进行热启动测试,但用户可能需要自动化脚本,所以可能需要结合命令行工具。 对于Android部分,引用4提到使用adb logcat来过滤ActivityManager的日志,查找Displayed的时间。这里需要给出具体的adb命令,以及如何用脚本解析这些日志。另外,引用2和引用3提到的自动化测试工具,比如AppCrawler和MobSF,可能也可以用于性能测试,但用户的问题更偏向启动时间的测量,可能需要更直接的方法。 还需要注意用户提到的自动化,因此需要建议如何编写脚本来自动执行这些命令并提取时间数据。例如,使用Shell脚本或Python脚本结合grep/awk处理日志。 可能的问题点:是否需要区分冷启动和热启动?引用1中提到了冷启动测试和热启动测试,用户的问题中可能都需要涵盖。因此回答中需要分别说明两种启动方式的测试方法。 工具方面,除了命令行工具,还可以提到一些自动化测试框架,比如Android的Jetpack Macrobenchmark或iOS的XCTest,但根据引用内容,用户可能更倾向于现有的脚本方案,所以重点放在脚本和命令行工具上。 总结步骤: 1. Android使用adb logcat捕获Displayed时间。 2. iOS使用xcrun simctl启动应用,并通过log命令获取pre-main时间。 3. 提供示例脚本,说明如何自动化执行命令和提取时间。 4. 推荐其他工具如Instruments、MobSF、Drozer等,但主要回答集中在用户的问题,即启动时间的自动化测量。 需要确保引用正确的引用来源,比如引用1关于iOS的冷启动测试脚本,引用4关于测试工具实现自动化启动时间获取。同时,引用3提到的MobSF可能适用于安全测试,但这里可能不相关,不过用户问题中提到了性能测试,所以可能不需要引用这部分,但根据引用内容,需要适当提及。 最后,生成相关问题,可能需要涉及性能测试的其他方面,工具对比,优化方法等。</think>### 如何通过脚本或工具自动计算App启动耗时(Android/iOS) #### **一、Android平台自动化测量方法** 1. **使用`adb logcat`捕获启动时间** - **冷启动**:通过过滤`ActivityManager`日志中的`Displayed`字段获取启动耗时 ```bash adb logcat -c && adb logcat -s ActivityManager | grep "Displayed" ``` 启动应用后,日志会输出类似: `ActivityManager: Displayed com.example.app/.MainActivity: +1s234ms` 其中`1s234ms`即为启动耗时[^4]。 - **自动化脚本示例**(Shell/Python): 使用`adb`命令启动应用并提取时间: ```python import subprocess subprocess.run("adb shell am start -W com.example.app/.MainActivity", shell=True) result = subprocess.check_output("adb logcat -d -s ActivityManager | grep Displayed", shell=True) print("启动耗时:", result.decode().split()[-1]) ``` 2. **进阶工具推荐** - **Android Profiler**:实时监控CPU/内存指标,需手动操作 - **Jetpack Macrobenchmark**:支持自动化性能测试框架,可编程化测量启动时间。 --- #### **二、iOS平台自动化测量方法** 1. **使用`xcrun simctl`与系统日志** - **冷启动测试脚本**(需替换Bundle ID): ```bash # 启动应用并记录时间戳 xcrun simctl launch booted com.yourcompany.app \ --terminate-running-process \ --args "-StartFromCold 1" # 提取pre-main耗时 log show --predicate 'process == "YourApp"' \ --debug --info --last 5m | grep "Total pre-main" ``` 输出示例:`Total pre-main time: 2.3 seconds`[^1]。 - **热启动测试**: 通过`Xcode Instruments`的**Time Profiler**模板,手动录制启动过程,但可通过`xcodebuild`命令实现部分自动化。 2. **自动化脚本优化** - 使用`os_log`在代码中埋点,结合`log stream`命令精准捕获阶段耗时。 --- #### **三、跨平台工具推荐** 1. **Appium**:支持Android/iOS自动化测试,可集成启动时间测量逻辑 2. **MobSF**:支持静态分析与动态监控,扩展性强(需自定义脚本)[^3] 3. **PerfDog**(腾讯):商业级性能测试工具,支持自动化数据导出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值