# browser
**Repository Path**: blueisacat1/browser
## Basic Information
- **Project Name**: browser
- **Description**: a browser pool for Java
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-12-13
- **Last Updated**: 2022-04-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Spider, Selenium, Java
## README
# 1. 工具介绍
selenium是一款测试工具,使用webDriver操作浏览器进行真实的web端测试。
在实际应用中,通常会对浏览器进行并发的操作使用,那么对浏览器的管理就变得很麻烦了,所以本工具产生了,本工具对浏览器进行统一的管理,让开发者聚焦在使用webDriver上。
# 2. 如何使用
## 2.1 pom.xml
~~~xml
cn.blueisacat
browser
3.1
~~~
核心使用selenium-java的4.0.0版本,根据实际使用可以更换对应的selenium版本。
## 2.2 配置文件
配置文件browser.yml如下:
~~~yaml
browser:
id: chrome #firefox chrome
driver: pathToDriver #浏览器驱动路径
binary: pathToBinary #浏览器执行文件路径
headless: true #浏览器是否开启无头模式
loadImgResources: true #浏览器是否加载图片
pool:
poolMaxSize: 2 #浏览器池最大值
poolInitSize: 1 #浏览器池初始化值
testOnBorrow: true #获取浏览器时是否测试可用性
recycleInSecond: 60 #回收浏览器时间间隔
~~~
以上为browser对应的配置项,详细介绍如下:
* browser.id:浏览器类型,目前只支持选择其中一种浏览器进行使用,可选值[firefox,chrome]。
* browser.driver:浏览器驱动路径,驱动版本需要与浏览器版本对应,下载地址参考“3.资源下载”
* browser.binary:浏览器执执行文件路径,浏览器版本需要与驱动版本对应。
* browser.headless:浏览器是否开启无头模式,开启无头模式可以节省资源。
* browser.loadImgResources:浏览器是否加载图片,关闭后可节省带宽。
* browser.pool.poolMaxSize:浏览器池最大值,由于浏览器消耗CPU资源大,建议最大值不超过CPU的逻辑核数。
* browser.pool.poolInitSize:浏览器池初始化值,建议初始化值为0,随用随开,节省资源。
* browser.pool.testOnBorrow:获取浏览器时是否测试可用性,建议开启,保证程序获取的浏览器可用性。
* browser.pool.recycleInSecond:回收浏览器时间间隔,每次间隔后检测浏览器是否使用,如果已经不再使用,进行回收(销毁)处理,建议60,单位为秒。
考虑到windows及linux下webDriver的通用性,暂时只兼容了firefox及chrome两种主流浏览器,至于phatomJS已经很长时间无人维护,所以也放弃兼容,如有自定义浏览器的需求,请参考“2.4自定义浏览器”。
配置文件加载顺序如下:
1. browser.config.location指定配置文件
2. 当前目录下的browser.yml
3. 当前目录下的config文件夹中的browser.yml
4. jar包内的browser.yml
## 2.3 使用教程
1. 创建执行器
2. 构造请求参数
3. 执行业务方法
4. 获取执行结果
使用方法1:使用内置FetchPageSourceFunction方法获取页面源代码
~~~java
public class Test {
public static void main(String[] args) {
// 创建执行器
BrowserExecutor executor = new BrowserExecutor();
// 构造请求参数
FetchPageSourceFunction.Request request = new FetchPageSourceFunction.Request("https://www.baidu.com");
// 执行业务方法
BrowserExecutorResult result = executor.execute(new FetchPageSourceFunction(), request);
// 获取执行结果
System.out.println(result.get().getPageSource());
}
}
~~~
使用方法2:使用自定义方法执行业务操作
~~~java
public class Test {
public static void main(String[] args) {
// 创建执行器
BrowserExecutor executor = new BrowserExecutor();
// 构造请求参数
String url = "http://www.baidu.com";
// 执行业务方法
BrowserExecutorResult result = executor.execute(new BrowserExecutorFunction() {
@Override
protected BrowserExecutorResult doBusiness(Browser browser, String url) throws Exception {
browser.getWebDriver().get(url);
Thread.sleep(1_000);
String pageSource = browser.getWebDriver().getPageSource();
return new BrowserExecutorResult(pageSource);
}
}, url);
// 获取执行结果
System.out.println(result.get());
}
}
~~~
其中selenium以及webDriver的使用请参考“4.参考资料”。
## 2.4 自定义浏览器
当前默认支持Chome及Firefox,如有自定义浏览器(修改浏览器配置项、增加其他浏览器支持等)的需求,拓展方法如下:
1. 继承Browser并实现initWebDriver方法
2. 设置全局唯一浏览器id
```java
public class CustomBrowser extends Browser {
private static final String DRIVER_PATH = ConfigUtils.getInstance().getStringVal("browser.driver");
private static final String BINARY_PATH = ConfigUtils.getInstance().getStringVal("browser.binary");
// 全局唯一浏览器id
private static final String id = "globalUniqueBrowserId";
@Override
protected WebDriver initWebDriver() {
// 实例化WebDriver
return webDriver;
}
}
```
3. 在配置文件browser.yml中修改browser.id的值为自定义的全局唯一浏览器id
~~~yaml
browser:
id: globalUniqueBrowserId #firefox chrome
driver: pathToDriver #浏览器驱动路径
binary: pathToBinary #浏览器执行文件路径
pool:
poolMaxSize: 2 #浏览器池最大值
poolInitSize: 1 #浏览器池初始化值
testOnBorrow: true #获取浏览器时是否测试可用性
recycleInSecond: 60 #回收浏览器时间间隔
~~~
# 3. 资源下载
> chromeDriver:
>* http://npm.taobao.org/mirrors/chromedriver/
>* http://chromedriver.storage.googleapis.com/index.html
> geckodriver:
>* http://npm.taobao.org/mirrors/geckodriver/
>* https://github.com/mozilla/geckodriver/releases
# 4. 参考资料
> selenium java api:
>* https://www.selenium.dev/selenium/docs/api/java/overview-summary.html