Sikuli:创新的图形化编程技术

发表于:2013-09-04来源:IBM作者:朱 杉点击数: 标签:Sikuli
Sikuli:创新的图形化编程技术. 本文将介绍由 MIT 研究团队发布的图形化编程技术 Sikuli。它以图像检索为基础,提供了一套基于 Jython 的脚本语言以及集成开发环境,使用者可利用屏幕截图直接引用 GUI 元素进行编程,完成交互操作。文中将通过其在 GUI 自动化测试中的实

  引言

  在 GUI 测试中,识别个性化控件、模拟用户行为及对校验屏幕显示结果常常成为自动化测试的瓶颈,此类测试场景大多数情况下仍然依赖于手工测试。本文介绍一种新兴的图形化编程技术 Sikuli,它摆脱了对控件 API 的依赖,通过当前屏幕的实时图像检索获取操作对象,模拟用户行为,匹配屏幕区域以校验真实的视觉显示结果。文中将通过其在 GUI 自动化测试中的实际应用分析及程序示例,阐述其带来的应用思路。

  回页首

  Sikuli 是什么

  Sikuli 是由 MIT 的研究团队发布的新型图形化编程技术。它以图像检索技术为基础,提供了一套基于 Jython 的脚本语言以及集成开发环境。使用者可利用屏幕截图直接引用 GUI 元素进行编程,完成交互操作。Sikuli 一词取自墨西哥 Huichol Indian 土著语,意为“上帝之眼”,正如其开发者张琮翔所说—— Sikuli 让电脑能像人一样“看”这个“真实世界”。

  回页首

  Sikuli 的安装与 IDE 使用

  目前 Sikuli 的最新版本为 Sikuli X-1.0rc2。在其 官方网站下载区可获得为 Mac OS X、WindowsLinux 操作系统所提供的安装文件及安装方法简介。

  需注意的是,在 Windows 平台下,要求有 Java 6 的运行环境支持,若要正常使用 1.0rc2 版本中新增的扩展组件 Sikuli Guide,还需更新 Java 至当前最新版本。在 Linux 平台上,除了要安装 Java6 的运行环境之外,还需安装 wmctl 和 opencv2.0 的 libcv4, libcvaux4, libhighgui4 包。

  Sikuli 提供了一个简易的脚本开发环境。缺省界面由菜单栏、工具栏、侧边栏、编辑区、控制台和状态栏六部分组成,如图 1 所示。

  图 1. Sikuli-IDE 界面组成

图 1. Sikuli-IDE 界面组成

  工具栏中提供了两组共计 5 个常用工具按钮及文本搜索框:

屏幕截图(Take screenshot):点击该按钮,进入屏幕截图状态,拖拽辅助线选取需要截取的界面元素,释放鼠标左键的同时,自动将该截图插入到编辑区中光标当前位置。使用快捷键 Ctrl+Shift+2(Command+Shift+2)也可激活截图状态,以完成对于弹出菜单、下拉框一类的控件的实时截图。该快捷键亦可通过主菜单 File->Preferences 进行自定义。
插入图片(Insert image):除直接截图外,用户也可通过点击该按钮导入已有的 PNG 格式图片文件。
建立屏幕区域(Create region):点击该按钮,进入屏幕区域选择状态,拖拽定位十字线选取屏幕区域。释放鼠标左键,即可将当前选中区域的屏幕坐标信息插入到编辑区中。
运行(Run):点击执行当前脚本。快捷键为 Ctrl+R(Command+R)。
慢速运行(Run in slow motion):点击后以较慢的速度执行当前脚本,以红色圆形外框显式标识每一次图像查找定位动作,便于程序调试中进行焦点追踪。快捷键为 Ctrl+Alt+R(Command+Alt+R)。

  左侧侧边栏中分类列出了部分常用函数,点击函数名可快速将其插入到编辑区,若该函数需截图作为参数,则自动转入屏幕截图状态。下方的状态栏可用于查看当前行号,与行首 Tab 缩进的层级 ( 列号 )。

  回页首

  Sikuli 脚本

  Sikuli 的脚本编写遵循 Python 语法规范,其本身提供了多种自定义类及其自定义方法,其详细介绍可参见其 官方网站文档。由于 Sikuli 基于 Jython,其核心代码由 Java 编写,可在用户自定义的 Java 工程中将其作为 Java 标准类库进行引用,其官方网站亦提供了 JavaDoc供参考。

  这里先通过一个自动打开 Firefox 浏览器,并登录 Gmail 的简单实例来快速一览 Sikuli 脚本的独特之处。

  图 2. 自动登录 Gmail

图 2. 自动登录 Gmail

  上图所示的 Sikuli 脚本首先单击展开开始菜单,接着单击 Firefox 图标启动浏览器。待 Firefox 的工具栏出现后,以工具栏位置为基准,向右偏移 300 的距离以定位到地址栏并鼠标单击将光标置入地址栏,然后在地址栏中输入 gmail 网址。待登录界面出现,单击用户名输入框并输入用户名信息,然后键入 Tab 键,使密码输入框获得焦点并输入密码信息,最后单击 Sign in 按钮完成登录。

  从该示例脚本中不难发现 Sikuli 最显著的特色——将 GUI 对象的屏幕截图作为函数的参数直接引用,整个代码的语义清晰明了,可读性极强。脚本执行过程中,利用图像检索算法分析匹配当前屏幕中对应的控件,并对其应用相应的鼠标或键盘操作。这种方式使得我们在脚本编写时,既无需关心繁琐的应用程序相关 API 亦不用获取 Web 内容对象。

  编辑完成的 Sikuli 脚本可通过 File -> Save 进行保存。在 Windows 平台上将保存为一个后缀为 .sikuli 的文件夹,其中包括脚本中所使用到的所有 PNG 图片、.py 后缀的源代码以及一份显示源码的 HTML 文件。

  编写调试完成的 Sikuli 脚本最终可通过菜单 File->Export executable 生成以 .skl 为后缀的可执行文件。生成这种格式的可执行文件后,使用命令行工具或直接双击该文件即可便捷地运行该脚本了。

  回页首

  Sikuli 的应用实例

  Sikuli 的出现,给 GUI 自动化测试提供了新的思路。通常情况下针对 GUI 的自动化测试多通过其 API 识别并获取 GUI 对象,进而对其进行操作;对于 GUI 显示的校验则通过指定其在屏幕上的绝对位置坐标并匹配对应位置上的实际像素来完成。前者精准但复杂度相对较高,其局限在于需要了解 GUI 内部的代码实现,依赖于 API 的开放性,所要验证的对象未必能够被成功获取;后者则对 GUI 元素本身的绝对位置有着严格的要求,缺乏灵活度和对 GUI 位移的包容能力,一个细微的对象位置变化即可能严重影响校验的结果,但在实际应用场景下,GUI 对象大小、位置变化和 UI 的重排的情况较为常见,使得这种验证方式的稳定性和可靠性随之降低。而 Sikuli 的工作方式完全契合了这两类场景下的需求,可大幅地简化操作和验证过程。接下来通过几个实例来展示如何在一些典型用例中使用 Sikuli 快速完成 GUI 自动化。

原文转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-sikuli/