SikuliX 简介
Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的自动化测试技术。它与我们常用的自动化测试技术(工具)有很大的区别。
当你看到上图sikuli的脚本时,一定会惊呼,这样都可以!脚本加截图。
OK ,在惊讶过后,我们一起来大体的了解一下这个技术。
什么是Sikuli?
Sikuli脚本自动化,你在屏幕上看到的任何东西。它使用图像识别,识别和控制GUI组件。这是有用的,当有一个GUI的内部或源代码的访问是不容易的。
Sikuli(在墨西哥维乔印第安人的语言里是”上帝之眼”的意思)是由美国麻省理工学院开发的一种最新编程技术,使得编程人员可以使用截图替代代码,从而简化代码的编写流程。从它研究方向上看,是一种编程技术,但是该技术还可以用于进行大规模的程序测试,脚本程序编写使用的是python语言。
谁正在开发的Sikuli脚本?
Sikuli是一个开放源码的最初的用户界面设计组织 在麻省理工学院的研究项目 。现在是保持并进一步 协调与开源社区开发的Sikuli实验室在美国科罗拉多州博尔德大学。这是支持的,部分由国家科学基金会奖IIS-0447800,广达电脑的一部分的TParty项目。Sikuli 的MIT许可证下发布的 。
Sikuli 可以采用Python 来做为脚本语言, 当然,你如果熟悉Python 的话,相信你对sikuli 的上手非常快。当然,你也可以使用sikuli的java API 使其在java 环境下运行。
下载安装
- 下载安装包“sikulixsetup-1.1.0.jar”,网址:https://launchpad.net/sikuli/sikulix/1.1.0
- 将安装包拷贝到安装目录下,如
D:\Sikuli1.1
在命令行里运行
java jar sikulixsetup-1.1.0.jar
或直接双击打开,弹出安装向导:title= 仔细阅读每项的说明,再选择安装项,建议先阅读 http://www.sikulix.com/quickstart.html 里的内容。
选择好安装项后,单击[Setup Now]进行安装。- 在弹出的向导框里选择[Yes]下载需要的安装文件。
title= 确认是否下载Jython,单击[Yes]开始下载Jython
title= 说明:如果觉得在线下载不方便,可以在安装前去https://launchpad.net/raiman/sikulix2013+/1.1.0 将
sikulixlibswin.jar
,sikulixsetupAPI-1.1.0-forsetup.jar
和sikulixsetupIDE-1.1.0-forsetup.jar
下载好,并和sikulixsetup-1.1.0.jar
放到同一目录(例如:D:\Sikuli1.1)下,这样在安装过程中,Sikuli会自动检测是否有下载好的jar包,如果有它会直接使用已下载好的jar包。- 文件下载完成后,就会开始自动安装。
- 安装完成后,会提示如下信息:
title=
安装向导会提示如下信息:title= 安装完成后,在安装目录下应该有5个文件:
- runsikulix.cmd:用来启动Sikuli IDE
- sikulix.jar:Sikuli IDE需要用到的jar包
- SikuliX-1.1.0-SetupLog.txt:SikuliX安装的日志文件
- sikulixapi.jar:Java API
- sikulixsetup-1.1.0.jar:SikuliX安装包
界面介绍
上面已经安装完成,运行界面如下:
菜单栏与工具栏
屏幕截图(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 的界面,下面来做一个自动化的小例子。(官方的第一个小例子为开始运行里输入hello world )这里为打开360极速浏览器(默认为百度首页),搜索框里输入sikuli ,然后点击“百度一下”按钮搜索。
- 点击桌面360极速浏览器图标。
方法一,输入双击函数doubleClick(),然后通过截图工具对桌面图标截图,输入。
方法二很快捷,点击窗口左侧双击函数doubleClick(),直接进入截图状态。截图完成后直接添加函数到脚本编辑区域。
- 我们依然用第二种快捷的方式,点击左侧type(图标,text) 函数,这次截取的对象为百度首页的输入框。
因为,默认定位的焦点为图片的中心,我们要输入的位置在输入框的左侧,所以需要对焦点进行调整。直拉点击截图的输入框图片。
当然,在这个窗口中,我们也可调整图片的匹配度,匹配度越低容错能力越强。这里来简单解释一下:
大家知道ie7 与 ie8 的图标虽然相似,但还是有所差别的。为了使脚本的移植性更强。比如本机是用IE7 录制的脚本,移植到另一台电脑上只有IE 8 ,因为精确度调低,脚本也会把IE8 当IE 7 来执行。当然有些情况下调低并不好,比如桌面上有两个图标非常相识,那么精确度调整的很低,那么脚本就无法辨认谁是谁了。
- 这一步与第一步一样,不过这里要使用的函数是单击函数click() ,点击“百度一下”按钮。
使用 Java API
常用Sikuli方法
方法说明 | 方法解释 | 语法 | 示例 |
---|---|---|---|
创建Screen类对象 | Screen是由Sikuli提供一个基类。我们需要首先创建该Screen类的对象,才可以访问所有Sikuli提供的方法。 | Screen s=new Screen(); | 同语法 |
单击一个元素 | 此方法用于点击屏幕上的特定图像。 | s.click(“<>”); | s.click(“test.png”); |
右键单击一个元素 | 此方法用来右键点击屏幕上的特定图像。 | s.rightClick(“<>”); | s.rightClick(“test.png”); |
查找元素 | 此方法用于查找屏幕上的特定元素存在。 | s.find(“<>”); | s.find(“test.png”); |
双击一个元素 | 此方法用于触发屏幕上特定图像的双击事件 | s.doubleClick(“<>”); | s.doubleClick(“test.png”); |
检查元素是否在屏幕上显示 | 这个方法是用来检查指定的元素是否存在于屏幕上。 | s.exists(“<>”); | s.exists(“test.png”); |
在文本框输入一个字符串 | 这种方法是用来在文本框输入指定的文本。 | s.type(“<>”,”String to be typed”); | s.type(“test.png”,“HI!!”); |
旋转指定的图像 | 这个方法是用来对图形元素进行旋转操作。 | s.wheel(“<>”,<>,<>); | s.wheel(“test.png”,25,0); |
拖放图片 | 这个方法是用来将图片从源位置拖放到目标位置的。 | s.dragDrop(“<>”,”<>”); | s.dragDrop(“test.png”,“test1.png”); |
特定图像的滚动鼠标悬停 | 这个方法是用来对特定图像进行滚动悬停事件。 | s.hover(“<>”); | s.hover(“test.png”); |
粘贴复制的字符串 | 这个方法用来在指定的文本框中粘贴文本。 | s.paste(“<>”,”test”); | s.paste(“test.png”,“测试”); |
使用示例
YouTube影片的暂停和播放视频
打开YouTube视频链接,并使用屏幕捕获工具捕获播放和暂停元素的图像。
暂停按钮(注意:文件名pause.png)
播放按钮(注意:文件名play.png)
复制这些图片到你的项目中。
package com.test;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class Youtube {
public static void main(String[] args) throws FindFailed, InterruptedException {
Screen s=new Screen();
s.find("pause.png"); //identify pause button
s.click("pause.png"); //click pause button
System.out.println("pause button clicked");
s.find("play.png"); //identify play button
s.click("play.png"); //click play button
}
}
打开记事本,输入一些文字
捕获屏幕上的桌面记事本图标。
文件名:notepad_icon.png
文件名:notepad.png
复制这些图片到你的项目中。
package com.test;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class NotepadExample {
public static void main(String[] args) throws FindFailed {
Screen s=new Screen();
s.click("notepad_icon.png");
s.find("notepad.png");
s.type("notepad.png","This is Nice Sikuli Tutorial!!!!");
}
}
拖放
通过屏幕截图截取屏幕上所需的项目,并将其放入sikuli项目中。
文件名:source.png
文件名:destination.png
把这些图片放入你的项目中。
package com.test;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class DragAndDrop {
public static void main(String[] args) throws FindFailed, InterruptedException {
Screen s=new Screen();
s.find("source.png");
System.out.println("Source image found");
s.find("target.png");
System.out.println("target image found");
s.dragDrop("source.png", "target.png");
}
}
执行该脚本后,下载的图标将被拖放到图像上,显示为目标。
执行前
执行后
优缺点
优点
- 开源工具。
- 一个Sikuli的最大优势在于,它可以轻松地自动化Flash对象。
- 它使自动化Windows应用程序易于实现。
- 当你测试正在开发的一个应用程序,你不知道的元素的ID/名称,那么你可以用Sikuli。它将检查图像的外观,如果发现匹配,将相应的与图像进行交互。
- 整体上sikuli小巧、便捷、容易上手。
- sikuli脚本可以不经过API的编译器直接自动化搜索到任何你能在屏幕上看到的东西。
- 对各种程序都适合。
- 不存在标准控件和非标准控件的问题。
- 相对位置概念较小,要求不高(但是对象本身尺寸有影响)。
- 一次编码,多次运行(基于java的)。
- Jython和Java的支持,用编程的方式比较容易扩展。
缺点
- 我们不能保证图像匹配的将是永远准确的。有时,如果屏幕上有两个或更多类似的图像,Sikuli将可能选择错误的图像。
- 如果图像在像素尺寸方面有所变化,也可能导致“查找失败”的异常。
- 过多的截图带来的开销。
- 如截图中的任何一个缺失,会影响程序的执行。
- 图片的分辨率、色彩、尺寸、唯一性对程序的影响 (如果有两个相同的,无法区分具体哪一个)。
- sikuli本身还不完善(处于开发、升级阶段),还有很多程序bug,能否继续发展还是未知数。
- 只认识当前活动的图标(只有当前桌面有才行)。
- 用例组织方面有提供但是目前有bug。
- 采用截图方式,脚本存储占用空间较大。
- 相似度调整需要手动一个个的调整,工作量大。
- 目前还不适合设计成一种测试框架。
- 测试报告的生成,直接用message的话比较弱。但可以使用Jython编程实现拓展功能。
实际用途
- Sikuli可以用来自动化Flash对象或Flash网站。
- 它可以运用于自动化基于窗口的应用程序。我们可以自动化我们在屏幕上所看到的。
- 它提供了简单的API,即所有的方法都可以使用屏幕类对象进行访问。
- 它可以简单地与Selenium和所有其他工具集成。
- 使用Sikuli我们可以自动化桌面应用程序。
- 大多数的自动化测试工具不支持flash对象自动化(如Selenium)。Sikuli为自动化Flash对象提供了广泛的支持。
- 它采用强大的“视觉匹配”机制来自动化桌面和Flash对象。
更多的资源:
本文部分内容来自以下网址: