Skip to content

Commit 27e8963

Browse files
committed
bring back ability to automatically quote desired capabilities on windows systems
1 parent 9a2124c commit 27e8963

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

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

Lines changed: 57 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,18 @@ 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 capabilities when calling appium. This is required on windows systems only.
251+
* @return the self-reference.
252+
*/
253+
public AppiumServiceBuilder withCapabilities(DesiredCapabilities capabilities, boolean autoQuoteCapabilitiesOnWindows) {
254+
this.autoQuoteCapabilitiesOnWindows = autoQuoteCapabilitiesOnWindows;
255+
return withCapabilities(capabilities);
256+
}
257+
242258
/**
243259
* Sets an executable appium.js.
244260
*
@@ -296,7 +312,48 @@ private void loadPathToMainScript() {
296312
this.appiumJS = findMainScript();
297313
}
298314

315+
private String parseCapabilitiesIfWindows() {
316+
String result = StringUtils.EMPTY;
317+
final List<String> PATH_CAPABILITIES = ImmutableList.of(AndroidMobileCapabilityType.KEYSTORE_PATH,
318+
AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, MobileCapabilityType.APP);
319+
320+
if (capabilities != null) {
321+
Map<String, ?> capabilitiesMap = capabilities.asMap();
322+
Set<? extends Map.Entry<String, ?>> entries = capabilitiesMap.entrySet();
323+
324+
for (Map.Entry<String, ?> entry : entries) {
325+
Object value = entry.getValue();
326+
327+
if (value == null) {
328+
continue;
329+
}
330+
331+
if (String.class.isAssignableFrom(value.getClass())) {
332+
if (PATH_CAPABILITIES.contains(entry.getKey())) {
333+
value = "\\\"" + String.valueOf(value).replace("\\", "/") + "\\\"";
334+
} else {
335+
value = "\\\"" + value + "\\\"";
336+
}
337+
} else {
338+
value = String.valueOf(value);
339+
}
340+
341+
String key = "\\\"" + entry.getKey() + "\\\"";
342+
if (StringUtils.isBlank(result)) {
343+
result = key + ": " + value;
344+
} else {
345+
result = result + ", " + key + ": " + value;
346+
}
347+
}
348+
}
349+
350+
return "{" + result + "}";
351+
}
352+
299353
private String capabilitiesToCmdlineArg() {
354+
if (autoQuoteCapabilitiesOnWindows && Platform.getCurrent().is(Platform.WINDOWS)) {
355+
return parseCapabilitiesIfWindows();
356+
}
300357
Gson gson = new GsonBuilder()
301358
.disableHtmlEscaping()
302359
.serializeNulls()

0 commit comments

Comments
 (0)