diff --git a/src/main/java/io/appium/java_client/remote/MobileOptions.java b/src/main/java/io/appium/java_client/remote/MobileOptions.java index 6a7810f1a..8843fbcca 100644 --- a/src/main/java/io/appium/java_client/remote/MobileOptions.java +++ b/src/main/java/io/appium/java_client/remote/MobileOptions.java @@ -19,10 +19,16 @@ import org.openqa.selenium.Capabilities; import org.openqa.selenium.MutableCapabilities; import org.openqa.selenium.ScreenOrientation; +import org.openqa.selenium.remote.AcceptedW3CCapabilityKeys; import org.openqa.selenium.remote.CapabilityType; import java.net.URL; import java.time.Duration; +import java.util.Map; +import java.util.stream.Collectors; + +import static io.appium.java_client.internal.CapabilityHelpers.APPIUM_PREFIX; +import static java.util.Collections.unmodifiableMap; public class MobileOptions> extends MutableCapabilities { @@ -512,4 +518,14 @@ protected T amend(String optionName, Object value) { setCapability(optionName, value); return (T) this; } + + @Override + public Map asMap() { + AcceptedW3CCapabilityKeys acceptedW3CCapabilityKeys = new AcceptedW3CCapabilityKeys(); + + return unmodifiableMap(super.asMap().entrySet().stream().collect(Collectors.toMap( + entry -> (acceptedW3CCapabilityKeys.test(entry.getKey()) || entry.getKey().startsWith(APPIUM_PREFIX)) ? + entry.getKey() : APPIUM_PREFIX + entry.getKey(), + Map.Entry::getValue))); + } } diff --git a/src/test/java/io/appium/java_client/remote/MobileOptionsTest.java b/src/test/java/io/appium/java_client/remote/MobileOptionsTest.java index 27e1a6765..34a80b4d2 100644 --- a/src/test/java/io/appium/java_client/remote/MobileOptionsTest.java +++ b/src/test/java/io/appium/java_client/remote/MobileOptionsTest.java @@ -23,8 +23,10 @@ import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; -import java.util.ArrayList; +import java.util.Map; +import java.util.TreeMap; +import static java.util.Collections.unmodifiableMap; import static org.junit.Assert.*; public class MobileOptionsTest { @@ -106,4 +108,39 @@ public void setsMobileBooleanCapabilities() { assertFalse(mobileOptions.doesFullReset()); assertFalse(mobileOptions.doesPrintPageSourceOnFindFailure()); } + + @Test + public void createsAsMap() { + MutableCapabilities capabilities = new MutableCapabilities(); + capabilities.setCapability("deviceName", "Pixel"); + capabilities.setCapability("platformVersion", "10"); + capabilities.setCapability("newCommandTimeout", 60); + + mobileOptions = new MobileOptions<>(capabilities); + + mobileOptions.setAutomationName(AutomationName.ANDROID_UIAUTOMATOR2) + .setPlatformName("android") + .setOtherApps("/path/to/app.apk") + .setLocale("fr_CA") + .setUdid("1ae203187fc012g") + .setOrientation(ScreenOrientation.LANDSCAPE) + .setLanguage("fr"); + + Map actual = mobileOptions.asMap(); + + System.out.println(Duration.ofSeconds(60).getClass()); + TreeMap expected = new TreeMap<>(); + expected.put("appium:automationName", "UIAutomator2"); + expected.put("platformName", "android"); + expected.put("appium:platformVersion", "10"); + expected.put("appium:deviceName", "Pixel"); + expected.put("appium:otherApps", "/path/to/app.apk"); + expected.put("appium:locale", "fr_CA"); + expected.put("appium:udid", "1ae203187fc012g"); + expected.put("appium:orientation", ScreenOrientation.LANDSCAPE); + expected.put("appium:newCommandTimeout", 60); + expected.put("appium:language", "fr"); + + assertEquals(unmodifiableMap(expected), actual); + } }