Skip to content

Commit 48e0d17

Browse files
committed
Make firefox and chrome announce cdp uri and version in their capabilities
1 parent d901aa6 commit 48e0d17

File tree

4 files changed

+65
-48
lines changed

4 files changed

+65
-48
lines changed

java/client/src/org/openqa/selenium/chromium/ChromiumDevToolsLocator.java

-23
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,13 @@
1818
package org.openqa.selenium.chromium;
1919

2020
import org.openqa.selenium.Capabilities;
21-
import org.openqa.selenium.devtools.Connection;
22-
import org.openqa.selenium.remote.http.ClientConfig;
23-
import org.openqa.selenium.remote.http.HttpClient;
2421

2522
import java.net.URI;
2623
import java.net.URISyntaxException;
2724
import java.util.Map;
2825
import java.util.Optional;
29-
import java.util.logging.Level;
3026
import java.util.logging.Logger;
3127

32-
import static org.openqa.selenium.devtools.CdpEndpointFinder.getCdpEndPoint;
33-
3428
public class ChromiumDevToolsLocator {
3529

3630
private static final Logger LOG = Logger.getLogger(ChromiumDevToolsLocator.class.getName());
@@ -63,21 +57,4 @@ public static Optional<URI> getReportedUri(String capabilityKey, Capabilities ca
6357
return Optional.empty();
6458
}
6559
}
66-
67-
public static Optional<Connection> getChromeConnector(
68-
HttpClient.Factory clientFactory,
69-
Capabilities caps,
70-
String capabilityKey) {
71-
72-
try {
73-
return getReportedUri(capabilityKey, caps)
74-
.flatMap(uri -> getCdpEndPoint(clientFactory, uri))
75-
.map(uri -> new Connection(
76-
clientFactory.createClient(ClientConfig.defaultConfig().baseUri(uri)),
77-
uri.toString()));
78-
} catch (Exception e) {
79-
LOG.log(Level.WARNING, "Unable to create CDP connection", e);
80-
return Optional.empty();
81-
}
82-
}
8360
}

java/client/src/org/openqa/selenium/chromium/ChromiumDriver.java

+26-5
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
import org.openqa.selenium.Capabilities;
2323
import org.openqa.selenium.Credentials;
2424
import org.openqa.selenium.HasAuthentication;
25+
import org.openqa.selenium.ImmutableCapabilities;
26+
import org.openqa.selenium.PersistentCapabilities;
2527
import org.openqa.selenium.WebDriver;
2628
import org.openqa.selenium.WebDriverException;
29+
import org.openqa.selenium.devtools.CdpEndpointFinder;
2730
import org.openqa.selenium.devtools.CdpInfo;
2831
import org.openqa.selenium.devtools.CdpVersionFinder;
2932
import org.openqa.selenium.devtools.Connection;
@@ -47,6 +50,7 @@
4750
import org.openqa.selenium.remote.RemoteWebDriver;
4851
import org.openqa.selenium.remote.html5.RemoteLocationContext;
4952
import org.openqa.selenium.remote.html5.RemoteWebStorage;
53+
import org.openqa.selenium.remote.http.ClientConfig;
5054
import org.openqa.selenium.remote.http.HttpClient;
5155
import org.openqa.selenium.remote.mobile.RemoteNetworkConnection;
5256

@@ -71,6 +75,8 @@ public class ChromiumDriver extends RemoteWebDriver implements
7175
WebStorage {
7276

7377
private static final Logger LOG = Logger.getLogger(ChromiumDriver.class.getName());
78+
79+
private final Capabilities capabilities;
7480
private final RemoteLocationContext locationContext;
7581
private final RemoteWebStorage webStorage;
7682
private final TouchScreen touchScreen;
@@ -86,12 +92,15 @@ protected ChromiumDriver(CommandExecutor commandExecutor, Capabilities capabilit
8692
networkConnection = new RemoteNetworkConnection(getExecuteMethod());
8793

8894
HttpClient.Factory factory = HttpClient.Factory.createDefault();
89-
connection = ChromiumDevToolsLocator.getChromeConnector(
90-
factory,
91-
getCapabilities(),
92-
capabilityKey);
95+
Capabilities originalCapabilities = super.getCapabilities();
96+
Optional<URI> cdpUri = ChromiumDevToolsLocator.getReportedUri(capabilityKey, originalCapabilities)
97+
.flatMap(uri -> CdpEndpointFinder.getCdpEndPoint(factory, uri));
98+
99+
connection = cdpUri.map(uri -> new Connection(
100+
factory.createClient(ClientConfig.defaultConfig().baseUri(uri)),
101+
uri.toString()));
93102

94-
CdpInfo cdpInfo = new CdpVersionFinder().match(getCapabilities().getBrowserVersion())
103+
CdpInfo cdpInfo = new CdpVersionFinder().match(originalCapabilities.getBrowserVersion())
95104
.orElseGet(() -> {
96105
LOG.warning(
97106
String.format(
@@ -108,6 +117,18 @@ protected ChromiumDriver(CommandExecutor commandExecutor, Capabilities capabilit
108117
});
109118

110119
devTools = connection.map(conn -> new DevTools(cdpInfo::getDomains, conn));
120+
121+
this.capabilities = cdpUri.map(uri -> new ImmutableCapabilities(
122+
new PersistentCapabilities(originalCapabilities)
123+
.setCapability("se:cdp", uri.toString())
124+
.setCapability(
125+
"se:cdpVersion", originalCapabilities.getBrowserVersion())))
126+
.orElse(new ImmutableCapabilities(originalCapabilities));
127+
}
128+
129+
@Override
130+
public Capabilities getCapabilities() {
131+
return capabilities;
111132
}
112133

113134
@Override

java/client/src/org/openqa/selenium/firefox/FirefoxDriver.java

+39-19
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.openqa.selenium.ImmutableCapabilities;
2525
import org.openqa.selenium.MutableCapabilities;
2626
import org.openqa.selenium.OutputType;
27+
import org.openqa.selenium.PersistentCapabilities;
2728
import org.openqa.selenium.Proxy;
2829
import org.openqa.selenium.WebDriverException;
2930
import org.openqa.selenium.devtools.CdpEndpointFinder;
@@ -52,6 +53,7 @@
5253
import java.net.URI;
5354
import java.net.URISyntaxException;
5455
import java.nio.file.Path;
56+
import java.util.Optional;
5557
import java.util.ServiceLoader;
5658
import java.util.Set;
5759
import java.util.stream.StreamSupport;
@@ -160,8 +162,10 @@ public FirefoxDriverCommandExecutor(DriverService service) {
160162
}
161163
}
162164

165+
private final Capabilities capabilities;
163166
protected FirefoxBinary binary;
164-
private RemoteWebStorage webStorage;
167+
private final RemoteWebStorage webStorage;
168+
private final Optional<URI> cdpUri;
165169
private DevTools devTools;
166170

167171
public FirefoxDriver() {
@@ -201,6 +205,27 @@ public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options) {
201205
private FirefoxDriver(FirefoxDriverCommandExecutor executor, FirefoxOptions options) {
202206
super(executor, dropCapabilities(options));
203207
webStorage = new RemoteWebStorage(getExecuteMethod());
208+
209+
Capabilities capabilities = super.getCapabilities();
210+
Optional<URI> cdpUri = Optional.empty();
211+
if (capabilities.getCapability("moz:debuggerAddress") instanceof String) {
212+
try {
213+
URI providedUri = new URI(String.format("http://%s", capabilities.getCapability("moz:debuggerAddress")));
214+
HttpClient.Factory clientFactory = HttpClient.Factory.createDefault();
215+
216+
cdpUri = CdpEndpointFinder.getCdpEndPoint(clientFactory, providedUri);
217+
} catch (RuntimeException | URISyntaxException e) {
218+
// Swallow the exception.
219+
}
220+
}
221+
222+
this.cdpUri = cdpUri;
223+
this.capabilities = cdpUri.map(uri ->
224+
new ImmutableCapabilities(
225+
new PersistentCapabilities(capabilities)
226+
.setCapability("se:cdp", uri.toString())
227+
.setCapability("se:cdpVersion", "86")))
228+
.orElse(new ImmutableCapabilities(capabilities));
204229
}
205230

206231
private static FirefoxDriverCommandExecutor toExecutor(FirefoxOptions options) {
@@ -220,6 +245,11 @@ private static FirefoxDriverCommandExecutor toExecutor(FirefoxOptions options) {
220245
return new FirefoxDriverCommandExecutor(builder.withOptions(options).build());
221246
}
222247

248+
@Override
249+
public Capabilities getCapabilities() {
250+
return capabilities;
251+
}
252+
223253
@Override
224254
public void setFileDetector(FileDetector detector) {
225255
throw new WebDriverException(
@@ -323,27 +353,17 @@ private static Capabilities dropCapabilities(Capabilities capabilities) {
323353
@Override
324354
public DevTools getDevTools() {
325355
if (devTools == null) {
326-
Object debuggerAddress = getCapabilities().getCapability("moz:debuggerAddress");
327-
if (debuggerAddress == null) {
328-
throw new WebDriverException("This version of Firefox or geckodriver does not support CDP");
329-
}
356+
URI wsUri = cdpUri.orElseThrow(() ->
357+
new DevToolsException("This version of Firefox or geckodriver does not support CDP"));
330358

331-
try {
332-
HttpClient.Factory clientFactory = HttpClient.Factory.createDefault();
333-
334-
URI uri = new URI(String.format("http://%s", debuggerAddress));
335-
URI wsUri = CdpEndpointFinder.getCdpEndPoint(clientFactory, uri)
336-
.orElseThrow(() -> new DevToolsException("Unable to determine URI to connect to from " + debuggerAddress));
359+
HttpClient.Factory clientFactory = HttpClient.Factory.createDefault();
337360

338-
ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri);
339-
HttpClient wsClient = clientFactory.createClient(wsConfig);
361+
ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri);
362+
HttpClient wsClient = clientFactory.createClient(wsConfig);
340363

341-
Connection connection = new Connection(wsClient, wsUri.toString());
342-
CdpInfo cdpInfo = new CdpVersionFinder().match("86.0").orElseGet(NoOpCdpInfo::new);
343-
devTools = new DevTools(cdpInfo::getDomains, connection);
344-
} catch (URISyntaxException e) {
345-
throw new WebDriverException("Could not initialize DevTools", e);
346-
}
364+
Connection connection = new Connection(wsClient, wsUri.toString());
365+
CdpInfo cdpInfo = new CdpVersionFinder().match("86.0").orElseGet(NoOpCdpInfo::new);
366+
devTools = new DevTools(cdpInfo::getDomains, connection);
347367
}
348368
return devTools;
349369
}

java/client/test/org/openqa/selenium/chromium/LoggingTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.openqa.selenium.By;
2323
import org.openqa.selenium.JavascriptExecutor;
2424
import org.openqa.selenium.WebElement;
25-
import org.openqa.selenium.devtools.events.CdpEventTypes;
2625
import org.openqa.selenium.devtools.events.ConsoleEvent;
2726
import org.openqa.selenium.devtools.events.DomMutationEvent;
2827
import org.openqa.selenium.logging.HasLogEvents;

0 commit comments

Comments
 (0)