diff --git a/java/src/org/openqa/selenium/bidi/BiDiProvider.java b/java/src/org/openqa/selenium/bidi/BiDiProvider.java index ae1ac58d7f901..be27cfa4b27f6 100644 --- a/java/src/org/openqa/selenium/bidi/BiDiProvider.java +++ b/java/src/org/openqa/selenium/bidi/BiDiProvider.java @@ -22,6 +22,7 @@ import java.net.URISyntaxException; import java.util.Optional; import java.util.function.Predicate; + import org.openqa.selenium.Capabilities; import org.openqa.selenium.remote.AugmenterProvider; import org.openqa.selenium.remote.ExecuteMethod; @@ -44,15 +45,35 @@ public Class getDescribedInterface() { @Override public HasBiDi getImplementation(Capabilities caps, ExecuteMethod executeMethod) { + return new HasBiDi() { + private volatile BiDi biDi; + private final Object lock = new Object(); + + @Override + public Optional maybeGetBiDi() { + return Optional.ofNullable(biDi); + } - URI wsUri = getBiDiUrl(caps).orElseThrow(() -> new BiDiException("BiDi not supported")); + @Override + public BiDi getBiDi() { + if (biDi == null) { + synchronized (lock) { + if (biDi == null) { + URI wsUri = + getBiDiUrl(caps).orElseThrow(() -> new BiDiException("BiDi not supported")); - HttpClient.Factory clientFactory = HttpClient.Factory.createDefault(); - ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri); - HttpClient wsClient = clientFactory.createClient(wsConfig); - Connection connection = new Connection(wsClient, wsUri.toString()); + HttpClient.Factory clientFactory = HttpClient.Factory.createDefault(); + ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri); + HttpClient wsClient = clientFactory.createClient(wsConfig); + Connection connection = new Connection(wsClient, wsUri.toString()); - return () -> Optional.of(new BiDi(connection)); + biDi = new BiDi(connection); + } + } + } + return biDi; + } + }; } private Optional getBiDiUrl(Capabilities caps) { diff --git a/java/src/org/openqa/selenium/devtools/DevToolsProvider.java b/java/src/org/openqa/selenium/devtools/DevToolsProvider.java index 0f88dac10fcd6..a6d0a51f56435 100644 --- a/java/src/org/openqa/selenium/devtools/DevToolsProvider.java +++ b/java/src/org/openqa/selenium/devtools/DevToolsProvider.java @@ -21,6 +21,7 @@ import java.net.URI; import java.util.Optional; import java.util.function.Predicate; + import org.openqa.selenium.Capabilities; import org.openqa.selenium.devtools.noop.NoOpCdpInfo; import org.openqa.selenium.remote.AugmenterProvider; @@ -42,14 +43,35 @@ public Class getDescribedInterface() { @Override public HasDevTools getImplementation(Capabilities caps, ExecuteMethod executeMethod) { - Object cdpVersion = caps.getCapability("se:cdpVersion"); - String version = cdpVersion instanceof String ? (String) cdpVersion : caps.getBrowserVersion(); + return new HasDevTools() { + private volatile DevTools devTools; + private final Object lock = new Object(); + + @Override + public Optional maybeGetDevTools() { + return Optional.ofNullable(devTools); + } - CdpInfo info = new CdpVersionFinder().match(version).orElseGet(NoOpCdpInfo::new); - Optional devTools = - SeleniumCdpConnection.create(caps).map(conn -> new DevTools(info::getDomains, conn)); + @Override + public DevTools getDevTools() { + if (devTools == null) { + synchronized (lock) { + if (devTools == null) { + Object cdpVersion = caps.getCapability("se:cdpVersion"); + String version = + cdpVersion instanceof String ? (String) cdpVersion : caps.getBrowserVersion(); - return () -> devTools; + CdpInfo info = new CdpVersionFinder().match(version).orElseGet(NoOpCdpInfo::new); + this.devTools = + SeleniumCdpConnection.create(caps) + .map(conn -> new DevTools(info::getDomains, conn)) + .orElseThrow(() -> new DevToolsException("Unable to create DevTools connection"));; + } + } + } + return devTools; + } + }; } private String getCdpUrl(Capabilities caps) {