Sikuli: 初探

Sikuli是由MIT计算机科学及人工智能实验室(CSAIL)开发的基于图像识别的GUI自动化工具,由Sikuli脚本、一套可视化脚本编程API(Jython)以及Sikuli IDE三个部分组成。与其他的一些GUI自动化工具不同,Sikuli仅对GUI系统中的图像元素进行扫描识别,而不需要GUI组件的源代码。因此,理论上Sikuli支持所有GUI系统的自动化操作–从网页、各种桌面应用程序,到iPhone/Android平台上的移动应用。

一个简单的Sikuli程序是非常容易编写的。以下是官方网站上的一个例子: sikuli_example

你看出来这个脚本程序干了一件什么事情了吗?是的,这个脚本选择了手动配置的方式来配置IP地址、子网掩码及网关,最后按下了Apply按钮使配置生效。

这一切看起来都非常简单,即使没有任何编程经验,也很容易上手。

有一个问题经常会被问到:上面这个Sikuli程序中的截图是怎么弄出来的?既然Sikuli是基于对截图的模式识别,那么任何一个正儿八经的Sikuli程序必然包含比较多的截图。如果对于每一个截图,都需要Print Screen后做手工裁剪的话,那就太麻烦了。

幸运的是,Sikuli提供了便捷的截图功能,可以在Sikuli IDE中点击”屏幕截图”,在屏幕变灰之后用鼠标选中截图区域即可。”屏幕截图”的快捷键是Ctrl+Shift+2(可以在Sikuli IDE中修改),对于某些UI操作的模拟,使用快捷键是唯一的选择(比如:点击下拉菜单中的某个条目)。

Sikuli是基于Jython的,因此Sikuli脚本中使用的语言是Python(同时可以调Java类库),而这意味着Sikuli可以做Python和Java能做的任何事情。下面是一张Sikuli的技术架构图,可以看到,里面用到了OpenCV:
sikuli_design

那么Sikuli适合用来干什么呢?

首先,作为GUI自动化工具,Sikuli可以用来进行产品界面的自动化测试,确保所有的GUI组件都能够正常工作。Sikuli的脚本编写以及执行不需要待测试产品的源代码,因此尤其适合那些UI技术比较复杂的产品。

其次,Sikuli可以对产品界面进行性能测试。由于Sikuli是基于图像识别的,究其本质与手工测试中的人眼识别没什么不同,因此其测试结果更为准确(为了避免Sikuli工具本身对性能数据的影响,编写/执行Sikuli的GUI性能测试脚本需要一点小技巧,希望有时间能在另外一篇文章中就这个主题做一些探讨)。

Sikuli还可以用来辅助一下日常生活中的计算机操作,比如:在社交网站或者即时通讯软件的界面上等待某人上线,玩愤怒的小鸟(当你对”小鸟”的某一关感到绝望的时候不妨试一试),偷菜或者刷微博等等。

而Sikuli有哪些需要改进的地方呢?

我个人认为,Sikuli最需要改进的还是它的图片识别的准确率。平心而论,目前的Sikuli版本(1.0rc3)在图像识别上做的还是比较好的,但是假阴性和假阳性还是时有发生(识别不出来/误识别),尤其在以下两种情况下,错误率较高:

  1. 对于已经编写好的用于产品界面测试的Sikuli脚本,当产品升级或者测试机器更换之后(在肉眼看来界面并未改变),试图重新从头到尾跑通Sikuli脚本将会比较困难 –在这种情况下,假阴性(识别不出来)的概率比较大。Sikuli取了相似度0.7作为判断是否成功识别的阈值,相信取这个值是经过了一番探索与考量的。虽然可以更改单个图片的相似度阈值,但遗憾的是,Sikuli不提供更改全局阈值的功能。
  2. 对于文字较多的图片,Sikuli识别起来会有一定的困难。

值得一提的是,Sikuli的主要开发者张琮翔是中国(台湾)人,以下是他的博客:vgod’s blog