如何在Java中使用Sikuli与Selenium WebDriver实现文件上传功能
Sikuli 集成Selenium Webdriver -- Java
- 目录
- Sikuli简介
- 主要目的
- 环境设置
- 第一种
- 第二种
- 用Sikuli上传文件
- 代码解释
- 结论
目录
Sikuli简介
Sikuli是由MIT(麻省理工学院) 研究团队发布的一种图形化编程技术(编程小白的福音),使用Sikuli你只需要会写HelloWorld这种最基本的编程技能即可,用Sikuli不需要去写出一行行复杂的代码,而是用屏幕截图的方式,用截出来的图形元素组合出神奇的程序。
- Sikuli官网:http://slides.sikuli.org/
- API doc :http://nightly.sikuli.de/docs/index.html
- Sikuli是开源的,源码可在Github查看:https://github.com/sikuli/sikuli
主要目的
在自动化的过程中,不管是web端还是APP端,你可能会遇到一些元素无法定位(就是完全没有任何属性,反正我是遇到过。。),导致一些操作无法实施,你可能借助一些第三方的工具来实施,比如说处理文件的上传(这个在之前的博客中有写过两种方法查看),今天主要用上传文件演示Sikuli的调用方法。
环境设置
这边介绍两种调用Sikuli的方法(必须已经配置过Java环境,Java环境配置:查看):
第一种
首先下载sikuli的jar包,地址:https://raiman.github.io/SikuliX1/downloads.html,
打开链接,点击下载:
将下载的jar包加入到引用库中,我这里用的是IDEA的编译器(强烈推荐,不过还是选择自己喜欢的),方法:
- 首先打开Idea编译器点击File->Project Structure
- 依次点击Modules->Dependencies-> +
- 选择下载好的sikulixapi.jar包点击OK,你将会看到:
第一种的环境已经可以了,你可以尝试以一下,启动桌面上的Chrome(运行代码时确保桌面上Chrome的图标没有被其他窗口遮挡,要不然会报错的)。
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class sikuliTest {
public static void main(String[] args) throws FindFailed {
Screen s = new Screen();
// 定义图片路径
String imgPath = "H:\\code\\sikuliTest\\src\\test\\java\\imgs\\Chrome.png";
// 点击应用
s.doubleClick(imgPath);
}
}
第二种
第二种相对简单,直接用构建工具maven来实现
- 首先本地要有maven的环境(没有配置的需要自行配置,自行度娘去)
- 创建一个maven项目在pom.xml中引入插件,根据不同的系统选择不同的依赖插件,这里是Windows的,插件选择地址:查看
<!-- 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 -->
<dependency>
<groupId>com.sikulix</groupId>
<artifactId>sikulixlibswin</artifactId>
<version>1.1.1</version>
</dependency>
加入到pom中之后,运行下载依赖包
至此,第二种方法也已经介绍完毕,可以用上边的代码验证。
用Sikuli上传文件
import org.sikuli.script.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
public class fileUploadBySikuli {
public static void main(String[] args) throws FindFailed {
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
String imgPath = "H:\\study\\code\\sikuliTest\\src\\test\\java\\imgs\\";
String inputFilePath = "H:\\study\\code\\sikuliTest\\src\\test\\java\\tempTest\\";
Screen s = new Screen();
Pattern fileInputTextBox = new Pattern(imgPath + "fileTextBox.PNG");
Pattern openButton = new Pattern(imgPath + "openButton.PNG");
WebDriver driver;
driver = new ChromeDriver();
// 两个个上传文件的demo,任选其一就好
driver.get("http://demo.guru99.com/test/image_upload/index.php");
driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
// 第二个
// driver.get("http://www.sahitest.com/demo/php/fileUpload.htm");
// driver.findElement(By.xpath("//*[@id=\"file5\"]")).click();
// 等待输入框出现
s.wait(fileInputTextBox, 20);
//输入上传文件的路径
s.type(fileInputTextBox, inputFilePath + "test.txt");
//点击打开按钮
s.click(openButton);
driver.close();
}
}
代码解释
- 设置driver的可执行路径
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
- 定义图片保存路径和上传文件的路径(需要手动将要用到的图片截图保存到相应的文件夹中)
- 接下来就是创建Screen和Pattern类的对象了具体用法参考:查看
Screen s = new Screen();
Pattern fileInputTextBox = new Pattern(imgPath + "fileTextBox.PNG");
Pattern openButton = new Pattern(imgPath + "openButton.PNG");
- 启动浏览器并打开链接,点击上传按钮
driver = new ChromeDriver();
driver.get("http://demo.guru99.com/test/image_upload/index.php");
driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
- 等到Windows弹窗出现,sikuli开始操作,首先等待输入框出现,然后输入上传文件的路径,点击打开
s.wait(fileInputTextBox, 20);
//输入上传文件的路径
s.type(fileInputTextBox, inputFilePath + "test.txt");
//点击打开按钮
s.click(openButton);
- 最终上传上传成功,关掉浏览器
结论
Sikuli用于处理web页面上的一些无法定位的对象和windows弹出窗口。当用户界面上的元素不经常更改时,可以使用Sikuli实现。不过这个软件代码的可移植性比较差,有的平台图片识别度不高。总的来说,与Robot和AutoIT等其他框架相比,Sikuli受到的青睐较少,不过还是可以用来辅助识别一些元素的。
上一篇: 简单易懂——Sikuli基础功能概览
下一篇: 你了解多少种UI自动化测试工具呢?