移动测试开发 Sikuli 基于图形识别的自动化测试技术
作为一名测试人员,测试过程如果遇到应用程序界面结构庞大,页面设计频繁变动,对页面元素定位比较困难的的情况,又需要进行大量重复操作的测试,我们有什么快速解决问题的方法呢?也许 Sikuli 可以成为你的选择之一,它可以让你摆脱对控件 API 的依赖,通过实时检索当前屏幕的图像,获取可操作对象,模拟用户行为,校验真实的屏幕展示结果。
什么是 Sikuli?
Sikuli 自动化测试,是将屏幕上展示的内容,通过图像识别,用来定位到元素的位置,并进行操作 GUI 组件,最后也可以通过识别图片中的内容来判断操作是否成功。这样使得测试人员可以通过截图来代替编写代码,从而降低测试成本,简化编写测试脚本的流程。
Sikuli 是在墨西哥维乔印第安人的语言里是” 上帝之眼” 的意思,目标是让电脑能像人一样去看真实的世界,并与之交互。
Sikuli 的开发者
Sikuli 是一个开放源码的最初的用户界面设计组织在麻省理工学院的研究项目,现在是保持并进一步协调与开源社区开发的 Sikuli 实验室在美国科罗拉多州博尔德大学。这是支持的,部分由国家科学基金会奖 IIS-0447800,广达电脑的一部分的 TParty 项目。Sikuli 的 MIT 许可证下发布的。
下载和安装
版本 1.1.3 以下官方下载页面是https://launchpad.net/sikuli/sikulix
新版本的 1.1.4 以上在https://raiman.github.io/SikuliX1/downloads.html
如果使用 1.1.3 版本以下的,下载文件中直接双击打开 sikulix.jar 文件便是 sikuli 提供 IDE,可以进行拖拽式的编写方式,如下所示:
这种方式运行时要依赖于 IDE,不方便使用脚本启动去执行测试,所以有另外两种方式,直接编写 python 脚本来执行。
方式一:纯 python 环境---Lackey 库
Lackey 是 Python 的一个自动化库,专为易用性和 Sikuli 自动化脚本的交叉兼容而生。它提供了一个简单但强大的 API,用来查找屏幕上的图片,以及使用鼠标和键盘的基本用户输入。
Lackey 依赖库:
numpy
pillow
opencv
keyboard
安装命令:pip install Lackey
脚本中导入方式:from lackey import *
该库支持截图类型有.bmp, .pbm, .ras, .jpg, .tiff, and .png
主要的接口有:
find(“.png”):查找元素,不存在抛出异常
exists(“.png”):查找元素,返回 true 或 false
wait(“.png”,5):等待指定秒数,查找元素
click(“.png”):点击元素
dubleClick(“***.png”):双击元素
input_(“text”):输入文本
实现了一个类似 monkey 工具的脚本示例如下 (将所有截图放在工程里的 btn_pictrues 目录下即可):
方式二:写 python 脚本调用 sikulixapi.jar 中的 API
环境准备:
1、安装 jython: pip install JPype1
2、安装 VCForPython27
3、安装 JDK,并配置%JAVA_HOME%
示例脚本:
可能遇到的坑:
1、调用 getDefaultJVMPath,找不到 JAVA_HOME;或者启动 java 虚拟机会崩溃。可能是由于 java 和 python 安装版本位数不同导致的,两个同为 32 位或者 64 位软件才能正常运行。
注: 使用 java -d32 或者 -d64 查看 32 还是 64 位;终端中输入 python,如下图查看查看 32 还是 64 位。
总结:
Sikuli 的优点是简单容易上手,支持多种编程语言(python/java),但是缺点也很明显。图片的分辨率色彩和尺寸等对程序执行结果影响很大,一台设备上执行成功的脚本可能一直到另一台设备上不能成功,需要重新截图。而且只能检测当前桌面上显示的内容,后台进程无法操作,pc 端的所有用户操作并没有完全支持,sikuli 本身还不完善,还在开发升级阶段。所以使用 sikuli 完成复杂的大型自动化测试,还不是一个最佳选择,但是它小而美的特点还是可以应用于测试的很多场景的。