yeskery

SikuliX 的安装与使用

SikuliX 简介

Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的自动化测试技术。它与我们常用的自动化测试技术(工具)有很大的区别。
https://static.yeskery.com/blog/images/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://static.yeskery.com/blog/images/2017/11/SikuliX_install_setup.jpg

    仔细阅读每项的说明,再选择安装项,建议先阅读 http://www.sikulix.com/quickstart.html 里的内容。
    选择好安装项后,单击[Setup Now]进行安装。

  4. 在弹出的向导框里选择[Yes]下载需要的安装文件。
    https://static.yeskery.com/blog/images/2017/11/SikuliX_install_setup_question.jpg

  5. 确认是否下载Jython,单击[Yes]开始下载Jython
    https://static.yeskery.com/blog/images/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包。

  6. 文件下载完成后,就会开始自动安装。

  7. 安装完成后,会提示如下信息:
    https://static.yeskery.com/blog/images/2017/11/SikuliX_install_success_1.png
    安装向导会提示如下信息:
    https://static.yeskery.com/blog/images/2017/11/SikuliX_install_success_2.png

  8. 安装完成后,在安装目录下应该有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://static.yeskery.com/blog/images/2017/11/SikuliX_run_view.jpg

菜单栏与工具栏

https://static.yeskery.com/blog/images/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://static.yeskery.com/blog/images/2017/11/SikuliX_run_view_body.jpg

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

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

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

使用示例

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

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

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

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

https://static.yeskery.com/blog/images/2017/11/SikuliX_example_click.jpg

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

https://static.yeskery.com/blog/images/2017/11/SikuliX_example_type.jpg

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

https://static.yeskery.com/blog/images/2017/11/SikuliX_example_offset.jpg

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

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

https://static.yeskery.com/blog/images/2017/11/SikuliX_example_preview.jpg

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

https://static.yeskery.com/blog/images/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://static.yeskery.com/blog/images/2017/11/SikuliX_java_youtube_pause.jpg

播放按钮(注意:文件名play.png)
https://static.yeskery.com/blog/images/2017/11/SikuliX_java_youtube_play.jpg

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

  1. package com.test;
  2. import org.sikuli.script.FindFailed;
  3. import org.sikuli.script.Screen;
  4. public class Youtube {
  5. public static void main(String[] args) throws FindFailed, InterruptedException {
  6. Screen s=new Screen();
  7. s.find("pause.png"); //identify pause button
  8. s.click("pause.png"); //click pause button
  9. System.out.println("pause button clicked");
  10. s.find("play.png"); //identify play button
  11. s.click("play.png"); //click play button
  12. }
  13. }

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

捕获屏幕上的桌面记事本图标。
https://static.yeskery.com/blog/images/2017/11/SikuliX_java_notebook_icon.jpg

文件名:notepad_icon.png

https://static.yeskery.com/blog/images/2017/11/SikuliX_java_notebook.jpg

文件名:notepad.png

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

  1. package com.test;
  2. import org.sikuli.script.FindFailed;
  3. import org.sikuli.script.Screen;
  4. public class NotepadExample {
  5. public static void main(String[] args) throws FindFailed {
  6. Screen s=new Screen();
  7. s.click("notepad_icon.png");
  8. s.find("notepad.png");
  9. s.type("notepad.png","This is Nice Sikuli Tutorial!!!!");
  10. }
  11. }

拖放

通过屏幕截图截取屏幕上所需的项目,并将其放入sikuli项目中。

https://static.yeskery.com/blog/images/2017/11/SikuliX_java_folder.jpg

文件名:source.png

https://static.yeskery.com/blog/images/2017/11/SikuliX_java_folder_flowers.jpg

文件名:destination.png

把这些图片放入你的项目中。

  1. package com.test;
  2. import org.sikuli.script.FindFailed;
  3. import org.sikuli.script.Screen;
  4. public class DragAndDrop {
  5. public static void main(String[] args) throws FindFailed, InterruptedException {
  6. Screen s=new Screen();
  7. s.find("source.png");
  8. System.out.println("Source image found");
  9. s.find("target.png");
  10. System.out.println("target image found");
  11. s.dragDrop("source.png", "target.png");
  12. }
  13. }

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

执行前
https://static.yeskery.com/blog/images/2017/11/SikuliX_java_run_before.jpg

执行后
https://static.yeskery.com/blog/images/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

评论

发表评论 点击刷新验证码

提示

该功能暂未开放