Skip to content

refactor: Tune setting of default platform names #1570

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 31, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 54 additions & 20 deletions src/main/java/io/appium/java_client/AppiumDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@

package io.appium.java_client;

import static io.appium.java_client.internal.CapabilityHelpers.APPIUM_PREFIX;
import static io.appium.java_client.remote.MobileCapabilityType.PLATFORM_NAME;
import static org.apache.commons.lang3.StringUtils.isBlank;

import io.appium.java_client.internal.CapabilityHelpers;
import io.appium.java_client.remote.AppiumCommandExecutor;
import io.appium.java_client.remote.AppiumNewSessionCommandPayload;
import io.appium.java_client.remote.MobileCapabilityType;
Expand Down Expand Up @@ -81,61 +83,93 @@ public AppiumDriver(HttpCommandExecutor executor, Capabilities capabilities) {
this.remoteAddress = executor.getAddressOfRemoteServer();
}

public AppiumDriver(URL remoteAddress, Capabilities desiredCapabilities) {
public AppiumDriver(URL remoteAddress, Capabilities capabilities) {
this(new AppiumCommandExecutor(MobileCommand.commandRepository, remoteAddress),
desiredCapabilities);
capabilities);
}

public AppiumDriver(URL remoteAddress, HttpClient.Factory httpClientFactory,
Capabilities desiredCapabilities) {
Capabilities capabilities) {
this(new AppiumCommandExecutor(MobileCommand.commandRepository, remoteAddress,
httpClientFactory), desiredCapabilities);
httpClientFactory), capabilities);
}

public AppiumDriver(AppiumDriverLocalService service, Capabilities desiredCapabilities) {
public AppiumDriver(AppiumDriverLocalService service, Capabilities capabilities) {
this(new AppiumCommandExecutor(MobileCommand.commandRepository, service),
desiredCapabilities);
capabilities);
}

public AppiumDriver(AppiumDriverLocalService service, HttpClient.Factory httpClientFactory,
Capabilities desiredCapabilities) {
Capabilities capabilities) {
this(new AppiumCommandExecutor(MobileCommand.commandRepository, service, httpClientFactory),
desiredCapabilities);
capabilities);
}

public AppiumDriver(AppiumServiceBuilder builder, Capabilities desiredCapabilities) {
this(builder.build(), desiredCapabilities);
public AppiumDriver(AppiumServiceBuilder builder, Capabilities capabilities) {
this(builder.build(), capabilities);
}

public AppiumDriver(AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory,
Capabilities desiredCapabilities) {
this(builder.build(), httpClientFactory, desiredCapabilities);
Capabilities capabilities) {
this(builder.build(), httpClientFactory, capabilities);
}

public AppiumDriver(HttpClient.Factory httpClientFactory, Capabilities desiredCapabilities) {
public AppiumDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) {
this(AppiumDriverLocalService.buildDefaultService(), httpClientFactory,
desiredCapabilities);
capabilities);
}

public AppiumDriver(Capabilities desiredCapabilities) {
this(AppiumDriverLocalService.buildDefaultService(), desiredCapabilities);
public AppiumDriver(Capabilities capabilities) {
this(AppiumDriverLocalService.buildDefaultService(), capabilities);
}

/**
* Changes platform name if it is not set and returns new capabilities.
* Changes platform name if it is not set and returns merged capabilities.
*
* @param originalCapabilities the given {@link Capabilities}.
* @param defaultName a {@link MobileCapabilityType#PLATFORM_NAME} value which has
* to be set up
* @return {@link Capabilities} with changed mobile platform name value or the original capabilities
*/
protected static Capabilities updateDefaultPlatformName(Capabilities originalCapabilities,
String defaultName) {
return originalCapabilities.getCapability(PLATFORM_NAME) == null
protected static Capabilities ensurePlatformName(Capabilities originalCapabilities,
String defaultName) {
String currentName = (String) originalCapabilities.getCapability(PLATFORM_NAME);
return isBlank(currentName)
? originalCapabilities.merge(new ImmutableCapabilities(PLATFORM_NAME, defaultName))
: originalCapabilities;
}

/**
* Changes platform and automation names if they are not set
* and returns merged capabilities.
*
* @param originalCapabilities the given {@link Capabilities}.
* @param defaultPlatformName a {@link MobileCapabilityType#PLATFORM_NAME} value which has
* to be set up
* @param defaultAutomationName The default automation name to set up for this class
* @return {@link Capabilities} with changed mobile platform name value or the original capabilities
*/
protected static Capabilities ensurePlatformAndAutomationNames(
Capabilities originalCapabilities, String defaultPlatformName, String defaultAutomationName) {
MutableCapabilities toMerge = new MutableCapabilities();
String currentPlatformName = (String) originalCapabilities.getCapability(PLATFORM_NAME);
if (isBlank(currentPlatformName)) {
toMerge.setCapability(PLATFORM_NAME, defaultPlatformName);
}
String currentAutomationName = CapabilityHelpers.getCapability(
originalCapabilities, MobileCapabilityType.AUTOMATION_NAME, String.class);
if (isBlank(currentAutomationName)) {
toMerge.setCapability(originalCapabilities.getCapabilityNames()
.contains(MobileCapabilityType.AUTOMATION_NAME)
? MobileCapabilityType.AUTOMATION_NAME
: APPIUM_PREFIX + MobileCapabilityType.AUTOMATION_NAME,
defaultAutomationName);
}
return toMerge.getCapabilityNames().isEmpty()
? originalCapabilities
: originalCapabilities.merge(toMerge);
}

@Override
public ExecuteMethod getExecuteMethod() {
return executeMethod;
Expand Down
62 changes: 29 additions & 33 deletions src/main/java/io/appium/java_client/android/AndroidDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import io.appium.java_client.android.geolocation.SupportsExtendedGeolocationCommands;
import io.appium.java_client.android.nativekey.PressesKey;
import io.appium.java_client.battery.HasBattery;
import io.appium.java_client.remote.MobilePlatform;
import io.appium.java_client.remote.SupportsContextSwitching;
import io.appium.java_client.remote.SupportsLocation;
import io.appium.java_client.remote.SupportsRotation;
Expand All @@ -47,6 +46,7 @@
import io.appium.java_client.service.local.AppiumServiceBuilder;
import io.appium.java_client.ws.StringWebSocketClient;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.HttpCommandExecutor;
import org.openqa.selenium.remote.html5.RemoteLocationContext;
import org.openqa.selenium.remote.http.HttpClient;
Expand Down Expand Up @@ -87,8 +87,7 @@ public class AndroidDriver extends AppiumDriver implements
ExecuteCDPCommand,
CanReplaceElementValue,
SupportsExtendedGeolocationCommands {

private static final String ANDROID_PLATFORM = MobilePlatform.ANDROID;
private static final String ANDROID_PLATFORM = Platform.ANDROID.name();

private StringWebSocketClient logcatClient;

Expand All @@ -101,95 +100,92 @@ public class AndroidDriver extends AppiumDriver implements
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(HttpCommandExecutor executor, Capabilities capabilities) {
super(executor, updateDefaultPlatformName(capabilities, ANDROID_PLATFORM));
super(executor, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on Appium server URL and {@code capabilities}.
*
* @param remoteAddress is the address of remotely/locally started Appium server
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(URL remoteAddress, Capabilities desiredCapabilities) {
super(remoteAddress, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(URL remoteAddress, Capabilities capabilities) {
super(remoteAddress, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on Appium server URL, HTTP client factory and {@code capabilities}.
*
* @param remoteAddress is the address of remotely/locally started Appium server
* @param httpClientFactory take a look at {@link HttpClient.Factory}
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(URL remoteAddress, HttpClient.Factory httpClientFactory,
Capabilities desiredCapabilities) {
super(remoteAddress, httpClientFactory,
updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(
URL remoteAddress, HttpClient.Factory httpClientFactory, Capabilities capabilities) {
super(remoteAddress, httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on Appium driver local service and {@code capabilities}.
*
* @param service take a look at {@link AppiumDriverLocalService}
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(AppiumDriverLocalService service, Capabilities desiredCapabilities) {
super(service, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(AppiumDriverLocalService service, Capabilities capabilities) {
super(service, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on Appium driver local service, HTTP client factory and {@code capabilities}.
*
* @param service take a look at {@link AppiumDriverLocalService}
* @param httpClientFactory take a look at {@link HttpClient.Factory}
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(AppiumDriverLocalService service, HttpClient.Factory httpClientFactory,
Capabilities desiredCapabilities) {
super(service, httpClientFactory,
updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(
AppiumDriverLocalService service, HttpClient.Factory httpClientFactory, Capabilities capabilities) {
super(service, httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on Appium service builder and {@code capabilities}.
*
* @param builder take a look at {@link AppiumServiceBuilder}
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(AppiumServiceBuilder builder, Capabilities desiredCapabilities) {
super(builder, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(AppiumServiceBuilder builder, Capabilities capabilities) {
super(builder, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on Appium service builder, HTTP client factory and {@code capabilities}.
*
* @param builder take a look at {@link AppiumServiceBuilder}
* @param httpClientFactory take a look at {@link HttpClient.Factory}
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory,
Capabilities desiredCapabilities) {
super(builder, httpClientFactory,
updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
Capabilities capabilities) {
super(builder, httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on HTTP client factory and {@code capabilities}.
*
* @param httpClientFactory take a look at {@link HttpClient.Factory}
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(HttpClient.Factory httpClientFactory, Capabilities desiredCapabilities) {
super(httpClientFactory, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) {
super(httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
* Creates a new instance based on {@code capabilities}.
*
* @param desiredCapabilities take a look at {@link Capabilities}
* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(Capabilities desiredCapabilities) {
super(updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
public AndroidDriver(Capabilities capabilities) {
super(ensurePlatformName(capabilities, ANDROID_PLATFORM));
}

/**
Expand Down
Loading