实例一 Excel 中验证鼠标悬停时的单元格注释显示
在通常的 GUI 自动化测试中,要完成这一验证,需要编写代码以定位控件、模拟鼠标事件、捕获对象、判断显示结果,实现起来并不轻松。而使用 Sikuli,仅使用下列的简短脚本即可完成这一任务。
图 3. 显示并验证单元格注释
图 3 中所示脚本片段中,从 15-19 行完成了打开 Excel 并创建单元格注释的过程。单元格注释的显示触发和显示验证仅占用了 22-24 三行代码。所调用的 hover() 方法从当前屏幕显示上自动匹配截图参数所示区域,获取其位置,将鼠标指针悬停于该矩形区域的中心位置,激活注释显示。而在 Sikuli“视觉”能力的支持下,验证注释是否正确显示只需用 verifyResult() 方法“一瞥”即可。该方法的实现如图 4 所示,调用 exists() 方法,即能判断当前屏幕中是否显示有相应注释。
图 4. verifyResult() 方法的实现
类似的应用还有控件注释信息的弹出及校验、Web 应用中悬停效果的校验等。
实例二 Web 页面中的多对象选择
本例中,实现了对 Web 页面中多个对象的间隔选取和批量框选。其脚本片段如图 5 所示。
图 5. Web 页面中的多对象选取
该脚本以页面中 12 个数字对象的截图创建带选择对象数组,在 result_list 中列出了期望的选取结果显示。运行时使用 openWeb() 方法自动打开浏览器,进入指定页面。调用 selectObjs() 与 selectRange() 方法的实现 3 种不同的多选方式。脚本中自定义方法的实现,如图 6 所示。
图 6. 自定义方法的实现
selectObjs() 方法中调用 Sikuli 的 click() 方法,以传入的对象截图列表和 Sikuli 定义的 Key Modifier 为参数,实现了按下 Ctrl 键后逐个点击对象完成多选的动作。
SelectRange() 方法则实现了区域性选取。以 obj_from 和 obj_to 参数指定选区的起始位置和结束位置;或仅使用 obj_from 指定起始位置,同时设定水平和垂直方向的偏移量 x、y 来指定选区。调用 dragDrop() 方法,传入起始、结束位置,即可完成区域选择。
验证方式同实例一所述。
实例三 Web 页面中的对象拖拽移位
本例主要应用 Sikuli 的 dragDrop() 方法,实现对象的拖拽移位操作。图 7 中代码所完成的任务即为通过拖拽的方式,将指定的图片移动到 Trash 区域中。
图 7. 拖拽图片至 Trash 区域
该脚本中,在 droppable 数组中定义需要被移入 Trash 的图片,以 Trash 区域的标题栏为搜索目标,用 find() 方法获得 Trash 区域的 Match 类型对象,作为目标区域参数传入 moveTo() 方法。其中 moveTo() 方法查找当前屏幕显示中所有与 obj 参数所传入的图形相匹配的对象,将其拖拽至 des 所指定的区域。其实现如图 8 所示。
图 8. moveTo() 方法的实现
在该方法中,对于图片缩略图应用 exists() 方法进行检索时,进行了图像相似度(取值区间为 0~1)的调整,Sikuli 中缺省情况下的相似度设置为 0.7,为了在图片内容类似的情况下进行正确的区分,可用到 similar() 方法适当提高检索时的相似度,以避免匹配到其他类似区域。
若需确认当前相似度设置下,图像的匹配情况,可在脚本中单击截图对象,激活 Pattern Settings 对话框。在本例中,如单击第 25 行 droppable 中的第二张截图,则弹出对话框如图 9 所示。图中(1)中所标识区域中,有两幅图片分别被红色和紫红色高亮显示。表示在当前的相似度下,这两幅图片均被识别为要寻找的对象。颜色越偏红,则图片与截图的相似度越高,越近似紫色则相似程度越低。调节(2)所标示的 Similarity 滑块,改变相似度设置,则可看到预览区域中的匹配区域的数量及颜色变化,从而以此为依据选择适当的相似度设置,使得程序可以精准唯一地定位目标区域。
图 9. Pattern Settings 对话框
回页首
Sikuli 的优势及局限
Sikuli 为脚本赋予了人类的视角,让计算机不单能够去捕捉后台的接口数据和返回值,而且能如同人眼一般,“看”到一个真实的 GUI 展现。使用者直接在脚本中引用目标 GUI 元素的截图来获取该对象,并指定对其所进行的操作,简单高效。使得 GUI 自动化摆脱了对应用的内部程序实现的依赖,无需获取 API,亦无须了解 GUI 的内部代码实现;忽略了标准控件和非标准控件在操作和获取上的差异性;普遍适用于所有运行在有图形用户界面的操作系统之上的应用,有 GUI 显示的地方即可被获取和操作。实时的图形检索定位,避免了位移和 UI 重排等位置变化造成的无法准确定位并获取控件的问题。Python 语法兼容 +Java 内核,为其赋予了很强的扩展性,同时,Open Source 也让 Sikuli 本身获得了更多的发展机会和空间。使用 GUI 元素截图所编制的 Sikuli 脚本具有良好的代码可读性,这一点从上述实例场景中能够有所体会——在这种简短的脚本中,已基本接近自然语言的表述方式。这样的一种展现形式和特性使得手工测试用例与自动化测试脚本的距离大大缩小,使得这两者之间的自动转化和整合成为可能。
原文转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-sikuli/