提交 89f24aab 作者: 张文库

定时任务-关闭浏览器驱动并重新打开

上级 e7ad390c
...@@ -28,7 +28,6 @@ import java.util.stream.Stream; ...@@ -28,7 +28,6 @@ import java.util.stream.Stream;
*/ */
@Slf4j @Slf4j
public class ReuseWebDriver extends RemoteWebDriver { public class ReuseWebDriver extends RemoteWebDriver {
private String serverUrl; private String serverUrl;
public ReuseWebDriver(String serverUrl, String sessionId) throws IOException { public ReuseWebDriver(String serverUrl, String sessionId) throws IOException {
...@@ -47,7 +46,7 @@ public class ReuseWebDriver extends RemoteWebDriver { ...@@ -47,7 +46,7 @@ public class ReuseWebDriver extends RemoteWebDriver {
} }
/*** /***
* 再打开的浏览器同步执行JS脚本 * 在打开的浏览器驱动中同步执行JS脚本
* @author andylau * @author andylau
* @date 2022/7/24 10:06 * @date 2022/7/24 10:06
*/ */
...@@ -61,7 +60,7 @@ public class ReuseWebDriver extends RemoteWebDriver { ...@@ -61,7 +60,7 @@ public class ReuseWebDriver extends RemoteWebDriver {
} }
/*** /***
* 再打开的浏览器异步执行JS脚本 * 在打开的浏览器驱动中异步执行JS脚本
* @author andylau * @author andylau
* @date 2022/7/23 18:06 * @date 2022/7/23 18:06
*/ */
...@@ -92,7 +91,7 @@ public class ReuseWebDriver extends RemoteWebDriver { ...@@ -92,7 +91,7 @@ public class ReuseWebDriver extends RemoteWebDriver {
} }
/*** /***
* 判断是否连接失败并退出 * 判断是否连接失败并退出驱动
* @author andylau * @author andylau
* @date 2022/7/25 14:25 * @date 2022/7/25 14:25
*/ */
...@@ -109,11 +108,15 @@ public class ReuseWebDriver extends RemoteWebDriver { ...@@ -109,11 +108,15 @@ public class ReuseWebDriver extends RemoteWebDriver {
return flag; return flag;
} }
/***
* 重写退出方法,杀掉驱动进程
* @author andylau
* @date 2022/7/25 11:44
*/
@Override @Override
public void quit() { public void quit() {
super.quit(); super.quit();
// 关闭DriverService,避免无法关闭DriverService,导致出现过多Driver进程。 // 彻底关闭DriverService,避免无法关闭DriverService,导致出现过多Driver进程。
try { try {
URL killUrl = new URL(serverUrl + "/shutdown"); URL killUrl = new URL(serverUrl + "/shutdown");
new UrlChecker().waitUntilUnavailable(3, TimeUnit.SECONDS, killUrl); new UrlChecker().waitUntilUnavailable(3, TimeUnit.SECONDS, killUrl);
......
...@@ -108,6 +108,7 @@ public class ChromeTest { ...@@ -108,6 +108,7 @@ public class ChromeTest {
try { try {
// 测试打开bing // 测试打开bing
driver.get("https://www.bing.com"); driver.get("https://www.bing.com");
// getTitle()获取当前页面title的值 // getTitle()获取当前页面title的值
System.out.println("当前打开页面的标题是: " + driver.getTitle()); System.out.println("当前打开页面的标题是: " + driver.getTitle());
......
...@@ -7,6 +7,7 @@ import com.zzsn.job.JedisUtil; ...@@ -7,6 +7,7 @@ import com.zzsn.job.JedisUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.HttpCommandExecutor; import org.openqa.selenium.remote.HttpCommandExecutor;
import java.net.URL; import java.net.URL;
...@@ -19,6 +20,7 @@ import java.util.Map; ...@@ -19,6 +20,7 @@ import java.util.Map;
* @date 2022/7/23 17:14 * @date 2022/7/23 17:14
**/ **/
@Slf4j @Slf4j
@SuppressWarnings("all")
public class DriverUtil { public class DriverUtil {
/*** /***
...@@ -29,8 +31,19 @@ public class DriverUtil { ...@@ -29,8 +31,19 @@ public class DriverUtil {
private static ChromeDriver reconnectDriver() { private static ChromeDriver reconnectDriver() {
System.setProperty("webdriver.chrome.driver", Constants.CHROMEDRIVE); System.setProperty("webdriver.chrome.driver", Constants.CHROMEDRIVE);
ChromeDriverService service = ChromeDriverService.createDefaultService(); ChromeDriverService service = ChromeDriverService.createDefaultService();
ChromeOptions options = new ChromeOptions();
// 无痕模式
options.addArguments("--incognito");
// 禁用沙箱
options.addArguments("no-sandbox");
// 禁用GPU
options.addArguments("--disable-gpu");
// 禁用图形界面(此模式启动会导致驱动通信异常)
// options.addArguments("--headless");
// 禁用插件
options.addArguments("disable-extensions");
// 重新初始化一个chrome浏览器实例 // 重新初始化一个chrome浏览器实例
return new ChromeDriver(service); return new ChromeDriver(service, options);
} }
/*** /***
...@@ -44,7 +57,6 @@ public class DriverUtil { ...@@ -44,7 +57,6 @@ public class DriverUtil {
return server.toString(); return server.toString();
} }
@SuppressWarnings("all")
public static ReuseWebDriver connectChrome(String sessionId, String serverUrl) throws Exception { public static ReuseWebDriver connectChrome(String sessionId, String serverUrl) throws Exception {
if (serverUrl == null || "".equals(serverUrl) || sessionId == null || "".equals(sessionId)) { if (serverUrl == null || "".equals(serverUrl) || sessionId == null || "".equals(sessionId)) {
log.error("未获取到驱动服务地址、sessionId"); log.error("未获取到驱动服务地址、sessionId");
...@@ -56,7 +68,11 @@ public class DriverUtil { ...@@ -56,7 +68,11 @@ public class DriverUtil {
// 若驱动返回错误码,重新创建驱动服务并缓存 // 若驱动返回错误码,重新创建驱动服务并缓存
ChromeDriver chromeDriver = DriverUtil.reconnectDriver(); ChromeDriver chromeDriver = DriverUtil.reconnectDriver();
serverUrl = DriverUtil.getServerUrl(chromeDriver); serverUrl = DriverUtil.getServerUrl(chromeDriver);
if(chromeDriver.getSessionId() != null) {
sessionId = chromeDriver.getSessionId().toString(); sessionId = chromeDriver.getSessionId().toString();
}
Map<String, String> map = new HashMap<>(2); Map<String, String> map = new HashMap<>(2);
map.put("sessionId", sessionId); map.put("sessionId", sessionId);
map.put("serverUrl", serverUrl); map.put("serverUrl", serverUrl);
...@@ -72,7 +88,6 @@ public class DriverUtil { ...@@ -72,7 +88,6 @@ public class DriverUtil {
* @author andylau * @author andylau
* @date 2022/7/25 15:07 * @date 2022/7/25 15:07
*/ */
@SuppressWarnings("all")
public static ReuseWebDriver getChromeDriver() throws Exception { public static ReuseWebDriver getChromeDriver() throws Exception {
String cacheInfo = JedisUtil.getString("SELENIUM_DRIVER_CACHE"); String cacheInfo = JedisUtil.getString("SELENIUM_DRIVER_CACHE");
Map<String, String> map = JSON.parseObject(cacheInfo, Map.class); Map<String, String> map = JSON.parseObject(cacheInfo, Map.class);
......
package com.zzsn.util;
import com.zzsn.crawler.ReuseWebDriver;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author kethy
*/
@Slf4j
@SuppressWarnings("all")
public class WindowsProcess {
private static Pattern TASK_LIST_PATTERN = Pattern.compile("^(.+?)\\s+(\\d+)\\s+(.+?)\\s+\\d+\\s+([0-9,]+)\\s+K$");
private static String DRIVER_NAME = "chrome.exe";
public static void main(String[] args) {
WindowsProcess process = new WindowsProcess();
process.killProcess();
}
/***
* 定时关闭浏览器并重新打开
* @author andylau
* @date 2022/7/26 11:23
*/
private void killProcess() {
try {
String line;
Process p = Runtime.getRuntime().exec("tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
if (line.contains(DRIVER_NAME)) {
Matcher matcher = TASK_LIST_PATTERN.matcher(line);
if (matcher.find()) {
// String serviceName = matcher.group(1);
String pid = matcher.group(2);
// String sessionName = matcher.group(3);
// String size = matcher.group(4).replace(",", "") + "K";
// log.info("正在关闭服务:\n服务名:{}\nPid:{}\n会话名:{}\n内存使用:{}\n", serviceName, pid, sessionName, size);
Runtime.getRuntime().exec("taskkill /pid " + pid);
}
}
}
} catch (Exception e) {
log.error("浏览器驱动关闭异常...");
} finally {
// 定时任务关闭驱动后,重新打开驱动
try {
reopenChromeDriver();
} catch (Exception e) {
log.error("驱动打开异常...");
}
}
}
private void reopenChromeDriver() throws Exception {
// 驱动关闭后重新打开
ReuseWebDriver driver = DriverUtil.getChromeDriver();
if (driver == null) {
// 从缓存取出SessionId为空才时,驱动会返回null,可参考工具类重新设置缓存
log.error("获取浏览器驱动失败,请检查SessionId缓存是否存在...");
}
}
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论