转载请注明出处️

作者:测试蔡坨坨

原文链接: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 + SikuliX 基于图像实现自动化测试的更多相关文章

  1. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

    Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...

  2. 使用 Selenium 实现基于 Web 的自动化测试

    (转自http://www.ibm.com/developerworks/cn/web/1209_caimin_seleniumweb/index.html) Selenium 是一个用于 Web 应 ...

  3. 基于MBT的自动化测试工具——GraphWalker介绍和实际使用

    GraphWalker是一个开源的基于模型的自动化测试工具,它可以用来通过图形测试模型来自动生成测试用例. 本文主要描述了使用yed画出FSM, EFSM模型图(常见的流程图),然后使用GraphWa ...

  4. 如何在java中使用sikuli进行自动化测试

    很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,ja ...

  5. Java OCR tesseract 图像智能字符识别技术 Java实现

    Java OCR tesseract 图像智能字符识别技术 Java代码实现 接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码 ...

  6. java中基于TaskEngine类封装实现定时任务

    主要包括如下几个类: 文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 ...

  7. java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.

    java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...

  8. robotium从入门到放弃 三 基于apk的自动化测试

      1.apk重签名   在做基于APK的自动化测试的过程中,需要确保的一点是,被测试的APK必须跟测试项目具有相同的签名,那怎么做才能确保两者拥有相同的签名呢?下面将给出具体的实现方法. 首先将被测 ...

  9. dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器

    # dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器 #环境centos 7.4 docker 18.03.0-ce # nuxus,创建maven本地源(可 ...

  10. Java之基于Eclipse搭建SSH框架(下)

    在上篇博客里,我简介了Tomcat滴配置与Struts2滴搭建,假设对这个还不会滴童鞋去看一下我滴上篇博客<Java之基于Eclipse搭建SSH框架(上)>.今天我们接着上篇博客滴内容. ...

随机推荐

  1. 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路

    本题是浙江理工大学ACM入队200题第八套中的J题 我们先来看一下这题的题面. 题面 题目描述 宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9 九个数分别填进对应 ...

  2. Day10:for循环结构的使用详解

    for循环 将0~100内的奇.偶数分别求和 思路 第一步先将0~100以内的奇.偶数分成两队,第二步使奇数累加.ou'shu public class ForCirculate{ public st ...

  3. C#pictureBox滚轮缩放与拖拽

    [转载]C#pictureBox滚轮缩放与拖拽 [转载]C#中图像平移.缩放的实现技巧 [转载]c# 通过鼠标拖动.放大图片,GDI绘图通过鼠标拖动.放大

  4. nacos集群搭建和反向代理

    搭建环境 安装ngin https://www.linuxprobe.com/linux-install-nginx.html 配置jdk1.8 https://blog.csdn.net/qq_42 ...

  5. 查看服务器出口ip

    [root@iZap201hv2fcgry1alvbznZ ~]# curl cip.cc IP : xxx.xxx.xx.xx 地址 : 中国 浙江 绍兴 运营商 : 移动 数据二 : 浙江省绍兴市 ...

  6. PyQt5程序打包出错Failed to execute script

    出现这种报错一般有两种可能: 1. 该被引入的资源你没有放到 exe 的相对路径 这种错误一般是你直接引入图片或者图标, 而没有放到 打包后的exe的相对路径 2. 加参数 假设 main.py 为程 ...

  7. 3. qtdesinger的使用方法

    专栏地址 ʅ(‾◡◝)ʃ windows 上使用 qtdesigner 找到那个路径直接打开就行了 linux 上使用 qtdesigner 打开 qtcreator 软件 1. 启动软件,新建项目 ...

  8. vue3响应式原理以及ref和reactive区别还有vue2/3生命周期的对比,第二天

    前言: 前天我们学了 ref 和 reactive ,提到了响应式数据和 Proxy ,那我们今天就来了解一下,vue3 的响应式 在了解之前,先复习一下之前 vue2 的响应式原理 vue2 的响应 ...

  9. 【Flink】概念、入门、部署(yarn和standalone模式)、架构(组件和运行流程)、批处理、流处理API、window、时间语义、Wartermark、ProcessFunction、状态编程、Table API和SQL、CEP、面试题

    一.Flink简介 1.概述 Apache Flink是为分布式.高性能.随时可用以及准确的流处理应用程序打造的开源流处理框架 对无界和有界数据流进行有状态计算 2.重要特点 (1)事件驱动型:从一个 ...

  10. css images图片铺满 不变型 以及头像裁剪 属性

    一,图片的引入 background:url(img_flwr.gif); background-repeat:no-repeat; //平铺 二,图片的大小不不变形 background-size: ...