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端自动化测试学习等..