自动化测试之sikuli调研
调研结果
Sikuli可用于web和app的自动化测试中,操作简单,代码容易,但截图过程太过繁琐,所需要的图片内存占用量大,且sikuli的图片识别度较低,需对所要操作的图片进行精准截图。
什么是Sikuli
MIT的研究人员设计了一种新颖的图形脚本语言Sikuli,计算机用户只须有最基本的编程技能(比如会写print"hello world"),他不需要去写出一行行代码,而是用屏幕截图的方式,用截出来的图形元素组合出神奇的程序。
Sikuli工作原理(以python为例):
通过sikuli IDE,可以建立sikuli脚本,其中包括Python源代码以及所需要的截图。Sikuli IDE执行脚本时,通过Python解析器和java库的桥梁,核心部分解析是通过java库实现的分两个部分,java.awt.Robot用来传递键盘和鼠标的事件流到适当位置;给予OpenCV的C++引擎用于在屏幕内搜索制定的图片。各部分的协调工作,最终使得sikuli脚本得以运行,如下图:

利用sikuli对web进行自动化测试的流程
1.下载sikulixsetup
下载地址:https://launchpad.net/sikuli/+download
下载得到:sikulixsetup-1.1.0.jar
2.安装sikuli
l 将jar包导入工程中;
l 在cmd中运行该jar包。java -jar sikulixsetup-1.1.0.jar,则会出现如下图,选择相应选项后,启动会下载sikulixapi.jar。不然会报错:libs to export not found on above classpath: /sikulixlibs/mac/libs642.
l 选择第二个
l 启动后会有have fun的提示;
l 在文件夹中找到下载的sikulixapi.jar包,导入到工程中。

3.编写java代码
代码如下:
import org.sikuli.script.FindFailed;
import org.sikuli.script.Key;
import org.sikuli.script.Screen;
public class Sikulidemo123 {
public static void main(String[] args) throws FindFailed, InterruptedException {
Screen s=new Screen();
s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\min1.png");
s.doubleClick("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\firfoxpic.PNG");
Thread.sleep(2000);
s.type("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\url1.png", "******");
s.type(Key.ENTER);
s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\ningbologin.png");
s.type("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\username.PNG","zhangguangwu");
s.type("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\password.PNG","Abc123456");
s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\loginbutton.PNG");
System.out.println("完美。。。。。");
}
}
应用seleiun写的登录自动化

两者区别:
ü Selenium的准确度更高,而sikuli对图片的要求很高;
ü Selenium写好的代码可以在任何计算机上使用,sikuli写好的代码仅允许在本机使用,因为图片的识别会因为分辨率、背景颜色,图片大小的变化而变化;
ü Selenium运行起来较为缓慢,而sikuli代码运行起来能很快识别出要点击和添加的内容;
ü Selenium中有很多元素无法获得,如xpath和操作windows系统等,但sikuli都可以通过识别图片从而进行操作。
编写web自动化测试的建议:
ü 编写自动化脚本时,若仅需要测试一小段简单程序时,可以使用sikuli来编写,若需要测试一个复杂的系统,则应以selenium为主,sikuli为辅(当有windows的操作时);
ü 在有上传文件、图片等操作的自动化测试中,用sikuli的图片识别技术更为方便;
ü 用sikuli来编写代码时,所截到的图片应该避免雷同,且尽量缩小范围,便于执行点击、填写等操作时,由于范围过大而定位错误;
ü 掺有sikuli jar包的代码,运行时必须在本机使用,不得换其他计算机操作,若更换,需重新截取所操作计算机的截图;
4.运行程序,运行结果如下图:

利用sikuli对android进行自动化测试的流程
1.将得到的sikulixpai.jar导入程序中
2.导入要进行测试app的apk
3.安装小萝贝控机大师并关联到手机,控机后页面如下图:

4.编写java代码
代码如下:
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class SikuliTest {
@Test
public void addContact() throws FindFailed, InterruptedException{
//获得电脑桌面屏幕内容
Screen s = new Screen();
//图片存储路径
String imgpath="D:\\eclipse-jee-mars-2-win32-x86_64\\Appium_demo\\pics\\";
//点击最小化,最小化eclipse
s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Appium_demo\\pics\\min1.png");
//找到桌面上控机大师中的图标
s.find(imgpath+"Contect.png");
s.click(imgpath+"Contect.png");
Thread.sleep(1000);
s.click(imgpath+"AddContact.png");
Thread.sleep(1000);
//输入contactname为some
s.type(imgpath+"Contactname.png", "some");
s.click(imgpath+"Contactemail.png");
Thread.sleep(1000);
s.type(imgpath+"Contactemail.png", "some@163.com");
Thread.sleep(5000);
s.click(imgpath+"save.png");
System.out.println("App is done!");
}
@After
public void tearDown() throws Exception {
//driver.quit();
}
}
使用appium编写的测试android app脚本
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import java.io.File;
import java.net.URL;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
public class ContactsTest {
private AppiumDriver driver;
@Before
//打开该应用,进入主界面
public void setUp() throws Exception {
// set up appium
File classpathRoot = new File(System.getProperty("user.dir"));
//app路径
File appDir = new File(classpathRoot, "/apps");
//app包
File app = new File(appDir, "ContactManager.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
//设置设备器件名称
capabilities.setCapability("deviceName","4C3ETK1575017025");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "com.example.android.contactmanager");
capabilities.setCapability("appActivity", ".ContactManager");
driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
System.out.println("App is launched!");
}
@Test
//测试添加联系人的步骤
public void addContact(){
WebElement el = driver.findElement(By.name("Add Contact"));
el.click();
List<AndroidElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
textFieldsList.get(0).sendKeys("Some Name");
textFieldsList.get(2).sendKeys("Some@example.com");
driver.swipe(100, 500, 100, 100, 2);
driver.findElementByName("Save").click();
System.out.println("App is done!");
}
@After
public void tearDown() throws Exception {
driver.quit();
}
}
两者区别:
ü Appium的准确度高,而sikuli对图片的要求很高;
ü Appium写好的代码可以在任何计算机上使用,sikuli写好的代码仅允许在本机使用,因为图片的识别会因为分辨率、背景颜色,图片大小的变化而变化;
ü Appium前期的环境搭建过于繁琐,并且运行脚本时,需要打开appium的前期步骤也比较多,sikuli仅需简单安装小萝贝控机大师即可;
ü Appium代码中前期需要配置的参数过多,而sikuli仅需按照日常手动操作中的步骤来进行即可。
编写android app自动化测试的建议:
ü 编写安卓app自动化测试脚本时,若仅需要测试一小段简单程序时,可以使用sikuli来编写,若需要测试一个复杂的系统,则应用Appium;
ü 用sikuli来编写代码时,所截到的图片应该避免雷同,且尽量缩小范围,便于执行点击、填写等操作时,由于范围过大而定位错误;
ü 掺有sikuli jar包的代码,运行时必须在同一外置手机中使用,不得换其他手机操作,若更换,需重新截取所操作手机的截图;
ü 若需要测试手机app的某一单独模块时,则应使用appium,可以自动定义启动哪一activity,省去前面一系列步骤。
4. 运行
Sikuli的优缺点
优点
1.与平台无关
可以实现任意类型的UI(GUI)测试,轻松实现跨平台测试,并可以解决web测试中的浏览器兼容性测试问题。
2.可读性强
代码可读性强,用图形表示逻辑关系更生动、形象,容易理解,便于维护。
3.提供.jar包
便于构建大型的测试框架,实现各类测试工具之间的互补。
4.用例设计与程序实施可分离
用例设计人员可以只关注图型逻辑关系和测试检查点,不需要懂得具体开发与程序语言基础;程序实施人员可以只进行编程而不过多参与设计。
缺点
1、sikuli不支持中文,因此无论在编程中或者保存路径,都不可以使用中文!否则运行报错。
2、图片的分辨率、色彩、尺寸、唯一性对程序的影响 (如果有两个相同的,无法区分具体哪一个)
3、sikuli本身还不完善(处于开发、升级阶段) 还有很多程序bug,能否继续发展还是未知数
4、只认识当前活动的图标(只有当前桌面有才行)
5、用例组织方面有提供但是目前有bug,还未调研尝试便利性
6、截图的话,脚本存储占用空间较大
7、相似度调整需要手动一个个的调整,工作量大
自动化测试之sikuli调研的更多相关文章
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- [转] Android自动化测试之使用java调用monkeyrunner(五)
Android自动化测试之使用java调用monkeyrunner 众所周知,一般情况下我们使用android中的monkeyrunner进行自动化测试时,使用的是python语言来写测试脚本.不过, ...
- 【转载】soapui基于持续集成工具自动化运行的调研姿势
soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...
- Android自动化测试之环境搭建
Android自动化测试之环境搭建 一.Android-sdk介绍 SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台. ...
- POPTEST培训:web自动化测试之DOM
POPTEST培训:web自动化测试之DOM poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...
- appium自动化测试之UIautomatorviewer元素定位
appium自动化测试之UIautomatorviewer元素定位 标签(空格分隔): uiautomatorviewer元素定位 前面的章节,已经总结了怎么搭建环境,怎样成功启动一个APP了,这里具 ...
- selenium自动化测试之整合测试报告
selenium自动化测试之整合测试报告 标签(空格分隔): 整合报告 如下截图我们添加一个文件叫做:latest_report.py文件, import time import os import ...
- Selenium自动化测试之结果处理
Selenium自动化测试之结果处理 一.断言 断言相当于性能测试中的检查点,常用断言种类很多,具体可以查看断言API:判断预期结果和实际结果是否一致,断言成功,程序继续处理,失败则终止运行,示例如下 ...
- Selenium自动化测试之数据驱动及用例管理
Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:
随机推荐
- 小程序 webview踩坑
很多功能是需要调用wx.confing的 wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开, ...
- Selenium3 + Python3自动化测试系列七——多窗口切换
多窗口切换 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作. WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切 ...
- Pandaria(Kruskal重构树+线段树合并)
题意 是 有n个花园 一个花园内所有的花的颜色都是一样的 有很多种不同的颜色 花园到花园之间有路,走不同的路有不同的代价 如果选一个点作为起点 只走小于等于w的路 可以经过的这些花园里 那种 ...
- [Err] 1701 - Cannot truncate a table referenced in a foreign key constraint
1.SET FOREIGN_KEY_CHECKS=0; 2.DELETE FROM ACT_RE_DEPLOYMENT where 1=1; 或者 truncate table ACT_RE_DEPL ...
- Linux 守护进程创建
1. 守护进程: 是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.守护进程常常在系统启动时开始运行,在系统关闭时终止 2. ...
- 基于LNMP部署DiscuzX
[root@nginx~]# unzip ComsenzDiscuz-DiscuzX-master.zip[root@nginxDiscuzX]# mv upload/ /usr/local/ngin ...
- TOP和PS aux命令显示出来的栏目所代表的意思
USER: 行程拥有者 PID: pid %CPU: 占用的 CPU 使用率 %MEM: 占用的记忆体使用率 VSZ: 占用的虚拟记忆体大小 RSS: 占用的记忆体大小 TTY: 终端的次要装置号码 ...
- elasticsearch 父子文档(十一)
说明 需求 一个产品多个区域销售 每个区域有自己的价格, 方式1冗余行,a 产品分别在 area1 area2 area3区域销售 a产品就会生成3条产品数据 搜索id去重就行了,但是问题就是 聚合 ...
- Java SE(3)
紧接着上一期内容,继续来复习一下java基础的知识点,主要来复习一下有关线程的内容吧! 1.向上转型:Animal a = new Cat();//自动类型提升,猫对象提升为动物类型,但是特有的功能无 ...
- Dijkstra算法举例分析
题目如下: 如上图,设A为源点,求A到其他各顶点(B.C.D.E.F)的最短路径.线上所标注为相邻线段之间的距离,即权值.(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一 一对等). 解 ...