Selenium 自动化 Sikuli 教程
Selenium 中的 Sikuli 是什么?
Sikuli 是一种开源的基于 GUI 的测试自动化工具。它主要用于与网页元素交互以及处理基于 Windows 的弹出窗口。Sikuli 使用“图像识别”和“控制 GUI”技术与网页元素和 Windows 弹出窗口交互。在 Sikuli 中,所有网页元素都被视为图像并存储在项目中。
如何将 Sikuli 与 Selenium Webdriver 结合使用
Sikuli 可以使用 Sikuli JAR 文件与 Selenium Webdriver 集成。
以下是配置 Sikuli 与 Selenium Webdriver 的步骤序列。
步骤 1) 从以下 URL 下载 Sikuli JAR 文件,并将 ZIP 文件的内容解压到一个文件夹中。
https://mvnrepository.com/artifact/com.sikulix/sikulixapi/2.0.5
步骤 2) 在 Eclipse 中创建一个新的 JAVA 项目,并通过右键单击项目 -> 构建路径 -> 配置构建路径,将 JAR 文件添加到构建路径中,以及 Selenium JAR 文件。
将 JAR 文件添加到项目构建路径后,即可使用 Sikuli 提供的类。
Sikuli 中的 Screen 类
Screen 类是 Sikuli 提供的所有方法的基础类。Screen 类包含所有常用屏幕元素操作的预定义方法,例如单击、双击、向文本框提供输入、悬停等。以下是 Screen 类提供的常用方法列表。
方法 | 描述 | 语法 |
---|---|---|
点击 | 此方法用于使用图像名称作为参数点击屏幕上的元素。 | Screen s = new Screen();
s.click(“QA.png”); |
双击 | 此方法用于双击元素。它接受图像名称作为参数。 | Screen s = new Screen();
s.doubleClick(“QA.png”); |
类型 | 此方法用于向元素提供输入值。它接受图像名称和要发送的文本作为参数。 |
s.type(“QA.png”,”TEXT”); |
悬停 | 此方法用于悬停在元素上。它接受图像名称作为参数。 |
s.hover(“QA.png”); |
查找 | 此方法用于在屏幕上查找特定元素。它接受图像名称作为参数。 |
s.find(“QA.png”); |
Sikuli 中的 Pattern 类
Pattern 类用于将图像文件与附加属性相关联,以唯一标识元素。它将图像路径作为参数。
Pattern p = new Pattern(“图像路径”);
以下是 Pattern 类最常用的方法。
方法 | 描述 | 语法 |
---|---|---|
获取文件名 | 返回 Pattern 对象中包含的文件名。 |
Pattern p = new Pattern(“D:\Demo\QA.png”); String filename = p.getFileName(); |
相似 | 此方法返回一个新 Pattern 对象,其相似度设置为指定值。它接受 0 到 1 之间的相似度值作为参数。Sikuli 查找所有落在指定相似度范围内的元素并返回一个新的 Pattern 对象。 |
Pattern p1 = p.similar(0.7f); |
精确 | 此方法返回一个新的 Pattern 对象,其相似度设置为 1。它只查找指定元素的精确匹配。 |
Pattern p1 = p.exact(); |
使用 Sikuli 进行文件上传的代码示例
以下代码解释了 Sikuli 在 Firefox 中用于文件上传的用法。
package com.sikuli.demo; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.sikuli.script.FindFailed; import org.sikuli.script.Pattern; import org.sikuli.script.Screen; import org.openqa.selenium.chrome.ChromeDriver; public class SikuliDemo { public static void main(String[] args) throws FindFailed { System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); String filepath = "D:\\Guru99Demo\\Files\\"; String inputFilePath = "D:\\Guru99Demo\\Files\\"; Screen s = new Screen(); Pattern fileInputTextBox = new Pattern(filepath + "FileTextBox.PNG"); Pattern openButton = new Pattern(filepath + "OpenButton.PNG"); WebDriver driver; // Open Chrome browser driver = new ChromeDriver(); driver.get("https://demo.guru99.com/test/image_upload/index.php"); // Click on Browse button and handle windows pop up using Sikuli driver.findElement(By.xpath(".//*[@id='photoimg']")).click(); s.wait(fileInputTextBox, 20); s.type(fileInputTextBox, inputFilePath + "Test.docx"); s.click(openButton); // Close the browser driver.close(); } }
代码解释
步骤 1) 第一条语句涉及设置 Chrome 的驱动程序可执行路径。
System.setProperty("webdriver.chrome.driver", "D:\\ chromedriver.exe");
步骤 2) 使用屏幕截图工具(如截图工具)截取 Windows 弹出窗口“FileTextBox”和“Open”按钮的屏幕截图。
您的屏幕截图应如下所示:-
用于 Windows 文件输入文本框和打开按钮的图像分别存储在“FileTextBox.PNG”和“OpenButton.PNG”中。
Sikuli 使用图像识别技术来识别屏幕上的元素。它完全基于图像查找屏幕上的元素。
示例:如果您想自动化打开记事本的操作,则需要将记事本桌面图标的图像存储到 PNG 文件中,并对其执行单击操作。
在我们的案例中,它使用存储的图像识别 Windows 弹出窗口上的文件输入文本框和打开按钮。如果屏幕分辨率从图像捕获到测试脚本执行发生变化,Sikuli 的行为将不一致。因此,始终建议在与捕获图像相同的分辨率下运行测试脚本。图像像素大小的变化将导致 Sikuli 抛出 FindFailed 异常。
步骤 3) 接下来的语句包括创建 Screen 和 Pattern 类的对象。创建一个新的 Screen 对象。将要上传的文件路径设置为 Pattern 对象的参数。
Screen s = new Screen(); Pattern fileInputTextBox = new Pattern(filepath + "FileTextBox.PNG"); Pattern openButton = new Pattern(filepath + "OpenButton.PNG");
步骤 4) 以下语句涉及使用 URL 打开 Chrome 浏览器:https://demo.guru99.com/test/image_upload/index.php
driver = new ChromeDriver(); driver.get("https://demo.guru99.com/test/image_upload/index.php");
上述 URL 是一个演示文件上传功能的应用程序。
步骤 5) 使用以下语句点击选择文件按钮
driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
步骤 6) 等待 Windows 弹出窗口出现。Wait 方法用于处理点击浏览按钮后打开 Windows 弹出窗口的延迟。
s.wait(fileInputTextBox, 20);
步骤 7) 在输入文件文本框中输入文件路径,然后点击“打开”按钮
s.type(fileInputTextBox, inputFilePath + "Test.docx"); s.click(openButton);
步骤 8) 关闭浏览器
driver.close();
输出
最初,脚本打开 Chrome 浏览器
点击“选择文件”按钮,将出现 Windows 文件弹出屏幕。在文件输入文本框中输入数据,然后点击“打开”按钮
文件上传完成后,将显示以下屏幕并关闭浏览器
结论
Sikuli 用于轻松处理网页上的 Flash 对象和 Windows 弹出窗口。当用户界面上的元素不经常更改时,Sikuli 效果最佳。由于此缺点,从自动化测试的角度来看,Sikuli 的优先级低于 Robot 和 AutoIT 等其他框架。