Skip to content

Commit 5770cfc

Browse files
add support for legacy selenium3 caps
1 parent 84364ba commit 5770cfc

File tree

2 files changed

+80
-19
lines changed

2 files changed

+80
-19
lines changed

src/main/java/com/lambdatest/selenium/agent/RemoteWebDriverAdvice.java

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,18 @@ public class RemoteWebDriverAdvice {
3434

3535
// LambdaTest-specific keys that should ONLY be in lt:options, not at W3C top level
3636
// These keys cause W3C validation errors in Selenium 4 if set at top level
37-
private static final Set<String> LT_SPECIFIC_KEYS = Set.of("build", "name", "projectName", "resolution");
37+
private static final Set<String> LT_SPECIFIC_KEYS = Set.of(
38+
"build", "name", "projectName", "resolution",
39+
"buildTags", "driver_version", "tags"
40+
);
41+
42+
// Selenium 3 capabilities that should be moved to lt:options when using Selenium 4
43+
// These are legacy capabilities that Selenium 4 rejects at top level
44+
private static final Set<String> SELENIUM3_LEGACY_KEYS = Set.of(
45+
"version", "commandLog", "systemLog", "network.http2",
46+
"DisableXFHeaders", "network.debug", "ignoreFfOptionsArgs",
47+
"updateBuildStatusOnSuccess", "lambda:loadExtension"
48+
);
3849

3950
/**
4051
* Static method to enhance capabilities that can be called from ASM bytecode.
@@ -112,6 +123,20 @@ public static void enhanceCapabilities(MutableCapabilities capabilities) {
112123
continue;
113124
}
114125

126+
// Selenium 3 legacy capabilities should be moved to lt:options when using Selenium 4
127+
// (Selenium 4 rejects these at top level)
128+
if (SELENIUM3_LEGACY_KEYS.contains(key)) {
129+
// Skip empty string values (e.g., lambda:loadExtension: "")
130+
if (value instanceof String && ((String) value).trim().isEmpty()) {
131+
continue;
132+
}
133+
// Move to lt:options instead of top level
134+
if (!ltOptions.containsKey(key)) {
135+
ltOptions.put(key, value);
136+
}
137+
continue;
138+
}
139+
115140
// Add valid W3C capabilities to top level
116141
if (!userCapMap.containsKey(key)) {
117142
capabilities.setCapability(key, value);
@@ -127,8 +152,60 @@ public static void enhanceCapabilities(MutableCapabilities capabilities) {
127152
if (!ltOptions.containsKey(ltKey)) {
128153
ltOptions.put(ltKey, ltValue);
129154
}
155+
// Remove from top level by setting to null (safer than remove on potentially unmodifiable map)
156+
try {
157+
capabilities.setCapability(ltKey, (Object) null);
158+
} catch (Exception e) {
159+
// If setCapability with null doesn't work, try to remove from map
160+
try {
161+
if (capabilities.asMap() instanceof java.util.Map) {
162+
((java.util.Map<String, Object>) capabilities.asMap()).remove(ltKey);
163+
}
164+
} catch (Exception e2) {
165+
// Ignore - capability might already be removed or map is unmodifiable
166+
}
167+
}
168+
}
169+
}
170+
171+
// Clean up: Remove Selenium 3 legacy capabilities from top level (Selenium 4 rejects them)
172+
// Move them to lt:options instead
173+
for (String legacyKey : SELENIUM3_LEGACY_KEYS) {
174+
if (capabilities.asMap().containsKey(legacyKey)) {
175+
Object legacyValue = capabilities.getCapability(legacyKey);
176+
// Skip empty string values
177+
if (legacyValue instanceof String && ((String) legacyValue).trim().isEmpty()) {
178+
// Just remove from top level, don't add to lt:options
179+
try {
180+
capabilities.setCapability(legacyKey, (Object) null);
181+
} catch (Exception e) {
182+
try {
183+
if (capabilities.asMap() instanceof java.util.Map) {
184+
((java.util.Map<String, Object>) capabilities.asMap()).remove(legacyKey);
185+
}
186+
} catch (Exception e2) {
187+
// Ignore
188+
}
189+
}
190+
continue;
191+
}
192+
// Ensure it's in lt:options
193+
if (!ltOptions.containsKey(legacyKey)) {
194+
ltOptions.put(legacyKey, legacyValue);
195+
}
130196
// Remove from top level
131-
capabilities.asMap().remove(ltKey);
197+
try {
198+
capabilities.setCapability(legacyKey, (Object) null);
199+
} catch (Exception e) {
200+
// If setCapability with null doesn't work, try to remove from map
201+
try {
202+
if (capabilities.asMap() instanceof java.util.Map) {
203+
((java.util.Map<String, Object>) capabilities.asMap()).remove(legacyKey);
204+
}
205+
} catch (Exception e2) {
206+
// Ignore - capability might already be removed or map is unmodifiable
207+
}
208+
}
132209
}
133210
}
134211

src/main/java/com/lambdatest/selenium/lambdatest/capabilities/BrowserOptionsCapabilities.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.lambdatest.selenium.lambdatest.capabilities;
22

3-
import java.util.HashMap;
43
import java.util.Map;
54

65
import org.openqa.selenium.remote.DesiredCapabilities;
@@ -11,18 +10,6 @@
1110
*/
1211
public class BrowserOptionsCapabilities {
1312

14-
/**
15-
* Browser option mapping: Selenium 3 key -> Selenium 4 W3C key
16-
*/
17-
private static final Map<String, String> BROWSER_OPTION_MAPPINGS = new HashMap<>();
18-
static {
19-
BROWSER_OPTION_MAPPINGS.put("chromeOptions", "goog:chromeOptions");
20-
BROWSER_OPTION_MAPPINGS.put("firefoxOptions", "moz:firefoxOptions");
21-
BROWSER_OPTION_MAPPINGS.put("edgeOptions", "ms:edgeOptions");
22-
BROWSER_OPTION_MAPPINGS.put("safariOptions", "safari:options");
23-
BROWSER_OPTION_MAPPINGS.put("ieOptions", "se:ieOptions");
24-
}
25-
2613
/**
2714
* Process browser-specific options from config.
2815
* Sets both Selenium 3 and Selenium 4 keys for compatibility.
@@ -41,10 +28,7 @@ public static void processBrowserOptions(Map<String, Object> config, DesiredCapa
4128
processBrowserOption(config, capabilities, "safariOptions", "safari:options");
4229

4330
// Opera (no W3C namespace, same for both)
44-
if (config.containsKey("operaOptions")) {
45-
Object operaOptions = config.get("operaOptions");
46-
capabilities.setCapability("operaOptions", operaOptions);
47-
}
31+
processBrowserOption(config, capabilities, "operaOptions", "operaOptions");
4832

4933
// Internet Explorer
5034
processBrowserOption(config, capabilities, "ieOptions", "se:ieOptions", "IEOptions");

0 commit comments

Comments
 (0)