Selenium+Jave—Window文件窗口+比对文件

说明:attribute指web页面的定位方式,如id、xpath、name,classvalue指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端自动化测试学习等..

全部评论

相关推荐

#美团暑期[话题]##美团暑期[话题]##美团数据开发#4.8美团数据开发一面,记录一下面经供大家参考,同时积攒人品,希望顺利OC。(25暑期转正实习)面试官人很好,整个面试过程约一小时十五分钟,非常nice,面试官全程视频,也给了我很多建议,受益匪浅,整个过程八股较少,都是穿插项目问八股,感觉面试官一直在从我会的角度深入。具体如下:1.你知道hive的窗口函数吗,窗口函数有哪些,都是干什么用的,知道lag函数吗,做什么的2.平时用Spark的时候关注过内存管理吗(没了解,面试官说可以多看看这个)3.Spark算子类型了解吗,种类和具体的算子案例4.Spark内存管理了解吗,内存管理的机制介绍一下5.Spark&nbsp;sql调优是怎么做的6.使用过scala语言吗,用在什么地方,在编写代码过程中有什么挑战7.spark缓存机制了解吗,有那几个函数(cache、persist)Spark缓存级别有几个,具体内容是什么8.Spark一般用在什么场景,了解Spark图计算的框架吗(这里因为我项目里有一个图计算的项目,就问了一些图计算的内容,比如用到的算法,还有一个中心度算法,可以多了解一下)9.Spark的数据倾斜问题,map-side-join,spark的spill机制,如果内存不够了要怎么办,如果手动设置了某个参数呢(这里具体的参数名忘掉了)10.SQL题,牛客SQL&nbsp;16题,较难,一开始没啥思路,就把那些SQL语句都写上了,包括limit啥的,测试没跑通,刚刚想重新分析一下,面试官说没关系,题比较难,也基本上写出来了,就没让我再继续改了。之后又问了我一些问题,比如base北京能不能来,居住问题,了解美团的业务群吗,中间还问了我一些项目管理的问题,感觉都不像技术面了。整场面试感觉题目答上来百分之95吧,SQL题没做出来有点遗憾,不过感觉好像面试官不是很在意。反问问了一下base,是不是在望京那边,然后问了一下面试官对于大数据学习的一些建议,面试官建议我可以先区分一下大数据的具体内容,比如离线在线、源码开发还是数据仓库等等,然后根据具体的方向学习对应知识。最后总结一句,面试很nice,面试官也很nice,大家都说美团的面试让人感觉很好,现在看来的确如此。分享一下,积点德,希望能顺利二面然后OC
点赞 评论 收藏
转发
点赞 1 评论
分享
牛客网
牛客企业服务