From 868d2111fb93dc5720c9755a9265ea7a9aebb80d Mon Sep 17 00:00:00 2001 From: David Cockbill Date: Mon, 22 Sep 2025 08:35:42 +0100 Subject: [PATCH] List and close existing tabs #86 - Expose http methods for listing and closing tabs --- .../devtools/client/ChromeDevToolsClient.java | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/ChromeDevToolsClient/src/main/java/com/hubspot/chrome/devtools/client/ChromeDevToolsClient.java b/ChromeDevToolsClient/src/main/java/com/hubspot/chrome/devtools/client/ChromeDevToolsClient.java index 893c613..587483f 100644 --- a/ChromeDevToolsClient/src/main/java/com/hubspot/chrome/devtools/client/ChromeDevToolsClient.java +++ b/ChromeDevToolsClient/src/main/java/com/hubspot/chrome/devtools/client/ChromeDevToolsClient.java @@ -82,21 +82,25 @@ public ChromeDevToolsSession connect(String host, int port) throws URISyntaxExce ); } - @Override - public void close() { - try { - executorService.shutdown(); - httpClient.close(); - } catch (Throwable t) { - LOG.error("Could not properly close chrome client", t); + public List listTargets(String host, int port) { + String url = String.format("http://%s:%d/json/list", host, port); + HttpRequest httpRequest = HttpRequest + .newBuilder() + .setUrl(url) + .setMethod(Method.GET) + .build(); + + HttpResponse response = httpClient.execute(httpRequest); + + if (response.isError()) { + throw new ChromeDevToolsException("Unable to find available chrome session info."); } + + return response.getAs(new TypeReference<>() {}); } - private TargetID getFirstAvailableTargetId(String host, int port) { - if (defaultStartNewTarget) { - return startNewTarget(host, port); - } - String url = String.format("http://%s:%d/json/list", host, port); + public boolean closeTarget(String host, int port, String targetId) { + String url = String.format("http://%s:%d/json/close/%s", host, port, targetId); HttpRequest httpRequest = HttpRequest .newBuilder() .setUrl(url) @@ -106,11 +110,28 @@ private TargetID getFirstAvailableTargetId(String host, int port) { HttpResponse response = httpClient.execute(httpRequest); if (response.isError()) { - throw new ChromeDevToolsException("Unable to find available chrome session info."); + throw new ChromeDevToolsException("Unable to close target."); + } + + return response.isSuccess(); + } + + @Override + public void close() { + try { + executorService.shutdown(); + httpClient.close(); + } catch (Throwable t) { + LOG.error("Could not properly close chrome client", t); } + } - List sessions = response.getAs(new TypeReference<>() {}); - if (sessions.size() == 0) { + private TargetID getFirstAvailableTargetId(String host, int port) { + if (defaultStartNewTarget) { + return startNewTarget(host, port); + } + List sessions = listTargets(host, port); + if (sessions.isEmpty()) { return startNewTarget(host, port); } return new TargetID(sessions.get(0).getId());