Selenium+Jave—Window文件窗口+比对文件
说明:attribute指web页面的定位方式,如id、xpath、name,class;value指web页面的定位方式需要的参数
在我们测试Web网页端会有需要测试打印功能的时候,除了测试能够打印出文档,也会需要测试文档里的内容。
如何操作window界面进行保存:
在Selenium中,无法直接操作操作系统窗口或文件对话框。Selenium主要用于自动化Web应用程序的测试,而不是本地的操作系统窗口。你可以考虑使用Java的AWT(Abstract Window Toolkit)和Robot类或者其他工具来模拟操作系统窗口的行为。
1、利用Robot保存
Robot robot = new Robot(); // 等待一段时间,确保焦点在正确的窗口上 Thread.sleep(2000); // 模拟按下Ctrl + S来触发保存对话框 robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_S); robot.keyRelease(KeyEvent.VK_S); robot.keyRelease(KeyEvent.VK_CONTROL); // 等待一段时间,确保保存对话框出现 Thread.sleep(2000); // 模拟输入文件名并确认保存 robot.keyPress(KeyEvent.VK_H); // 模拟输入文件名 robot.keyPress(KeyEvent.VK_ENTER); // 确认保存
2、模拟鼠标操作,要找到坐标点,进行点击思路
//点击输入路径的位置坐标x,y 获取鼠标焦点
Robot robot = new Robot();
robot.moveMove(x,y);
robot.mousePress(KeyEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
//输保存文件名
driver=Hook.getDriver();
Action keyAction=new Action(dirver);
keyAction.sendkeys("路径名称").perform();
keyAction.keyDown(Keys.ENTER).perform();
3、用Sikuli识别图片,进行操作思路
//使用sikuli识别循环10次,查找window弹窗
org.sikuli.script.Screen sikuli = new org.sikuli.script.Screen();
Pattern element = new Pattern(png);//识别的弹窗局部图片
for (int i = 0; i < 10; i++) {
try{
sikuli.find(element);
System.out.println("识别成功");
}catch (FindFailed e){
System.out.println("没看到windows弹窗");
}
}
// 复制粘贴保存的路径
StringSelection selection = new StringSelection("文本");
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, null);
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
//保存
robot.keyPress(KeyEvent.VK_ENTER); // 确认保存
4、用Open CV识别图片找到位置然后,进行操作
同理用sikuli操作,都是识别window弹窗出现,输入路径再保存。
5、借用工具:AutoIt去操作
autoitv3下载地址 https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe
可以借助autoitv3获取window窗口的元素位置,书写编译成自动化脚本,在测试过程中调用编译好的脚本即可
参考路径:https://blog.csdn.net/u014634015/article/details/93621428
//1.首先,编写一个 AutoIt 脚本(例如:save_file.au3),用于模拟键盘和鼠标操作保存文件。
; save_file.au3
; 等待保存文件对话框出现
WinWait("另存为")
; 输入文件名
ControlSetText("另存为", "", "[CLASS:Edit; INSTANCE:1]", "C:\path\to\save\file.txt")
; 单击保存按钮
ControlClick("另存为", "", "[CLASS:Button; INSTANCE:1]")
//2.在 Java 代码中使用 Runtime 类来执行 AutoIt 脚本。首先,编译并运行 AutoIt 脚本,然后使用 Runtime 执行生成的可执行文件。
import java.io.IOException;
public class SaveFileUsingAutoIt {
public static void main(String[] args) {
try {
// 编译 AutoIt 脚本为可执行文件
Runtime.getRuntime().exec("aut2exe.exe /in save_file.au3 /out save_file.exe");
// 运行生成的可执行文件
Runtime.getRuntime().exec("save_file.exe");
} catch (IOException e) {
e.printStackTrace();
}
}
}
6、利用win32去操作windows弹窗
//1.首先,导入 JNA 和 Win32 API 类。在 Maven 中添加以下依赖项:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.6.0</version>
</dependency>
//2.在 Java 代码中使用 Win32 API 来保存文件。首先,使用 GetSaveFileName 函数打开“另存为”对话框,然后使用 SaveFileDialog 结构体来设置对话框的属性。最后,使用 GetOpenFileName 函数获取用户选择的文件路径。
import com.sun.jna.Native;
import com.sun.jna.platform.win32.COM.util.Factory;
import com.sun.jna.platform.win32.COM.util.ObjectFactory;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.Ole32;
import com.sun.jna.platform.win32.Shell32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.ptr.PointerByReference;
import java.util.Arrays;
import java.util.List;
public class SaveFileUsingWin32 {
public static void main(String[] args) {
// 初始化 COM 库
Ole32.INSTANCE.CoInitializeEx(PointerByReference.NULL, Ole32.COINIT_APARTMENTTHREADED);
try {
// 创建文件对话框实例
WinUser.OPENFILENAME ofn = new WinUser.OPENFILENAME();
ofn.lStructSize = new WinDef.DWORD(ofn.size());
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
ofn.lpstrFile = new char[260];
ofn.nMaxFile = 260;
ofn.Flags = WinUser.OFN_EXPLORER | WinUser.OFN_FILEMUSTEXIST | WinUser.OFN_OVERWRITEPROMPT;
// 打开“另存为”对话框,并获取用户选择的文件路径
if (Shell32.INSTANCE.GetSaveFileName(ofn)) {
String filePath = Native.toString(ofn.lpstrFile);
System.out.println("Selected file path: " + filePath);
// 在此处执行保存文件操作
// ...
} else {
int error = Kernel32.INSTANCE.GetLastError();
System.err.println("Failed to open save file dialog. Error code: " + error);
}
} finally {
// 释放 COM 库资源
Ole32.INSTANCE.CoUninitialize();
}
}
}
如何对比文档:
1. 文字检查
推荐的方法, 但要求文件的内容可以获取到
//读取文件
File file = new File("文档路径"); // 替换为你的文件路径
Scanner scanner = new Scanner(file);
StringBuilder stringBuilder = new StringBuilder();
while (scanner.hasNextLine()) {
stringBuilder.append(scanner.nextLine());
stringBuilder.append("\n"); // 如果需要保留换行符,可以加上这一行
}
String fileContent = stringBuilder.toString();
if (fileContent.contains("要检查的文字")) {
System.out.println("页面包含要检查的文字");
} else {
System.out.println("页面不包含要检查的文字");
}
2. 图像比对
操作比较简单,将获取的文件导出成图片亦或是截图成图片,用来当做basic image。往后再保存的文件截取的图片就当成check image,利用图比图来检查文件是否保存正确。对比图片可以用open cv,图片对比函数等。
<!--以pdf为例:首先,在 Maven 中添加以下依赖项:-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<!--对比图片,在 Maven 中添加以下依赖项:-->
<dependency>
<groupId>org.im4java</groupId>
<artifactId>im4java</artifactId>
<version>1.4.0</version>
</dependency>
//在 Java 代码中使用 PDFBox 将 PDF 文件的每一页转换为图片。下面的代码示例将 PDF 文件的每一页转换为 PNG 格式的图片:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ConvertPdfToImages {
public static void main(String[] args) {
String pdfFilePath = "path/to/your/pdf/file.pdf";
String outputDir = "path/to/output/directory/";
try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
// 遍历 PDF 的每一页
for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300); // 设置 DPI
// 输出图片文件
String outputFileName = outputDir + "page_" + (pageIndex + 1) + ".png";
ImageIO.write(image, "PNG", new File(outputFileName));
}
System.out.println("PDF pages converted to images successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
//对比图片
import org.im4java.core.CompareCmd;
import org.im4java.core.IMOperation;
import java.io.IOException;
public class CompareImages {
public static void main(String[] args) {
String imageFilePath1 = "path/to/basiciamge.png";
String imageFilePath2 = "path/to/checkimage.png";
// 创建 IMOperation 对象,设置 compare 命令的参数
IMOperation cmpOp = new IMOperation();
cmpOp.metric("AE"); // 使用差异指数作为指标
cmpOp.fuzz(10.0); // 设置容差值为 10.0
cmpOp.addImage(imageFilePath1);
cmpOp.addImage(imageFilePath2);
cmpOp.addImage("null:"); // 必须将输出重定向到 null
// 创建 CompareCmd 对象,执行 compare 命令
CompareCmd cmd = new CompareCmd();
try {
cmd.run(cmpOp);
System.out.println("Images are similar.");
} catch (IOException e) {
System.out.println("Images are different. Error message: " + e.getMessage());
}
}
}
3. ocr识别文字对比
ocr需要使用第三方工具Tesseract, 且工具扫描的文字可能会有误差, 识别准确率受多种因素的影响,例如图片质量、文字颜色、背景色等。在使用 Tesseract 进行 OCR 识别时,可能需要进行一些预处理操作,例如图像增强、二值化、去除噪声等,以提高识别准确率。
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.2</version>
</dependency>
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class RecognizeText {
public static void main(String[] args) {
String imageFilePath = "path/to/image.png";
// 加载图片文件到 BufferedImage 对象
BufferedImage image = null;
try {
image = ImageIO.read(new File(imageFilePath));
} catch (IOException e) {
System.out.println("Failed to load image file. Error message: " + e.getMessage());
return;
}
// 创建 Tesseract 对象,识别图片中的文本
Tesseract tesseract = new Tesseract();
tesseract.setDatapath("/path/to/tessdata"); // 设置 Tesseract 数据文件的路径
try {
String result = tesseract.doOCR(image);
System.out.println("Recognized text: " + result);
} catch (TesseractException e) {
System.out.println("Failed to recognize text from image. Error message: " + e.getMessage());
}
//check文字
if(result==expectText){
System.out.println("比对通过");
}else{
System.out.println("比对不通过");
}
}
}
4.图像对比图像方法的延伸
在不同分辨率下进行图片比较时,可以使用以下方法来提高精度:
1)图像缩放
将图像缩放到相同的大小。可以使用OpenCV中的resize函数来完成。在resize函数中,将源图像和目标图像的大小设置为相同的大小,然后使用插值算法将源图像缩放到目标图像的大小。
2)特征点匹配
使用特征点检测和匹配算法,比如SIFT、SURF、ORB等来进行图像比较。这些算法可以在不同分辨率下提取和匹配特征点,从而提高图像比较的精度。
3)直方图比较
将图像转换成直方图,然后比较直方图的相似性。可以使用OpenCV中的calcHist函数来计算图像的直方图,然后使用compareHist函数来比较两个直方图的相似性。
4)均值哈希算法
使用均值哈希算法来进行图像比较。该算法将图像缩小到8x8的大小,然后将图像转换成灰度图像,并计算出图像的平均灰度值,然后将每个像素的灰度值与平均灰度值进行比较,得到图像的01串表示。最后,比较两个图像的01串的相似度。
这些方法可以结合使用来提高在不同分辨率下进行图片比较的精度。
#测试##自动化测试工程师##自动化测试#记录工作中的自动化测试学习内容,例如:手机自动化测试学习,web端自动化测试学习等..