Skip to content

Commit 4dbaca1

Browse files
committed
fix: bring back ability to automatically quote desired capabilities on windows systems
1 parent 9a2124c commit 4dbaca1

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@
2525

2626
import com.google.gson.Gson;
2727
import com.google.gson.GsonBuilder;
28+
import io.appium.java_client.remote.AndroidMobileCapabilityType;
29+
import io.appium.java_client.remote.MobileCapabilityType;
2830
import io.appium.java_client.service.local.flags.ServerArgument;
2931

3032
import org.apache.commons.io.IOUtils;
3133
import org.apache.commons.lang3.StringUtils;
3234
import org.apache.commons.lang3.SystemUtils;
3335
import org.apache.commons.validator.routines.InetAddressValidator;
3436
import org.openqa.selenium.Capabilities;
37+
import org.openqa.selenium.Platform;
3538
import org.openqa.selenium.os.ExecutableFinder;
3639
import org.openqa.selenium.remote.BrowserType;
3740
import org.openqa.selenium.remote.DesiredCapabilities;
@@ -78,6 +81,7 @@ public final class AppiumServiceBuilder
7881
private File node;
7982
private String ipAddress = BROADCAST_IP_ADDRESS;
8083
private DesiredCapabilities capabilities;
84+
private boolean autoQuoteCapabilitiesOnWindows = false;
8185
private static final Function<File, String> APPIUM_JS_NOT_EXIST_ERROR = (fullPath) -> String.format(
8286
"The main Appium script does not exist at '%s'", fullPath.getAbsolutePath());
8387
private static final Function<File, String> NODE_JS_NOT_EXIST_ERROR = (fullPath) ->
@@ -239,6 +243,21 @@ public AppiumServiceBuilder withCapabilities(DesiredCapabilities capabilities) {
239243
return this;
240244
}
241245

246+
/**
247+
* Adds a desired capabilities.
248+
*
249+
* @param capabilities is an instance of {@link DesiredCapabilities}.
250+
* @param autoQuoteCapabilitiesOnWindows automatically escape quote all
251+
* capabilities when calling appium.
252+
* This is required on windows systems only.
253+
* @return the self-reference.
254+
*/
255+
public AppiumServiceBuilder withCapabilities(DesiredCapabilities capabilities,
256+
boolean autoQuoteCapabilitiesOnWindows) {
257+
this.autoQuoteCapabilitiesOnWindows = autoQuoteCapabilitiesOnWindows;
258+
return withCapabilities(capabilities);
259+
}
260+
242261
/**
243262
* Sets an executable appium.js.
244263
*
@@ -296,7 +315,48 @@ private void loadPathToMainScript() {
296315
this.appiumJS = findMainScript();
297316
}
298317

318+
private String parseCapabilitiesIfWindows() {
319+
StringBuilder result = new StringBuilder();
320+
final List<String> pathCapabilities = ImmutableList.of(AndroidMobileCapabilityType.KEYSTORE_PATH,
321+
AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, MobileCapabilityType.APP);
322+
323+
if (capabilities != null) {
324+
Map<String, ?> capabilitiesMap = capabilities.asMap();
325+
Set<? extends Map.Entry<String, ?>> entries = capabilitiesMap.entrySet();
326+
327+
for (Map.Entry<String, ?> entry : entries) {
328+
Object value = entry.getValue();
329+
330+
if (value == null) {
331+
continue;
332+
}
333+
334+
if (value instanceof String) {
335+
String valueString = (String) value;
336+
if (pathCapabilities.contains(entry.getKey())) {
337+
value = "\\\"" + valueString.replace("\\", "/") + "\\\"";
338+
} else {
339+
value = "\\\"" + valueString + "\\\"";
340+
}
341+
} else {
342+
value = String.valueOf(value);
343+
}
344+
345+
String key = "\\\"" + entry.getKey() + "\\\"";
346+
if (result.length() > 0) {
347+
result.append(", ");
348+
}
349+
result.append(key).append(": ").append(value);
350+
}
351+
}
352+
353+
return "{" + result.toString() + "}";
354+
}
355+
299356
private String capabilitiesToCmdlineArg() {
357+
if (autoQuoteCapabilitiesOnWindows && Platform.getCurrent().is(Platform.WINDOWS)) {
358+
return parseCapabilitiesIfWindows();
359+
}
300360
Gson gson = new GsonBuilder()
301361
.disableHtmlEscaping()
302362
.serializeNulls()

0 commit comments

Comments
 (0)