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

简介: 一个好玩的图像识别自动化测试工具

转载请注明出处❤️

作者:测试蔡坨坨

原文链接: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();
    }
相关文章
|
4月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
476 0
|
2月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
367 41
|
9月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
5月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
220 0
|
5月前
|
机器学习/深度学习 分布式计算 Java
Java 大视界 -- Java 大数据机器学习模型在遥感图像土地利用分类中的优化与应用(199)
本文探讨了Java大数据与机器学习模型在遥感图像土地利用分类中的优化与应用。面对传统方法效率低、精度差的问题,结合Hadoop、Spark与深度学习框架,实现了高效、精准的分类。通过实际案例展示了Java在数据处理、模型融合与参数调优中的强大能力,推动遥感图像分类迈向新高度。
|
5月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
10月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
8月前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
1954 9
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
22059 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)