首页 > 编程语言 >Java + SikuliX 基于图像实现自动化测试

Java + SikuliX 基于图像实现自动化测试

时间:2023-02-09 01:11:18浏览次数:78  
标签:Java Screen 图像 driver imgPath new SikuliX Region

转载请注明出处❤️

作者:测试蔡坨坨

原文链接:caituotuo.top/6d2908e8.html


你好,我是测试蔡坨坨。

由于目前大多数GUI工具均需要依赖于程序类型进行特征属性识别,例如:Selenium、Appium、UIAutomator。在进行WebUI自动化测试的时候,有些元素使用传统的Selenium方法(传统方法:使用id等属性定位)很难或无法定位到,比如:object元素;基于Flash、JavaScript或Ajax等技术实现的文件上传功能。

对于非input框的文件上传问题,Python可以使用win32gui库,而Java可以使用AutoIt,但是AutoIt只有Windows版本,又要考虑兼容Windows和macOS。

对于这种情况,推荐一个好玩的东西SikuliX。

本篇就来聊聊SikuliX这个工具,什么是SikuliX,如何使用,以及文件上传功能demo实现。

SikuliX简介

SikuliX是基于PC图像识别的自动化测试工具,由MIT(麻省理工学院)研究团队发布。

与其他UI自动化工具相比,SikuliX的优势在于,它是基于像素实现的元素定位,所以即使页面上的元素没有像id、name这些属性,也可以通过图像识别进行UI的交互操作,无需关注元素有哪些属性,所见即所得;适合非标准控件等自定义界面的定位;支持跨平台,如:Windows、macOS、Linux。

但是,它也有一定的局限性,由于是基于图像识别,因此图片的大小、分辨率、色彩都会对识别造成影响,定位不能百分百准确识别到元素,如果有两个相同或相似的图片,无法区分具体哪一个,需要手动调整精确度,工作量大;只能定位当前正在操作的窗口界面;若流程过长,则会造成脚本过于臃肿;目前还不适合设计成一种测试框架。

尽管SikuliX用来实现复杂的测试场景不太现实,这也是所有GUI自动化测试无法改变的现实,但是用来做一些特定场景的测试还是游刃有余。对于Web自动化主要用该端的自动化框架,如Selenium,SikuliX作为辅助,可以和Selenium结合使用。

使用

导入依赖

方法一(推荐):使用Maven构建工具,导入pom依赖

<!-- https://mvnrepository.com/artifact/com.sikulix/sikulixapi -->
<dependency>
    <groupId>com.sikulix</groupId>
    <artifactId>sikulixapi</artifactId>
    <version>1.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sikulix/sikulixlibswin -->
<!-- 这里是Windows版本,其他系统版本选择参考 https://mvnrepository.com/artifact/com.sikulix -->
<dependency>
    <groupId>com.sikulix</groupId>
    <artifactId>sikulixlibswin</artifactId>
    <version>1.1.1</version>
</dependency>

方法二:手动下载jar包加入到引用库

https://raiman.github.io/SikuliX1/downloads.html

核心类

SikuliX提供两大核心类,Region(界面部分区域识别)和Screen(全屏识别)。

实例化Region:

Region r = new Region(100, 100, 100, 100);

说明:
class Region
Region(x, y, w, h)
Region(region)
Region(Rectangle)
Create a region object

Parameters:	
x – x position of a rectangle.
y – y position of a rectangle.
w – height of a rectangle.
h – width of a rectangle.
region – an existing region object.
rectangle – an existing object of Java class Rectangle
Returns:	
a new region object.

实例化Screen:

Screen s = new Screen();

常用API

等待元素出现:wait()

s.wait(inputImg, 10);

判断元素是否在屏幕上显示:exists()

s.exists(inputImg);

在文本输入框输入指定文本内容:type()

s.type(inputImg, "caituotuo");

单击元素:click()

s.click(btnImg);

右键单击元素:rightClick()

s.rightClick(btnImg);

双击元素:doubleClick()

s.doubleClick(btnImg);

旋转指定图像:wheel()

s.wheel(btnImg,25,0);

拖放图片:dragDrop()

s.dragDrop(img,img2);

鼠标悬停:hover()

s.hover(btnImg);

粘贴复制的字符串:paste()

由于type()不支持输入中文,所以可以用paste()来在指定的文本框中粘贴文本

s.paste(inputImg,"蔡坨坨");

按下键盘键:type()

s.type(Key.ENTER);

s.type("c",Key.CTRL); // 快捷键

SikuliX实现百度搜索

public static void baiduSearch() throws InterruptedException, FindFailed {
        String imgPath = PathUtils.getProjectPath() + "src\\test\\resources\\images\\";
        // Pattern baiduInput = new Pattern(imgPath + "baiduInput.png");
        String baiduInput = imgPath + "baiduInput.png";
        // Pattern baiduBtn = new Pattern(imgPath + "baiduBtn.png");
        String baiduBtn = imgPath + "baiduBtn.png";
    	// 打开浏览器
        WebDriver driver = new ChromeDriver();
    	// 窗口最大化
        driver.manage().window().maximize();
    	// 访问百度网站
        driver.get("https://www.baidu.com");
    	// 等待1s
        Thread.sleep(1000);
    	// 实例化Screen类
        Screen s = new Screen();
    	// 等待搜索框出现
        s.wait(baiduInput, 10);
		// s.type(baiduInput, "sikuli");
    	// 粘贴文本
        s.paste(baiduInput, "测试蔡坨坨");
    	// 按下回车键
        s.keyDown(Key.ENTER);
   	 	// 判断百度一下按钮是否存在
        s.wait(baiduBtn, 10);
    	// 点击百度一下
        s.click(baiduBtn);
    	// 等待3s
        Thread.sleep(3000);
    	// 关闭浏览器
        driver.quit();
    }

SikuliX实现文件上传

public static void uploadFileBySikuli() throws InterruptedException, FindFailed {
        String imgPath = PathUtils.getProjectPath() + "src\\test\\resources\\images\\";
        String img = PathUtils.getProjectPath() + "src\\test\\resources\\images\\avatar.png";
        Screen s = new Screen();
        Pattern fileInputTextBox = new Pattern(imgPath + "fileInputTextBox.png");
        Pattern openButton = new Pattern(imgPath + "openButton.png");
        // 启动浏览器并打开链接
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.sahitest.com/demo/php/fileUpload.htm");
        // 窗口最大化
        driver.manage().window().maximize();
        Thread.sleep(2000);
        // 点击上传按钮
        WebElement ele = driver.findElement(By.id("file"));
        new Actions(driver).click(ele).perform();
        // 等待文件上传弹窗出现,sikuli开始操作
        s.wait(fileInputTextBox, 20);
        // 输入文件路径
        s.type(fileInputTextBox, img);
        // 点击回车
        s.keyDown(Key.ENTER);
        // 点击打开按钮
        s.click(openButton);
        Thread.sleep(3000);
        driver.quit();
    }

标签:Java,Screen,图像,driver,imgPath,new,SikuliX,Region
From: https://www.cnblogs.com/caituotuo/p/17103872.html

相关文章

  • java基础面试题
    java基础面试题1. Java有哪些数据类型?Java中有8种基本数据类型,分别为:6种数字类型(四个整数形,两个浮点型):byte、short、int、long、float、double,1种字符类型:char,1......
  • JavaDoc
    JavaDochttps://www.cnblogs.com/linj7/p/14339381.htmlAndroidStudio配置plugin中找到javadoc插件后进行安装在想要添加文档说明的方法或类上使用快捷键$${\boxed{a......
  • 01Java常用类
    Object类Object概述Object类是超类,基类,所有类都默认直接继承Object类。Object类中定义的方法,是所有对象都具备的方法。Object类可以存储任何类​ -可以作为......
  • 02.java基础(一)java的基础、方法和数组
    目录Java基础Java特性Java程序运行机制Java基础语法1.数据类型基本类型引用类型数据类型扩展String类型内存分配过程转义字符类型转换变量常量2.运算符逻辑运算符、位运算......
  • 03java基础(二)java面向对象
    目录类和对象的基本使用基础概念类的初始化用new关键字创建对象创建对象的内存分析OOP的三大特征类的封装类的继承继承的基础使用继承基本概念extends关键字的基本使用supe......
  • 从零开始的java安装到环境搭建
    安装jdk: 参考wiki:  https://www.liaoxuefeng.com/wiki/1252599548343744/1280507291631649https://www.oracle.com/java/technologies/downloads/#java19安装环境......
  • IDEA运行Spring工程报错:java: 警告: 源发行版 17 需要目标发行版 17
    问题:IDEA运行Spring工程报错:java:警告:源发行版17需要目标发行版17   问题原因:idea工具jdk版本使用问题解决办法:1、File(文件)->ProjectStructure(项目......
  • IDEA运行Spring项目报错:java: 无法访问org.springframework.boot.SpringApplication,类
    报错:java:无法访问org.springframework.boot.SpringApplication错误的类文件:/Users/***/Repository/org/springframework/boot/spring-boot/3.0.2/spring-boot-3.0.2......
  • SpringBoot整合JavaMail
    1、发送简单邮件导入依赖implementation'org.springframework.boot:spring-boot-starter-mail:3.0.2'开启相关协议,获取密码~我是用的是QQ邮箱,其他的也一样配置一下......
  • java面试总结
    一家政府外包线上面试直接A4纸上手写代码。①集合相关API。Listlist=newArrayList();{ add:添加单个元素remove:删除指定元素 list.remove(0);删除第一个元......