From 97c387949a695e29ecbcd3184bc301541194c36c Mon Sep 17 00:00:00 2001 From: Isaac Jurado Date: Tue, 29 Jan 2019 14:57:33 +0100 Subject: [PATCH] Protect against NullPointerException when using getCapabilities. The WebDriver capabilities field remains as null until the new-session command succeeds, returning the capabilities stated by the server. If an exception happens during session creation, some handling code may try to convert the WebDriver instance to string. In which case, the conversion would throw a NullPointerException, masking the real failure. This change just protects against the NullPointerException, so the real session initiation failures can be easily troubleshooted. --- .../io/appium/java_client/DefaultGenericMobileDriver.java | 3 ++- .../java/io/appium/java_client/android/AndroidDriver.java | 6 +++++- src/main/java/io/appium/java_client/ios/IOSDriver.java | 6 +++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java b/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java index 3e7380309..0ca7a1dcc 100644 --- a/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java +++ b/src/main/java/io/appium/java_client/DefaultGenericMobileDriver.java @@ -157,7 +157,8 @@ public List findElementsByXPath(String using) { @Override public String toString() { + Capabilities capabilities = getCapabilities(); return String.format("%s, Capabilities: %s", getClass().getCanonicalName(), - getCapabilities().asMap().toString()); + capabilities != null ? capabilities.asMap().toString() : "null"); } } diff --git a/src/main/java/io/appium/java_client/android/AndroidDriver.java b/src/main/java/io/appium/java_client/android/AndroidDriver.java index 626ab95a2..eb6517101 100644 --- a/src/main/java/io/appium/java_client/android/AndroidDriver.java +++ b/src/main/java/io/appium/java_client/android/AndroidDriver.java @@ -47,6 +47,7 @@ import java.net.URL; import java.util.Collections; import java.util.Map; +import javax.annotation.Nullable; /** * Android driver implementation. @@ -206,9 +207,12 @@ public AndroidBatteryInfo getBatteryInfo() { * * @return given {@link Capabilities} */ + @Nullable public Capabilities getCapabilities() { MutableCapabilities capabilities = (MutableCapabilities) super.getCapabilities(); - capabilities.setCapability(PLATFORM_NAME, ANDROID_PLATFORM); + if (capabilities != null) { + capabilities.setCapability(PLATFORM_NAME, ANDROID_PLATFORM); + } return capabilities; } diff --git a/src/main/java/io/appium/java_client/ios/IOSDriver.java b/src/main/java/io/appium/java_client/ios/IOSDriver.java index 218f642f6..1cd2aa81b 100644 --- a/src/main/java/io/appium/java_client/ios/IOSDriver.java +++ b/src/main/java/io/appium/java_client/ios/IOSDriver.java @@ -48,6 +48,7 @@ import java.time.Duration; import java.util.Collections; import java.util.Map; +import javax.annotation.Nullable; /** * iOS driver implementation. @@ -207,9 +208,12 @@ private class InnerTargetLocator extends RemoteTargetLocator { * * @return given {@link Capabilities} */ + @Nullable public Capabilities getCapabilities() { MutableCapabilities capabilities = (MutableCapabilities) super.getCapabilities(); - capabilities.setCapability(PLATFORM_NAME, IOS_PLATFORM); + if (capabilities != null) { + capabilities.setCapability(PLATFORM_NAME, IOS_PLATFORM); + } return capabilities; }