sikuli实战记录
最近,为了解放运营人力,需要对某国企的系统进行自动化操作。该系统使用的是https,需要加载证书,而且非得用IE才行,firefox无法正常的加载证书。而selenium启动的IE是纯净的,不会加载任何东西。关于selenium如何能够支持对https的系统进行测试,这个还需要研究。而对这个系统进行自动化操作,只是个权宜之计,所以不打算在这上面浪费过多的成本,前段时间对sikuli也做了一些了解,这回就考虑使用sikuli迅速开发一个脚本,顺便进行一次实战的检查。
1、安装
1)下载sikuli的IDE——sikuli X,并安装。可在sikuli x的官网下载,戳我。
2)在PATH中添加sikuli x下libs路径。
如果没有设置,在运行时,会出现如下提示:Getting the VisionProxy.dll: Can not find dependent libraries
3)准备好一个32位的jre 1.7。
由于目前sikuli只支持32位的jre,如果使用64位,在运行时,会出现问题:Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform。
2、开发
1)在eclipse中建一个marven工程。因为最后是准备产出一个jar包来执行,所以选择quickstart。
是否marven无所谓,只是个人习惯了而已。

2)配置依赖包
由于marven的托管库中没有sikuli-script,所以需要使用sikuli x中的sikuli-script.jar,加入marven的本地仓库,或者导入build path中。
3)修改工程的jre为32位的jre 1.7。
4)开发脚本
功能:在博客园首页右上角的找找看中输入“你好”,然后点击找找看,进行搜索。Java中的示例如下:
public class App
{
private final static String SIKULI_PIC_PATH = "C:\\Users\\shifeng\\Documents\\博客图片\\";
private final static String SEARCH_PIC = "search.png"; public static void main( String[] args )
{
Screen s = new Screen();
Pattern search = new Pattern(SIKULI_PIC_PATH + SEARCH_PIC);
try {
s.click(search.targetOffset(-148, 3));
s.paste("你好");
s.click(search.targetOffset(117, 3));
} catch (FindFailed e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其实sikuli的逻辑很简单,就是初始化一个屏幕,然后匹配图片,对图片区域进行操作。各种花样就是在如何匹配和如何操作。
实战中我碰到的有意思的事情,主要有三点:
a、如果需要指定点击的具体坐标,需要使用click(patten.targetoffset(x, y))。
b、如果需要输入中文,type()是没有办法的,需要使用paste()。
c、当无法使用pagedown或pageup按键滚动页时,通过s.click(Key.TAB),即模拟tab键来切换控件,达到滚动的目的。
3、运行
1)打jar包。
这个比较简单。因为我是有main函数的,所以选择导出为Runnable JAR file,并选择launch configuration;Library handling中,选择第二个。
2)运行jar包
通过以下命令运行到处的jar包:
C:\jre1.7.0_21\bin\java -Dfile.encoding=utf-8 -jar test.jar
我没有去修改java的环境变量,所以指定了java的路径。
在命令中添加参数 -Dfile.encoding=utf-8,是因为工程的编码格式utf-8,如果没有指定运行时的编码格式,会导致在sikuli录入中文时,录入乱码。命令中的“-D”用来设置系统变量值。
另外在运行时,曾遇到过“找不到主清单属性”的问题。这是由于导出时没有指定接口类。在jar包中的META-INF中,有一个MANIFEST.MF。该文件为一个清单文件,用于记录配置信息。按道理,eclipse导出时,是需要指定launch configuration,不应该出现这个问题。不过后来问题一直没有复现过,所以也无法追查了。这里只是记录下当时的处理过程。
在我的jar包中,包含如下属性
Manifest-Version:用来定义manifest文件的版本
Rsrc-Class-Path:没有查询到具体的含义,但猜测用于设置依赖包的路径
Class-Path:应用程序或者类装载器使用该值来构建内部的类搜索路径
Rsrc-Main-Class:指定入口类,应该是eclipse自定义的参数
Main-Class:原始的指定入口类的参数,一般用eclipse导出时,会被指定为org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
解决这个问题的方法,是在Rsrc-Main-Class添加入口类的class文件,注意不能带.class后缀。
4、sikuli的优势和限制
优势
1)在web测试中,解决了selenium无法操作windows ui的问题,例如下载、上传时选择文件,或者不同frame中用div模拟的弹窗,识别起来麻烦得很。
2)上手非常快,也可以用sikuli的IDE开发,图片化的方式,简单易懂,可读性好。
3)支持java、python等多种语言,可以和selenium无缝对接,只需导入sikuli的脚本jar包即可。
限制
1)成也图片,败也图片。图片匹配区域的大小和样式不能有丝毫变化,所以如果屏幕分辨率、浏览器缩放等,导致图片区域的大小发生变化,就不要想通用,维护起来会相当痛苦。不同的机器执行,可能得维护多套图片。所以,还是慎用。
综上,只有被selenium逼得实在没招了,我才会去用sikuli。或者是为了快速开发测试用例,用于那种短平快的小项目,节约测试用例的开发成本。
sikuli实战记录的更多相关文章
- celery+RabbitMQ 实战记录2—工程化使用
上篇文章中,已经介绍了celery和RabbitMQ的安装以及基本用法. 本文将从工程的角度介绍如何使用celery. 1.配置和启动RabbitMQ 请参考celery+RabbitMQ实战记录. ...
- 升级 Elasticsearch 集群数量实战记录
搜索引擎 升级 Elasticsearch 集群数量实战记录 现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1.es2.es3),打算将其升级为5台(增 ...
- re实战记录
re实战记录 针对网页中的空格符 一般使用的.,但是它不能匹配\n,所以使用[\s\S]或者[\d\D]匹配所有字符 import re l1=r''' <div class="thu ...
- Rails工程实战记录
项目git:https://github.com/yixiaoyang/ruby 为熟悉Rails的基本特性创建的工程,本博文仅作更新记录. (1)2013.10.1-2013.10.5 Ruby基本 ...
- vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...
- vue实战记录(六)- vue实现购物车功能之地址列表选配
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...
- vue实战记录(四)- vue实现购物车功能之过滤器的使用
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(四) GitHub:sue ...
- vue实战记录(三)- vue实现购物车功能之渲染商品列表
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...
- vue实战记录(二)- vue实现购物车功能之创建vue实例
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...
随机推荐
- ConCurrent in Practice小记 (1)
ConCurrent in Practice小记 (1) 杂记,随书自己写的笔记: 综述问题 1.线程允许在同一个进程中的资源,包括共享内存,内存句柄,文件句柄.但是每个进程有自己的程序计数器,栈和局 ...
- callback转Promise
环境: nodejs - v6.2.0 const fs = require('fs'); let Promise = require('bluebird'); let readSync = fun ...
- sort详解2
linux sort 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比 ...
- UNIX域套接字(unix domain)
UNIX域套接字用于在同一台机器上运行的进程之间的通信. UNIX域套接字提供流和数据报两种接口. 说明:UNIX域套接字比因特网套接字效率更高.它仅赋值数据:不进行协议处理,如添加或删除网络报头.计 ...
- 第十二课:Sizzle引擎详解
这篇博客难度太大,跟前端开发其实没什么关系,如果你想成为大牛,那就去了解下吧.如果你还不想,那可以忽略,毕竟面试官也不会问到这里来,因为他也不太懂.呵呵. Sizzle引擎是jQuery的选择器,它大 ...
- chrome浏览器调用 ajax 提示net::ERR_INCOMPLETE_CHUNKED_ENCODING问题解决方案,以及 Response.Close 和 Response.End 的一些问题。
近段时间去了一家新公司任职,公司产品是一个网站,但是我发现它不兼容谷歌浏览器,用习惯了chrome的我简直是如鲠在喉.终于我抽出了时间,想纠正这个问题.F12一看,发现谷歌提示:net::ERR_IN ...
- lisp中的cons
看到ANSI Common Lisp 第三章的游程编码时,就发现作者很准确的使用了list和cons来生成目标列表,虽然list是由cons扩展而来,区别也仅仅是最后一个元素的加入方式,于是勾起了之前 ...
- python之路-Day7
编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方 ...
- MVC Razor基础
@ 可以编写一条C#语句@{} 可以编写一组C#语句@: 将文字内容直接输出到页面上去@() 在一句中将一段C#代码包括起来,证明这一句完整的C#代码 Razor解决路径问题: Html.Action ...
- webpack入门(转载)
阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过:如果你和十天前的我一样,对很多选项存在着疑惑,那花一段时间慢慢阅读本 ...