AirtestProject 自动化测试实操案例详解 | iOS 应用篇
此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
前言
上一篇推送我们聊到了Windows 应用的实操案例,而今天我们想跟大家聊一聊 iOS 设备的实操案例 。因为之前很多同学都反馈说,官方教程里面,绝大多数都是安卓设备的实操,Windows 应用和 iOS 设备的测试实操很少,所以这两周特意给大家安排上。
不过在进入主题之前,我们需要明白,大部分情况下,在 iOS 上做自动化测试和在安卓设备上做自动化测试的思路是一致的,只有少部分接口会有所不同,比如 有些接口只支持安卓设备,不支持 iOS 设备 ;另外 有些接口在 iOS 设备和安卓设备的表现会略微不同 。这些内容我们在下文中都会给同学们详细讲解下。
案例分析
① 需求及预期效果
今天我们依然用 1 个很简单的例子来带大家入门:打开 iOS 设备上的备忘录 app,新建 1 个备忘录并输入一些文本信息,删除新建的备忘录,回到应用初始页。具体步骤如下:
- 打开备忘录
- 新建 1 个备忘录
- 使用
text
接口做一些输入验证 - 删除一些字符
- 删除新建的备忘录
- 回到备忘录的初始页
预期效果如下:
② 实现代码
# -*- encoding=utf8 -*-
__author__ = "AirtestProject"
from airtest.core.api import *
auto_setup(__file__)
# 重启备忘录
keyevent("HOME")
stop_app('com.apple.mobilenotes')
start_app('com.apple.mobilenotes')
from poco.drivers.ios import iosPoco
poco = iosPoco()
# 新建备忘录,输入文字
if exists(Template(r"tpl1597634812825.png", threshold=0.8, record_pos=(-0.002, -0.923), resolution=(828, 1792))):
poco("新建备忘录").click()
text("这是标题")
text("This is context",enter = False)
text("展示不换行输入")
sleep(1.0)
text("展示删除操作~~~",enter = False)
sleep(1.0)
text("\b\b\b已删除3个~符号")
if poco("ICNoteEditorView").child("备忘录").exists():
poco("ICNoteEditorView").child("备忘录").click()
# 删除备忘录
if poco("Table").offspring("这是标题").exists():
poco("Table").offspring("这是标题").click()
poco("删除备忘录").click()
poco("ICNoteEditorView").child("备忘录").click()
知识点详解
① 启动应用
iOS 设备也可以使用 start_app(package)
接口来启动应用,唯一与安卓设备不同的,只是参数 package
的称呼有点不一样。iOS 的 package
叫 Bundle ID
,而 Android 的叫 packageName
。
Bundle ID
是 iOS 应用的唯一标识 。对于常见的一些原生应用, 找某度问一下就可以知道他们的 Bundle ID
了。如果是自己公司内部开发的 iOS 应用,也可以找对应的开发咨询一下。另外网上也有很多如何获取 Bundle ID
的小技巧,同学们可以自行搜索下。
PS:查看安卓应用的 packageName
可以直接使用 IDE 自带的 “安卓助手” ,详情可以看往期推文 “IDE 这个隐藏的小助手,还没用过你就亏啦!”
② text() 输入
iOS 的 text()
接口默认会 在给定的输入字符后面加一个换行符 \n
。如果不想要输入之后出现换行的效果,可以把 enter = False
传到 text()
接口里面:
# 完成输入以后,不会进行换行操作
text("This is context",enter = False)
# 完成输入后,会直接换行
text("展示不换行输入")
安卓 的 text()
接口也有 enter
这个参数,但是它表示的是 在完成文字输入以后按一下回车键(相当于 keyevent("ENTER")
),比如在一些游戏输入时,用户输入有效内容之后需要点击 Enter 确认,text()
接口的 enter
参数就可以完成这个操作,它的默认值也是 True
。
更特别的是,安卓平台的 text()
接口还有 1 个 search
参数,用于按下输入法键盘中的 search键
,这个参数是安卓平台独有的。
③ iOS 的删除操作
因为 iOS 平台不支持 keyevent("KEYCODE_DEL")
,所以在 iOS 设备上,没办法像安卓那样直接使用 keyevent("KEYCODE_DEL")
来删除文本。
但我们需要换一种思路,通过输入退格符号 \b
来实现 iOS 的删除操作 :
text("展示删除操作~~~",enter = False)
text("\b\b\b已删除3个~符号")
不过 1 个退格符 1 次只能删除 1 个字符,要实现删除输入框所有文本的效果,我们需要 写一个循环连续运行 N 次 “输入退格符” 的操作 :
# 必须使用enter = False,否则删除1个字符之后就直接换行了
for i in range(10):
text("\b",enter = False)
④ other 节点的定位问题
另外很多同学反馈,在做 iOS 测试的过程中,最让人头疼的就是使用 poco 框架时,好多节点都被识别成 Other,给定位带来了极大的困扰 。
并且如果直接使用 IDE 的录制功能,自动生成的节点定位语句有可能会非常长,回放时容易报错,不是最优的定位方式。正确的方法是,观察 UI 树结构,看一下目标节点附近有没有非 Other 的节点,然后通过非 Other 的节点,用相对选择器/空间顺序选择器进行定位。
举个例子,在上述的备忘录脚本中,我们想定位左上角的返回备忘录按钮,如果直接使用 poco("备忘录")
来定位,有可能定位到别的叫 “备忘录” 的控件;如果双击该节点,自动生成的定位语句是 poco(rect="{'y': 44, 'x': 0, 'width': 83, 'height': 44}")
,回放时会报错找不到该控件。
所以我们可以观察下目标控件附件的树结构,发现他有一个非 other 的父节点,该节点的 name 属性在整棵树中也是唯一的,所以我们利用相对选择器,写出来的定位语句为 poco("ICNoteEditorView").child("备忘录")
。
⑤ iOS 支持的接口详情
iOS 平台下,Airtest 的 api 支持情况:
接口 | 是否支持 |
---|---|
start_app | 支持 |
stop_app | 支持 |
snapshot | 支持 |
home | 支持 |
touch | 支持 |
swipe | 支持 |
text | 支持 |
wait | 支持 |
exists | 支持 |
find_all | 支持 |
assert_exists | 支持 |
assert_not_exists | 支持 |
wake | 不支持,可以考虑用 home 替代 |
keyevent | 仅支持 HOME |
clear_app | 不支持 |
install | 不支持 |
uninstall | 不支持 |
小结
好了,今天的教程就到这里啦,虽然例子非常简单,但还是希望新手同学先学习再上手,才会事半功倍哦~(另外需要更加复杂项目来学习的同学,也可以持续关注下我们后续的推文)
Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b