前段时间同事让我帮他老婆写一个可以自动操作浏览器办理业务的小程序,一开始是想着在网上找一找有没有的RPA软件(公司里用过金智维RPA,感觉自己比较熟悉),但是莫得找到,就只能自己用Java试一试了
这里我选择Selenium来帮助我实现这一功能。
Selenium 是一个用于Web应用程序测试的强大工具。它提供了一套API,允许你使用多种编程语言(包括Java)编写测试脚本,以模拟用户与网页的交互,比如点击按钮、填写表单等。selenium-java这个依赖提供了运行Selenium测试所需的所有Java绑定和库。
WebDriverManager是一个辅助工具,用于简化Selenium WebDriver的使用过程。在使用Selenium时,需要下载对应浏览器的驱动程序(例如,对于Chrome浏览器,需要chromedriver)。WebDriverManager自动处理这些驱动程序的下载和设置,使得你不需要手动去寻找和配置相应的driver版本。
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.8.3</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.3.2</version>
</dependency>
这里有两种初始化方式,一个是远程自动处理这些驱动程序的下载,一个是本地加载驱动程序
自动处理这些驱动程序的下载和设置
// 使用WebDriverManager自动设置EdgeDriver
WebDriverManager.edgedriver().setup();
// 创建EdgeDriver实例
WebDriver driver = new EdgeDriver();
本地加载驱动程序
//这里使用下载msedgedriver.exe的绝对路径
System.setProperty("webdriver.edge.driver", "/msedgedriver.exe");
WebDriver driver = new EdgeDriver();
一般RPA程序都是为了代替重复手工操作,所以这里我使用责任链模式,将每一步的操作都连接成一条完成的流程。
/**
* @Description 抽象流程节点类,作为责任链模式抽象父类
* @ClassName AbstractHandler
* @Author pzj
* @Data 2024/3/4 9:45
*/
public abstract class AbstractHandler {
//责任链中的下一个对象
private AbstractHandler nextHandler;
/**
* 责任链的下一个对象
*/
public void setNextHandler(AbstractHandler nextHandler){
this.nextHandler = nextHandler;
}
/**
* 具体参数拦截逻辑,给子类去实现
*/
public void filter(RPARequest request, RPAResponse response) {
doFilter(request,response);
if (getNextHandler() != null) {
getNextHandler().filter(request,response);
}
}
public AbstractHandler getNextHandler() {
return nextHandler;
}
public abstract void doFilter(RPARequest request, RPAResponse response);
}
其中使用到的RPARequest与RPAResponse一个是为了接受参数信息,一个是为了响应数据,用来在流程中进行数据传递使用。
先创建一个管理类用于管理流程节点。
/**
* @Description 流程责任链式管理
* @ClassName ScheduleChainPattern
* @Author pzj
* @Data 2024/3/4 13:54
*/
@Slf4j
public class ChainPattern {
public List<AbstractHandler> abstractHandlers;
private AbstractHandler abstractHandler;
public ChainPattern(List<AbstractHandler> abstractHandlers){
this.abstractHandlers=abstractHandlers;
}
//spring注入后自动执行,责任链的对象连接起来
@PostConstruct
public void initializeChainPattern(){
log.info("初始化责任链");
for(int i = 0;i<abstractHandlers.size();i++){
if(i == 0){
abstractHandler = abstractHandlers.get(0);
}else{
AbstractHandler currentHander = abstractHandlers.get(i - 1);
AbstractHandler nextHander = abstractHandlers.get(i);
currentHander.setNextHandler(nextHander);
}
}
}
//直接调用这个方法使用
public RPAResponse exec(RPARequest request, RPAResponse response) {
abstractHandler.filter(request, response);
return response;
}
public AbstractHandler getAbstractHandler() {
return abstractHandler;
}
public void setAbstractHandler(AbstractHandler abstractHandler) {
this.abstractHandler = abstractHandler;
}
}
初始化流程管理器。
/**
* 初始化责任链
*
* @return
*/
public ChainPattern initChinPattern() {
List<AbstractHandler> abstractHandlers = new ArrayList<>();
abstractHandlers.add(new FirstTemplate());
abstractHandlers.add(new SecondTemplate());
abstractHandlers.add(new ThirdTemplate());
ChainPattern chainPattern = new ChainPattern(abstractHandlers);
chainPattern.initializeChainPattern();
return chainPattern;
}
下面就是对Selenium包中的API进行调用就行了(请叫我API调用大师),这里就不多介绍了;这个博主整理的比较全WebDriver API实例详解(java)
这里省略100字~~~