Skip to content

Commit d9bb0fb

Browse files
committed
Allow the new session command from the remote webdriver to take more than one capability
1 parent 854ac60 commit d9bb0fb

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

java/client/src/org/openqa/selenium/remote/DriverCommand.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,21 @@
1818
package org.openqa.selenium.remote;
1919

2020
import com.google.common.collect.ImmutableMap;
21-
2221
import org.openqa.selenium.Capabilities;
2322
import org.openqa.selenium.Cookie;
2423
import org.openqa.selenium.Dimension;
2524
import org.openqa.selenium.Point;
2625
import org.openqa.selenium.WindowType;
2726
import org.openqa.selenium.interactions.Sequence;
27+
import org.openqa.selenium.internal.Require;
2828
import org.openqa.selenium.print.PrintOptions;
2929

3030
import java.time.Duration;
3131
import java.util.Collection;
3232
import java.util.Collections;
3333
import java.util.List;
3434
import java.util.concurrent.TimeUnit;
35+
import java.util.stream.Collectors;
3536

3637
/**
3738
* An empty interface defining constants for the standard commands defined in the WebDriver JSON
@@ -44,7 +45,24 @@ public interface DriverCommand {
4445
String GET_CAPABILITIES = "getCapabilities";
4546
String NEW_SESSION = "newSession";
4647
static CommandPayload NEW_SESSION(Capabilities capabilities) {
47-
return new CommandPayload(NEW_SESSION, ImmutableMap.of("desiredCapabilities", capabilities));
48+
Require.nonNull("Capabilities", capabilities);
49+
return new CommandPayload(
50+
NEW_SESSION,
51+
ImmutableMap.of(
52+
"capabilities", CapabilitiesUtils.makeW3CSafe(capabilities).collect(Collectors.toSet()),
53+
"desiredCapabilities", capabilities));
54+
}
55+
static CommandPayload NEW_SESSION(Collection<Capabilities> capabilities) {
56+
Require.nonNull("Capabilities", capabilities);
57+
if (capabilities.isEmpty()) {
58+
throw new IllegalArgumentException("Capabilities for new session must not be empty");
59+
}
60+
61+
return new CommandPayload(
62+
NEW_SESSION,
63+
ImmutableMap.of(
64+
"capabilities", capabilities.stream().flatMap(CapabilitiesUtils::makeW3CSafe).collect(Collectors.toSet()),
65+
"desiredCapabilities", capabilities.iterator().next()));
4866
}
4967

5068
String STATUS = "status";

java/client/src/org/openqa/selenium/remote/RemoteWebDriver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
import java.util.stream.Collectors;
8989
import java.util.stream.Stream;
9090

91+
import static java.util.Collections.singleton;
9192
import static java.util.concurrent.TimeUnit.SECONDS;
9293
import static org.openqa.selenium.remote.CapabilityType.LOGGING_PREFS;
9394
import static org.openqa.selenium.remote.CapabilityType.PLATFORM;
@@ -248,7 +249,7 @@ protected void setSessionId(String opaqueKey) {
248249
}
249250

250251
protected void startSession(Capabilities capabilities) {
251-
Response response = execute(DriverCommand.NEW_SESSION(capabilities));
252+
Response response = execute(DriverCommand.NEW_SESSION(singleton(capabilities)));
252253

253254
if (response == null) {
254255
throw new SessionNotCreatedException(
@@ -269,7 +270,7 @@ protected void startSession(Capabilities capabilities) {
269270
response.toString());
270271
}
271272

272-
Map<String, Object> rawCapabilities = (Map<String, Object>) responseValue;
273+
@SuppressWarnings("unchecked") Map<String, Object> rawCapabilities = (Map<String, Object>) responseValue;
273274
MutableCapabilities returnedCapabilities = new MutableCapabilities(rawCapabilities);
274275
String platformString = (String) rawCapabilities.getOrDefault(
275276
PLATFORM,

0 commit comments

Comments
 (0)