Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions java/src/org/openqa/selenium/chromium/ChromiumDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import java.net.URI;
import java.net.URISyntaxException;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -119,7 +120,21 @@ protected ChromiumDriver(
return null;
});

this.biDi = createBiDi(biDiUri);
// Extract WebSocket configuration from capabilities
Duration webSocketTimeout = Duration.ofSeconds(30); // Default value
Duration webSocketInterval = Duration.ofMillis(100); // Default value

Object timeoutCapability = originalCapabilities.getCapability("se:webSocketTimeout");
if (timeoutCapability instanceof Number) {
webSocketTimeout = Duration.ofMillis(((Number) timeoutCapability).longValue());
}

Object intervalCapability = originalCapabilities.getCapability("se:webSocketInterval");
if (intervalCapability instanceof Number) {
webSocketInterval = Duration.ofMillis(((Number) intervalCapability).longValue());
}

this.biDi = createBiDi(biDiUri, webSocketTimeout, webSocketInterval);

Optional<URI> reportedUri =
CdpEndpointFinder.getReportedUri(capabilityKey, originalCapabilities);
Expand Down Expand Up @@ -295,7 +310,7 @@ public Optional<DevTools> maybeGetDevTools() {
return devTools;
}

private Optional<BiDi> createBiDi(Optional<URI> biDiUri) {
private Optional<BiDi> createBiDi(Optional<URI> biDiUri, Duration webSocketTimeout, Duration webSocketInterval) {
if (biDiUri.isEmpty()) {
return Optional.empty();
}
Expand All @@ -308,7 +323,10 @@ private Optional<BiDi> createBiDi(Optional<URI> biDiUri) {
+ " capability is set."));

HttpClient.Factory clientFactory = HttpClient.Factory.createDefault();
ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri);
ClientConfig wsConfig = ClientConfig.defaultConfig()
.baseUri(wsUri)
.webSocketTimeout(webSocketTimeout)
.webSocketInterval(webSocketInterval);
HttpClient wsClient = clientFactory.createClient(wsConfig);

org.openqa.selenium.bidi.Connection biDiConnection =
Expand Down
66 changes: 65 additions & 1 deletion java/src/org/openqa/selenium/chromium/ChromiumOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.time.Duration;
import java.util.*;
import java.util.stream.Stream;
import org.openqa.selenium.Capabilities;
Expand Down Expand Up @@ -61,6 +62,8 @@ public class ChromiumOptions<T extends ChromiumOptions<?>>
private final List<String> extensions = new ArrayList<>();
private final Map<String, Object> experimentalOptions = new HashMap<>();
private Map<String, Object> androidOptions = new HashMap<>();
private Duration webSocketTimeout = Duration.ofSeconds(30);
private Duration webSocketInterval = Duration.ofMillis(100);

private final String capabilityName;

Expand Down Expand Up @@ -219,14 +222,67 @@ private T setAndroidCapability(String name, Object value) {
return (T) this;
}

/**
* Sets the WebSocket response wait timeout (in seconds) used for communicating with the browser.
*
* @param timeout WebSocket response wait timeout
* @return A self reference.
*/
public T setWebSocketTimeout(Duration timeout) {
this.webSocketTimeout = Require.nonNull("WebSocket timeout", timeout);
return (T) this;
}

/**
* Gets the WebSocket response wait timeout (in seconds) used for communicating with the browser.
*
* @return WebSocket response wait timeout
*/
public Duration getWebSocketTimeout() {
return webSocketTimeout;
}

/**
* Sets the WebSocket response wait interval (in seconds) used for communicating with the browser.
*
* @param interval WebSocket response wait interval
* @return A self reference.
*/
public T setWebSocketInterval(Duration interval) {
this.webSocketInterval = Require.nonNull("WebSocket interval", interval);
return (T) this;
}

/**
* Gets the WebSocket response wait interval (in seconds) used for communicating with the browser.
*
* @return WebSocket response wait interval
*/
public Duration getWebSocketInterval() {
return webSocketInterval;
}

@Override
protected Set<String> getExtraCapabilityNames() {
return Collections.singleton(capabilityName);
Set<String> names = new HashSet<>();
names.add(capabilityName);
names.add("se:webSocketTimeout");
names.add("se:webSocketInterval");
return names;
}

@Override
protected Object getExtraCapability(String capabilityName) {
Require.nonNull("Capability name", capabilityName);

// Handle WebSocket configuration capabilities
if ("se:webSocketTimeout".equals(capabilityName)) {
return webSocketTimeout.toMillis();
}
if ("se:webSocketInterval".equals(capabilityName)) {
return webSocketInterval.toMillis();
}

if (!this.capabilityName.equals(capabilityName)) {
return null;
}
Expand Down Expand Up @@ -319,6 +375,14 @@ protected void mergeInPlace(Capabilities capabilities) {

Optional.ofNullable(options.androidOptions)
.ifPresent(opts -> opts.forEach(this::setAndroidCapability));

// Merge WebSocket configuration
if (options.webSocketTimeout != null) {
setWebSocketTimeout(options.webSocketTimeout);
}
if (options.webSocketInterval != null) {
setWebSocketInterval(options.webSocketInterval);
}
}
}

Expand Down
24 changes: 21 additions & 3 deletions java/src/org/openqa/selenium/firefox/FirefoxDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.time.Duration;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Logger;
Expand Down Expand Up @@ -156,7 +157,21 @@ private FirefoxDriver(
return null;
});

this.biDi = createBiDi(biDiUri);
// Extract WebSocket configuration from capabilities
Duration webSocketTimeout = Duration.ofSeconds(30); // default
Duration webSocketInterval = Duration.ofMillis(100); // default

Object timeoutCapability = capabilities.getCapability("se:webSocketTimeout");
if (timeoutCapability instanceof Number) {
webSocketTimeout = Duration.ofMillis(((Number) timeoutCapability).longValue());
}

Object intervalCapability = capabilities.getCapability("se:webSocketInterval");
if (intervalCapability instanceof Number) {
webSocketInterval = Duration.ofMillis(((Number) intervalCapability).longValue());
}

this.biDi = createBiDi(biDiUri, webSocketTimeout, webSocketInterval);

this.capabilities = new ImmutableCapabilities(capabilities);
}
Expand Down Expand Up @@ -240,7 +255,7 @@ public void setContext(FirefoxCommandContext commandContext) {
context.setContext(commandContext);
}

private Optional<BiDi> createBiDi(Optional<URI> biDiUri) {
private Optional<BiDi> createBiDi(Optional<URI> biDiUri, Duration webSocketTimeout, Duration webSocketInterval) {
if (biDiUri.isEmpty()) {
return Optional.empty();
}
Expand All @@ -253,7 +268,10 @@ private Optional<BiDi> createBiDi(Optional<URI> biDiUri) {
+ " capability is set."));

HttpClient.Factory clientFactory = HttpClient.Factory.createDefault();
ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri);
ClientConfig wsConfig = ClientConfig.defaultConfig()
.baseUri(wsUri)
.webSocketTimeout(webSocketTimeout)
.webSocketInterval(webSocketInterval);
HttpClient wsClient = clientFactory.createClient(wsConfig);

org.openqa.selenium.bidi.Connection biDiConnection =
Expand Down
51 changes: 51 additions & 0 deletions java/src/org/openqa/selenium/firefox/FirefoxOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand Down Expand Up @@ -55,6 +56,8 @@ public class FirefoxOptions extends AbstractDriverOptions<FirefoxOptions> {
public static final String FIREFOX_OPTIONS = "moz:firefoxOptions";

private Map<String, Object> firefoxOptions = Collections.unmodifiableMap(new TreeMap<>());
private Duration webSocketTimeout = Duration.ofSeconds(30);
private Duration webSocketInterval = Duration.ofMillis(100);

public FirefoxOptions() {
setCapability(CapabilityType.BROWSER_NAME, FIREFOX.browserName());
Expand Down Expand Up @@ -265,11 +268,53 @@ public FirefoxOptions enableBiDi() {
return this;
}

/**
* Sets the WebSocket timeout for BiDi connections.
*
* @param webSocketTimeout the WebSocket timeout duration
* @return A self reference.
*/
public FirefoxOptions setWebSocketTimeout(Duration webSocketTimeout) {
this.webSocketTimeout = Require.nonNull("WebSocket timeout", webSocketTimeout);
return this;
}

/**
* Gets the WebSocket timeout for BiDi connections.
*
* @return the WebSocket timeout duration
*/
public Duration getWebSocketTimeout() {
return webSocketTimeout;
}

/**
* Sets the WebSocket interval for BiDi connections.
*
* @param webSocketInterval the WebSocket interval duration
* @return A self reference.
*/
public FirefoxOptions setWebSocketInterval(Duration webSocketInterval) {
this.webSocketInterval = Require.nonNull("WebSocket interval", webSocketInterval);
return this;
}

/**
* Gets the WebSocket interval for BiDi connections.
*
* @return the WebSocket interval duration
*/
public Duration getWebSocketInterval() {
return webSocketInterval;
}

@Override
protected Set<String> getExtraCapabilityNames() {
Set<String> names = new TreeSet<>();

names.add(FIREFOX_OPTIONS);
names.add("se:webSocketTimeout");
names.add("se:webSocketInterval");

return Collections.unmodifiableSet(names);
}
Expand All @@ -281,6 +326,12 @@ protected Object getExtraCapability(String capabilityName) {
if (FIREFOX_OPTIONS.equals(capabilityName)) {
return Collections.unmodifiableMap(firefoxOptions);
}
if ("se:webSocketTimeout".equals(capabilityName)) {
return webSocketTimeout.toMillis();
}
if ("se:webSocketInterval".equals(capabilityName)) {
return webSocketInterval.toMillis();
}
return null;
}

Expand Down
Loading