登录后台

页面导航

本文编写于 1317 天前,最后修改于 264 天前,其中某些信息可能已经过时。

SikuliX 简介

Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的自动化测试技术。它与我们常用的自动化测试技术(工具)有很大的区别。

https://blog.yeskery.com/usr/uploads/2017/11/Sikuli_View.jpg

当你看到上图sikuli的脚本时,一定会惊呼,这样都可以!脚本加截图。

OK ,在惊讶过后,我们一起来大体的了解一下这个技术。

什么是Sikuli?

Sikuli脚本自动化,你在屏幕上看到的任何东西。它使用图像识别,识别和控制GUI组件。这是有用的,当有一个GUI的内部或源代码的访问是不容易的。

Sikuli(在墨西哥维乔印第安人的语言里是”上帝之眼”的意思)是由美国麻省理工学院开发的一种最新编程技术,使得编程人员可以使用截图替代代码,从而简化代码的编写流程。从它研究方向上看,是一种编程技术,但是该技术还可以用于进行大规模的程序测试,脚本程序编写使用的是python语言。

谁正在开发的Sikuli脚本?

Sikuli是一个开放源码的最初的用户界面设计组织 在麻省理工学院的研究项目 。现在是保持并进一步 协调与开源社区开发的Sikuli实验室在美国科罗拉多州博尔德大学。这是支持的,部分由国家科学基金会奖IIS-0447800,广达电脑的一部分的TParty项目。Sikuli 的MIT许可证下发布的 。

官网:http://www.sikuli.org/

Sikuli 可以采用Python 来做为脚本语言, 当然,你如果熟悉Python 的话,相信你对sikuli 的上手非常快。当然,你也可以使用sikuli的java API 使其在java 环境下运行。

下载安装

  1. 下载安装包“sikulixsetup-1.1.0.jar”,网址:https://launchpad.net/sikuli/sikulix/1.1.0
  2. 将安装包拷贝到安装目录下,如D:\Sikuli1.1
  3. 在命令行里运行java jar sikulixsetup-1.1.0.jar或直接双击打开,弹出安装向导:
    https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_install_setup.jpg

仔细阅读每项的说明,再选择安装项,建议先阅读 http://www.sikulix.com/quickstart.html 里的内容。

选择好安装项后,单击[Setup Now]进行安装。

  1. 在弹出的向导框里选择[Yes]下载需要的安装文件。
    https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_install_setup_question.jpg
  2. 确认是否下载Jython,单击[Yes]开始下载Jython
    https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_install_Jython.jpg

说明:如果觉得在线下载不方便,可以在安装前去https://launchpad.net/raiman/sikulix2013+/1.1.0sikulixlibswin.jarsikulixsetupAPI-1.1.0-forsetup.jarsikulixsetupIDE-1.1.0-forsetup.jar下载好,并和sikulixsetup-1.1.0.jar放到同一目录(例如:D:Sikuli1.1)下,这样在安装过程中,Sikuli会自动检测是否有下载好的jar包,如果有它会直接使用已下载好的jar包。

  1. 文件下载完成后,就会开始自动安装。
  2. 安装完成后,会提示如下信息:
    https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_install_success_1.png

安装向导会提示如下信息:

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_install_success_2.png

  1. 安装完成后,在安装目录下应该有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安装包

界面介绍

上面已经安装完成,运行界面如下:

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_run_view.jpg

菜单栏与工具栏

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_run_menu.jpg

屏幕截图(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)。

窗体

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_run_view_body.jpg

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

右边区域上半部分为脚本编辑区域,我们的自测化测试脚本就是在这个区域编写完成。

下半部分为提示信息,不管运行成功与失败,都会给出相应的提示信息。

使用示例

大体上了解sikuli 的界面,下面来做一个自动化的小例子。(官方的第一个小例子为开始运行里输入hello world )这里为打开360极速浏览器(默认为百度首页),搜索框里输入sikuli ,然后点击“百度一下”按钮搜索。

  1. 点击桌面360极速浏览器图标。

方法一,输入双击函数doubleClick(),然后通过截图工具对桌面图标截图,输入。

方法二很快捷,点击窗口左侧双击函数doubleClick(),直接进入截图状态。截图完成后直接添加函数到脚本编辑区域。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_example_click.jpg

  1. 我们依然用第二种快捷的方式,点击左侧type(图标,text) 函数,这次截取的对象为百度首页的输入框。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_example_type.jpg

因为,默认定位的焦点为图片的中心,我们要输入的位置在输入框的左侧,所以需要对焦点进行调整。直拉点击截图的输入框图片。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_example_offset.jpg

当然,在这个窗口中,我们也可调整图片的匹配度,匹配度越低容错能力越强。这里来简单解释一下:

大家知道ie7 与 ie8 的图标虽然相似,但还是有所差别的。为了使脚本的移植性更强。比如本机是用IE7 录制的脚本,移植到另一台电脑上只有IE 8 ,因为精确度调低,脚本也会把IE8 当IE 7 来执行。当然有些情况下调低并不好,比如桌面上有两个图标非常相识,那么精确度调整的很低,那么脚本就无法辨认谁是谁了。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_example_preview.jpg

  1. 这一步与第一步一样,不过这里要使用的函数是单击函数click() ,点击“百度一下”按钮。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_example_code.jpg

使用 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)

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_youtube_pause.jpg

播放按钮(注意:文件名play.png)

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_youtube_play.jpg

复制这些图片到你的项目中。

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
    }
}

打开记事本,输入一些文字

捕获屏幕上的桌面记事本图标。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_notebook_icon.jpg

文件名:notepad_icon.png

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_notebook.jpg

文件名: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项目中。

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_folder.jpg

文件名:source.png

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_folder_flowers.jpg

文件名: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");
    }
}

执行该脚本后,下载的图标将被拖放到图像上,显示为目标。

执行前

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_run_before.jpg

执行后

https://blog.yeskery.com/usr/uploads/2017/11/SikuliX_java_run_after.jpg

优缺点

  • 优点

    • 开源工具。
    • 一个Sikuli的最大优势在于,它可以轻松地自动化Flash对象。
    • 它使自动化Windows应用程序易于实现。
    • 当你测试正在开发的一个应用程序,你不知道的元素的ID/名称,那么你可以用Sikuli。它将检查图像的外观,如果发现匹配,将相应的与图像进行交互。
    • 整体上sikuli小巧、便捷、容易上手。
    • sikuli脚本可以不经过API的编译器直接自动化搜索到任何你能在屏幕上看到的东西。
    • 对各种程序都适合。
    • 不存在标准控件和非标准控件的问题。
    • 相对位置概念较小,要求不高(但是对象本身尺寸有影响)。
    • 一次编码,多次运行(基于java的)。
    • Jython和Java的支持,用编程的方式比较容易扩展。
  • 缺点

    • 我们不能保证图像匹配的将是永远准确的。有时,如果屏幕上有两个或更多类似的图像,Sikuli将可能选择错误的图像。
    • 如果图像在像素尺寸方面有所变化,也可能导致“查找失败”的异常。
    • 过多的截图带来的开销。
    • 如截图中的任何一个缺失,会影响程序的执行。
    • 图片的分辨率、色彩、尺寸、唯一性对程序的影响 (如果有两个相同的,无法区分具体哪一个)。
    • sikuli本身还不完善(处于开发、升级阶段),还有很多程序bug,能否继续发展还是未知数。
    • 只认识当前活动的图标(只有当前桌面有才行)。
    • 用例组织方面有提供但是目前有bug。
    • 采用截图方式,脚本存储占用空间较大。
    • 相似度调整需要手动一个个的调整,工作量大。
    • 目前还不适合设计成一种测试框架。
    • 测试报告的生成,直接用message的话比较弱。但可以使用Jython编程实现拓展功能。

实际用途

  1. Sikuli可以用来自动化Flash对象或Flash网站。
  2. 它可以运用于自动化基于窗口的应用程序。我们可以自动化我们在屏幕上所看到的。
  3. 它提供了简单的API,即所有的方法都可以使用屏幕类对象进行访问。
  4. 它可以简单地与Selenium和所有其他工具集成。
  5. 使用Sikuli我们可以自动化桌面应用程序。
  6. 大多数的自动化测试工具不支持flash对象自动化(如Selenium)。Sikuli为自动化Flash对象提供了广泛的支持。
  7. 它采用强大的“视觉匹配”机制来自动化桌面和Flash对象。

更多的资源

  1. 简单Sikuli例子在这里
  2. 更多视频教程在这里
  3. 详细Sikuli文档在这里

本文部分内容来自以下网址:

  1. http://blog.csdn.net/defectfinder/article/details/49819215
  2. https://www.cnblogs.com/fnng/archive/2012/12/15/2819367.html
  3. https://www.testwo.com/article/299