背景介绍
VoIP 类型的 APP 有个特性,就是需要一直在后台保持运行,以便能够随时接收来电。正因为系统提供给 VoIP 进程的这种特殊机制,导致我们没法直接用 kill 命令完全查杀 VoIP 进程。关于这点更加详细的信息,可参考如下 Apple developer 网站的介绍:
“Because VoIP apps need to stay running in order to receive incoming calls, the system automatically relaunches the app if it exits with a nonzero exit code. (This type of exit could happen when there is memory pressure and your app is terminated as a result.) However, terminating the app also releases all of its sockets, including the one used to maintain the VoIP service connection. Therefore, when the app is launched, it always needs to create its sockets from scratch.”
在详细介绍用脚本查杀 VoIP 进程实践之前,先花点篇幅说下我们为什么需要查杀 VoIP 进程。
在 IOS 中,可以使用 instruments 这个工具来启动被测应用,并执行 UI Automation 所编写的自动化测试用例。二次启动 instruments 时,因为进程已经被启动过,会在控制台抛出如下错误:”Executable ‘XXX’ is already running as process XXXX which was launched from the ‘launchd’ process.” 为了避免这种错误,只能启动一次 instruments,跑完所有的自动化用例. 因为在命令行下启动 instruments,只能指定一个执行的 JS 文件,所以只能把所有的自动化用例封装到这唯一的 JS 文件里。这很难满足实际的需求。现实中我们已自动化用例数目比较大,需要对自动化用例按用例优先级进行分类处理,按照类型将自动化用例存在对应的 JS 文件里,所以需要启动多次 instruments 来执行用例。因此,我们需要在启动 instruments 前先查杀下已经存在的 VoIP 进程。
显然我们不可能在自动化脚本运行的过程中,手动通过连按主屏幕,向上滑动 APP 图标来查杀 VoIP 进程。那接着就来看下我们的实践过程吧。
应用的工具
我们结合了如下这些工具:
- SimulateTouch: 提供坐标方式点击或者滑动屏幕的方法
- Activator: 可以设置在任意位置按一下顶部状态栏激活多任务栏
- KillBackgroud7: 在多任务栏提供按钮,点击该按钮可以查杀所有后台进程
- AutoTouch: 可以用来录制动作存到脚本里,我们主要用这个工具来查看坐标
这几个工具在越狱的 iPhone,都可以通过 Cydia 下载到。
实践过程介绍
首先,我们在设置里找到并点击Activator, 然后选择并点击任意位置,选择并点击按一下顶部状态栏,选择并点击激活任务栏,这些步骤的目的是为了在任意位置点击一下顶部状态栏打开多任务栏页面。上面的步骤如以下截图所示:
接着,通过跟上面绑定激活任务栏到单击顶部状态栏的步骤一样,我们可以绑定启动 AutoTouch 到双击顶部状态栏这一动作 (主要用来录制,然后获取坐标供 SimulateTouch 使用)
现在我们需要录制如下的动作,点击顶部状态栏 (如上所述,用来打开任务栏),然后点击 KillBackgroud7 在任务栏右下方的出现的按钮 (点击该按钮 KillBackground7 会帮我们杀掉所有后台进程),该按钮如下截图所示:
现在双击顶部状态栏,打开 AutoTouch 录制功能,点击 Record 按钮
录制如下的动作,点击一下状态栏,接着点击一下 KillBackground7 在多任务栏右下角的按钮,双击顶部状态栏结束录制。
在手机桌面找到 AutoTouch 图标,点击该图标,按时间排序找到你刚录制的脚本,点击该脚本右边的感叹号图标,可以看到脚本内容,提取出状态栏坐标,KillBackgroud7 在多任务栏右下角图标的坐标
从上面的步骤中,我们已经获得了需要的坐标,可以用 SimulateTouch 来编写杀进程的脚本了。在这里或许有人会有以下的疑问,为什么不直接回放 AutoTouch 录制的脚,通过 SimulateTouch 来编写脚本,不是多此一举吗? Good question, 但遗憾的是,现在 AutoTouch 还不支持命令行下回放脚本。
那我们只有继续脚本的编写了,假设脚本命名为 toush.sh 吧,编写脚本如下:
OK, 加上如上的注释总共 6 行脚本就解决这个棘手的问题了,但 SimulateTouch 提供的命令要在 iPhone 上执行,所以我们可以通过 SSH 连接 iPhone,然后执行命令。 SSH 连接需要输入密码,为了避免每次跑脚本的过程中,再手动去输入密码,可以通过参考下面链接的步骤实现:
http://hi.baidu.com/youngfragnet/item/405c78009f9708883c42e296
接着把 touch.sh 脚本拷贝到 iPhone 上 SSH 连接默认的目录下,最后,把 SSH 连接,执行 touch.sh 的命令整合到一个 shell 脚本里,取个霸气点的名称,如 kill.sh,假设手机的 IP 地址为 10.32.60.85,编写 kill.sh 如下
至此,所有的精华都浓缩到 kill.sh 脚本里了,需要 kill 进程的地方,调用下 kill.sh 这个 shell 脚本就可以搞定了。
以上实验,在 iPhone 5s , 版本 7.0.4 上进行。
总结
在前面也提到了,SimulateTouch 还提供了在命令行下执行的 stouch swipe,来实现滑动的功能。结合 SimulateTouch 的 stouch touch 和 stouch swipe 命令,我们可以实现屏幕上的单击,双击,左滑,右滑操作。我们可以根据具体的应用场景来组织调用对应的命令,最后封装到 shell 脚本里,来实现我们的需求。需要注意的一点是,在整合这些命令的过程中最好设置间隔等待时间,如上面编写的脚本中出现的 sleep 2s。 这是为了确保前面一个命令执行完毕后才开始后面命令的执行。
通过 SimulateTouch 提供的支持,我们就可以很好的处理被测应用外的操作,弥补了 UI Automation 不能操作应用外的元素这一局限性。接着可以打开如下的链接所示的 UI Automation 的官方 reference 进行被测应用内的自动化操作了。
本文主要介绍了如何实现在脚本中查杀进程,希望对你在 IOS 自动化过程中会有些许帮助。
感谢高嘉峻对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论