资源描述
Sikuli调研分享,李俊薇,索引,1、简介 2、下载和安装 3、示例 4、疑问 5、在java程序中使用sikuli 6、优缺点 7、技巧和附录,简介,Sikuli(在墨西哥维乔印第安人的语言里是”上帝之眼”的意思)是由美国麻省理工学院开发的一种最新编程技术,使得编程人员可以使用截图替代代码,从而简化代码的编写流程。从它研究方向上看,是一种编程技术,但是该技术还可以用于进行大规模的程序测试,脚本程序编写使用的是python语言。 编程而非录制 一般的工具是录制脚本,而sikuli不存在录制的问题,它需要自己手动编写程序来完成测试。 资料来源:,Sikuli脚本示例图(创建新账户的一个流程),如果存在创建账户按钮入口 则点击该按钮入口 否则 点击菜单“邮箱” 点击“新建邮箱账户”选项 点击输入邮箱地址编辑区 输入邮箱地址 点击输入密码编辑区 输入密码 点击下一步 点击创建 。,下载和安装,下载:http:/groups.csail.mit.edu/uid/sikuli/ (最新版本是0.10.1) 安装(要有java环境) 启动 直接使用安装目录下的Sikuli-IDE.exe启动。 使用过程中,遇到过直接用exe启动后可能无法正常使用的现象(在vista和win7下面遇到过,可能某些包无法加载,具体原因不知),网上开发人员的建议是使用安装目录下的Sikuli-IDE.bat,双击后也会启动sikuli的IDE界面,然后可以正常使用。 使用详细资料参考地址(全英文): http:/sikuli.org/trac/wiki/reference-0.10#Howtousethisdocument,主界面,程序保存,编写完程序后,用save as保存,会生成一个.sikuli的文件夹。,其中: .py是phthon脚本 .png是编写脚本过程中执行的截图 .html能让脚本在网络上实现共享,注意:此处程序本身好像有bug,保存路径不能含有中文字符,否则会报错,几个例子函数,1、click(对象截图) 点击某个对象 2、type(可输入对象截图,字符串) 像某个可输入对象输入字符串 3、rightClick(对象截图) 在某个对象上点击右键 4、快捷键ctrl+shift+2启动抓图,右键取消 5、wait(时间s) 等待多少s,一个例子程序,用例:闪电邮中创建一个用户名和密码均正确的账户 流程: 找到创建入口,点击 输入用户名和密码,点击下一步 选择账户模式,点下一步,点创建按钮 等待同步通讯录和收信完成 检查是否创建成功(判断依据是左边账户列表是否有该账户),Sikuli程序,account= psw=ljwtest if exists(1280742360468.png): click(1280742415811.png) else: click(1280742437779.png) click(1280742453232.png) click(1280742480700.png) type(account) click(1280742506294.png) type(psw) click(1280742536496.png) click(1280742556137.png) waitVanish(1280742859224.png) if exists(1280742904208.png,5): click(1280742940020.png) waitVanish(1280742955019.png) waitVanish(1280743004706.png,20) if exists(1280743048736.png) and exists(1280743102282.png): print(the account is create ok!),保存后的.py程序脚本,疑问:靠图像识别可靠吗?,靠图像来对对象进行识别,必然有很多不足之处,但是sikuli里面提 供了similarity的调整,在一定程度上弥补了这个缺点(但也不是绝对的) 实际调研情况: 脚本01是在xp下录制的一段脚本,调整相似度和识别对象个数后,在默认、国风、虎年三套皮肤下均可运行通过。增加wait()等待后,在vista下的默认、国风、虎年三套皮肤下也可以使用。酷黑皮肤差异较大,无法识别。 需要研究的是: 1、相似度调整到多少比较合适 2、识别对象个数调整到多少比较合适 3、等待时间设置为多少比较合适,相似度非常小的时候能匹配出较多对象,注意颜色(红色表示最匹配的),相似度调高一些的时候能匹配个数减少,相似度较高时匹配出最相似(想要的)对象,疑问:如何知道我点击的是哪里?,在java程序中也可以使用sikuli,Sikuli script的核心是用java编写的,所以在java代码中可 以引用sikuli script包然后编写自己的测试程序。,继续查看如何在java程序中使用,跳过,看sikuli优缺点,Java中使用sikuli-script的步骤,1、获取sikuli-script.jar 在sikuli的安装目录下面有一个sikuli-script.jar包。 2、安装OpenCV Sikuli script使用OpenCV作为图形识别引擎。如 果是windows系统,可以直接配置环境变量,在 path路径中加入“ sikuli安装路径/tmplib”, windows系统能自动的找到OpenCV的dll。在mac 和linux下比较复杂,需要自己安装OpenCV(没 有研究),Java中使用sikuli-script的步骤,3、在java项目中引入sikuli-script包 在eclipse中新建一个java项目,然后引入4.1中获取的 sikuli-script.jar包。项目建立成功后,可以在项目目录中看到 这个包。,Java中使用sikuli-script的步骤,4、引用引入的包 在自己的程序中引入需要的sikuli classes,用 “import edu.mit.csail.uid.* ”,或者引入一些自己 需要的类,可能会用到一些Regin、Screen、 SikuliScript类。 5、程序编写,import edu.mit.csail.uid.*; import edu.mit.csail.uid.Win32Util; public class TestSikuli public static void main(String args) Screen s=new Screen(100); Win32Util app=new Win32Util();/启动程序需要用到此类 int openapp=app.openApp(D:Program FilesNetease网易闪电邮Start.exe); /(小bug)此句不能正确执行,貌似对含有汉字的路径支持不好 int openapp=app.openApp(D:Program FileseMuleemule.exe); /此句可以正常执行,需要全英文字符的路径 if(openapp=0) System.out.print(app starts ok!); else System.out.print(app starts failed!); try s.click(img/02.png, 0);/点击增加账户的加号按钮 s.click(img/05.png, 0);/点击输入用户名的编辑框 s.type(null,0);/输入用户名 s.click(img/06.png, 0);/点击输入密码的编辑框 s.type(null,ljwtest,0);/输入密码 /try catch(Exception e) e.printStackTrace(); /catch 以上的.png图片都是保存在项目工程的img下的图片(可以用sikuli截取的图复制过去,然后自己可重命名),优点,1、整体上sikuli小巧、便捷、容易上手。 2、sikuli脚本可以不经过API的编译器直接自动化搜索到任何你能在屏幕上看到的东西 3、对各种程序都适合 4、不存在标准控件和非标准控件的问题 5、相对位置概念较小,要求不高(但是对象本身尺寸有影响) 6、一次编码,多次运行(基于java的) 7、jython和java的支持,用编程的方式比较容易扩展,缺点,1、图片的分辨率、色彩、尺寸、唯一性对程序的影响 (如果有两个相同的,无法区分具体哪一个) 2、sikuli本身还不完善(处于开发、升级阶段) 还有很多程序bug,能否继续发展还是未知数 3、只认识当前活动的图标(只有当前桌面有才行) 4、用例组织方面有提供但是目前有bug,还未调研尝试便利性 5、截图的话,脚本存储占用空间较大 6、相似度调整需要手动一个个的调整,工作量大 7、ljw200901t和ljw200902t的区别(不太容易区别出来,可能需要调整到similarity=1.0才行,但这样的话可移植性就差了) 8、目前还不适合设计成一种测试框架(有用例组织功能,但是目前有bug,暂时没有用过) 9、测试报告的生成,直接用message的话比较弱,需要用jython编程实现可能会强大一些(还未调研),增加图片识别时间,wait()的使用 新建一个自定义邮件夹后输入“test”,有wait()后,才能正常表现。 程序代码:,程序移植 点击查看原始代码01 在xp下写的一个脚本,移植到vista下后,设置的皮肤都一样,但是可能会抛出无法识别图像的异常,某些时候可能是因为等待时间不够久,程序来不及识别,可以用wait()增加程序查找对象的时间。 代码01是在xp下录制的一段脚本,闪电邮的默认、国风、虎年三套皮肤均能够正常运行。移植到vista下的默认皮肤下后,抛出一些无法识别图像的异常,但是在每个动作后增加了wait(1)等待1秒后,脚本可以正常执行了。(等待时间可根据实际情况自由设定)个人感觉应该是移植到vista下后,某些图片属性需要时间识别确认,如果没有等待时间,可能没有足够时间识别。,附录参考资料,Sikuli官方网站 http:/groups.csail.mit.edu/uid/sikuli/ Sikuli详细的documentation http:/sikuli.org/trac/wiki/reference-0.10#Howtousethisdocument Python学习地址(英文): 更多sikuli类、函数使用可以参考java doc http:/sikuli.org/documentation.shtml#/trac/wiki/How%20to%20use%20Sikuli%20Script% 20in%20your%20JAVA%20programs? (如果要在java program中使用,就要详细看这个java doc文档了),Sikuli的系统设计架构,参考地址:http:/sikuli.org/documentation.shtml#/trac/wiki/SystemDesign,其他示例,1、获取popo表情和动漫表情 增加wait()等待时间后,能判断到图片是否存在。 疑问:是否是根据某个时间内判断到的某一帧来 识别的?不确定 Wait(2) 程序运行结果,弹出“did not get the img” Wait(4) 程序运行结果,弹出“get img”,2、动漫表情 和exits() 之间不能wait(),否则识别不到。,3、选择文件(单选、和ctrl、shift组合多选) mouseDown(button) mouseUp(button) keyDown(key) keyUp(key),结束语,部分内容是根据网络的英文翻译而来,可能有不准确的地方,如有错误,可告之! 更多函数功能需要阅读技术手册 和java的结合使用要阅读java doc Thanks!,
展开阅读全文