From 49b8ed4ddca46ae083bc4b88cc06a9f83eb75c0d Mon Sep 17 00:00:00 2001 From: sixcorners Date: Mon, 10 Feb 2025 11:59:47 -0500 Subject: [PATCH] Support getting the browser level ChromeDevToolsService Fixes #100 --- .../kklisura/cdt/services/ChromeService.java | 19 +++++++- .../cdt/services/impl/ChromeServiceImpl.java | 43 +++++++++++++------ .../services/impl/ChromeServiceImplTest.java | 30 +++++++++++++ 3 files changed, 78 insertions(+), 14 deletions(-) diff --git a/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/ChromeService.java b/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/ChromeService.java index ab4667b9..2a466844 100644 --- a/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/ChromeService.java +++ b/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/ChromeService.java @@ -79,7 +79,7 @@ public interface ChromeService { * @return Version info. * @throws ChromeServiceException If request fails for any reason. */ - ChromeVersion getVersion() throws ChromeServiceException;; + ChromeVersion getVersion() throws ChromeServiceException; /** * Creates a dev tools service to specified tab. @@ -99,4 +99,21 @@ ChromeDevToolsService createDevToolsService( * @return Dev tools. */ ChromeDevToolsService createDevToolsService(ChromeTab tab) throws ChromeServiceException; + + /** + * Creates a dev tools service to the browser. + * + * @param chromeDevToolsServiceConfiguration Service configuration. + * @return Dev tools. + */ + ChromeDevToolsService createDevToolsService( + ChromeDevToolsServiceConfiguration chromeDevToolsServiceConfiguration) + throws ChromeServiceException; + + /** + * Creates a dev tools service to the browser with default service configuration. + * + * @return Dev tools. + */ + ChromeDevToolsService createDevToolsService() throws ChromeServiceException; } diff --git a/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/impl/ChromeServiceImpl.java b/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/impl/ChromeServiceImpl.java index 0474f700..49e1b179 100644 --- a/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/impl/ChromeServiceImpl.java +++ b/cdt-java-client/src/main/java/com/github/kklisura/cdt/services/impl/ChromeServiceImpl.java @@ -156,22 +156,40 @@ public ChromeVersion getVersion() throws ChromeServiceException { } @Override - public synchronized ChromeDevToolsService createDevToolsService(ChromeTab tab) - throws ChromeServiceException { + public ChromeDevToolsService createDevToolsService() throws ChromeServiceException { + return createDevToolsService(null, new ChromeDevToolsServiceConfiguration()); + } + + @Override + public ChromeDevToolsService createDevToolsService(ChromeTab tab) throws ChromeServiceException { return createDevToolsService(tab, new ChromeDevToolsServiceConfiguration()); } + @Override + public ChromeDevToolsService createDevToolsService( + ChromeDevToolsServiceConfiguration chromeDevToolsServiceConfiguration) + throws ChromeServiceException { + return createDevToolsService(null, chromeDevToolsServiceConfiguration); + } + @Override public synchronized ChromeDevToolsService createDevToolsService( ChromeTab tab, ChromeDevToolsServiceConfiguration chromeDevToolsServiceConfiguration) throws ChromeServiceException { + String id, webSocketDebuggerUrl; + if (tab == null) { + id = "browser"; + webSocketDebuggerUrl = getVersion().getWebSocketDebuggerUrl(); + } else { + id = tab.getId(); + webSocketDebuggerUrl = tab.getWebSocketDebuggerUrl(); + } try { - if (isChromeDevToolsServiceCached(tab)) { - return getCachedChromeDevToolsService(tab); + if (isChromeDevToolsServiceCached(id)) { + return getCachedChromeDevToolsService(id); } // Connect to a tab via web socket - String webSocketDebuggerUrl = tab.getWebSocketDebuggerUrl(); WebSocketService webSocketService = webSocketServiceFactory.createWebSocketService(webSocketDebuggerUrl); @@ -199,7 +217,7 @@ public synchronized ChromeDevToolsService createDevToolsService( commandInvocationHandler.setChromeDevToolsService(chromeDevToolsService); // Cache it up. - cacheChromeDevToolsService(tab, chromeDevToolsService); + cacheChromeDevToolsService(id, chromeDevToolsService); return chromeDevToolsService; } catch (WebSocketServiceException ex) { @@ -238,17 +256,16 @@ public void clearChromeDevToolsServiceCache(ChromeTab tab) { } } - private boolean isChromeDevToolsServiceCached(ChromeTab tab) { - return chromeDevToolServiceCache.get(tab.getId()) != null; + private boolean isChromeDevToolsServiceCached(String id) { + return chromeDevToolServiceCache.get(id) != null; } - private ChromeDevToolsService getCachedChromeDevToolsService(ChromeTab tab) { - return chromeDevToolServiceCache.get(tab.getId()); + private ChromeDevToolsService getCachedChromeDevToolsService(String id) { + return chromeDevToolServiceCache.get(id); } - private void cacheChromeDevToolsService( - ChromeTab tab, ChromeDevToolsService chromeDevToolsService) { - chromeDevToolServiceCache.put(tab.getId(), chromeDevToolsService); + private void cacheChromeDevToolsService(String id, ChromeDevToolsService chromeDevToolsService) { + chromeDevToolServiceCache.put(id, chromeDevToolsService); } /** diff --git a/cdt-java-client/src/test/java/com/github/kklisura/cdt/services/impl/ChromeServiceImplTest.java b/cdt-java-client/src/test/java/com/github/kklisura/cdt/services/impl/ChromeServiceImplTest.java index b50ec922..f94af72e 100644 --- a/cdt-java-client/src/test/java/com/github/kklisura/cdt/services/impl/ChromeServiceImplTest.java +++ b/cdt-java-client/src/test/java/com/github/kklisura/cdt/services/impl/ChromeServiceImplTest.java @@ -351,6 +351,36 @@ public void testGetDevTools() assertNotNull(devTools); } + @Test + public void testGetBrowserDevTools() + throws IOException, ChromeServiceException, WebSocketServiceException { + MockWebServer server = new MockWebServer(); + String fixture = ChromeServiceImpl.inputStreamToString(getFixture("chrome/version.json")); + server.enqueue(new MockResponse().setBody(fixture)); + server.start(); + + ChromeServiceImpl service = + new ChromeServiceImpl(server.getHostName(), server.getPort(), webSocketServiceFactory); + + ObjectMapper mapper = new ObjectMapper(); + + expect( + webSocketServiceFactory.createWebSocketService( + mapper.readTree(fixture).path("webSocketDebuggerUrl").asText())) + .andReturn(webSocketService); + + webSocketService.addMessageHandler(anyObject()); + + replayAll(); + + ChromeDevTools devTools = service.createDevToolsService(); + + verifyAll(); + + assertNotNull(devTools); + server.shutdown(); + } + @Test public void testGetDevToolsIsCachedPerTab() throws IOException, ChromeServiceException, WebSocketServiceException {