Skip to content

Commit

Permalink
added startActivity function
Browse files Browse the repository at this point in the history
  • Loading branch information
Eric Millin committed Sep 8, 2014
1 parent c53ca79 commit 047bf83
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 112 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Javadocs: http://appium.github.io/java-client/
More can be found in the docs, but here's a quick list of features which this project has added to the usual selenium binding.


- startActivity()
- resetApp()
- getAppString()
- sendKeyEvent()
Expand Down
106 changes: 1 addition & 105 deletions java-client.iml
Original file line number Diff line number Diff line change
@@ -1,107 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="hamcrest-core-1.3" level="project" />
<orderEntry type="library" name="httpcore-4.3.2" level="project" />
<orderEntry type="library" name="commons-logging-1.1.3" level="project" />
<orderEntry type="library" name="commons-core-1.2.2" level="project" />
<orderEntry type="library" name="commons-lang-2.4" level="project" />
<orderEntry type="library" name="commons-codec-1.9" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.2.4" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-java:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-chrome-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-remote-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: cglib:cglib-nodep:2.1_3" level="project" />
<orderEntry type="library" name="Maven: org.json:json:20080701" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-api:2.42.2" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:17.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.3.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.3.2" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.3" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.1" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:jna:3.4.0" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:platform:3.4.0" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-htmlunit-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit:2.14" level="project" />
<orderEntry type="library" name="Maven: xalan:xalan:2.7.1" level="project" />
<orderEntry type="library" name="Maven: xalan:serializer:2.7.1" level="project" />
<orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.2.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.3.2" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit-core-js:2.14" level="project" />
<orderEntry type="library" name="Maven: xerces:xercesImpl:2.11.0" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.nekohtml:nekohtml:1.9.20" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.cssparser:cssparser:0.9.13" level="project" />
<orderEntry type="library" name="Maven: org.w3c.css:sac:1.3" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-websocket:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-http:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-firefox-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-ie-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-safari-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.webbitserver:webbit:0.4.14" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty:3.5.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-support:2.42.2" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.11" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.2.4" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-java:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-chrome-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-remote-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: cglib:cglib-nodep:2.1_3" level="project" />
<orderEntry type="library" name="Maven: org.json:json:20080701" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-api:2.42.2" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:17.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.3.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.3.2" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.3" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.1" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:jna:3.4.0" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:platform:3.4.0" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-htmlunit-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit:2.14" level="project" />
<orderEntry type="library" name="Maven: xalan:xalan:2.7.1" level="project" />
<orderEntry type="library" name="Maven: xalan:serializer:2.7.1" level="project" />
<orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.2.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.3.2" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit-core-js:2.14" level="project" />
<orderEntry type="library" name="Maven: xerces:xercesImpl:2.11.0" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.nekohtml:nekohtml:1.9.20" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.cssparser:cssparser:0.9.13" level="project" />
<orderEntry type="library" name="Maven: org.w3c.css:sac:1.3" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-websocket:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-http:8.1.14.v20131031" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-firefox-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-ie-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-safari-driver:2.42.2" level="project" />
<orderEntry type="library" name="Maven: org.webbitserver:webbit:0.4.14" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty:3.5.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-support:2.42.2" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.11" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
</component>
</module>
<module classpath="eclipse" classpath-dir="$MODULE_DIR$" org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4" />

59 changes: 52 additions & 7 deletions src/main/java/io/appium/java_client/AppiumDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@

package io.appium.java_client;

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import io.appium.java_client.internal.JsonToMobileElementConverter;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.*;
import org.openqa.selenium.html5.Location;
import org.openqa.selenium.html5.LocationContext;
Expand Down Expand Up @@ -81,6 +83,7 @@ public AppiumDriver(URL remoteAddress, Capabilities desiredCapabilities){
.put(OPEN_NOTIFICATIONS, postC("/session/:sessionId/appium/device/open_notifications"))
.put(GET_NETWORK_CONNECTION, getC("/session/:sessionId/network_connection"))
.put(SET_NETWORK_CONNECTION, postC("/session/:sessionId/network_connection"))
.put(START_ACTIVITY, postC("/session/:sessionId/appium/device/start_activity"))
;
ImmutableMap<String, CommandInfo> mobileCommands = builder.build();

Expand Down Expand Up @@ -154,11 +157,11 @@ public void sendKeyEvent(int key) {
* @param metastate metastate for the keypress
*/
public void sendKeyEvent(int key, Integer metastate) {
ImmutableMap.Builder builder = ImmutableMap.builder();
builder.put("keycode", key);
if (metastate != null) { builder.put("metastate", metastate); }
ImmutableMap<String, Integer> parameters = builder.build();
execute(KEY_EVENT, parameters);
ImmutableMap.Builder builder = ImmutableMap.builder();
builder.put("keycode", key);
if (metastate != null) { builder.put("metastate", metastate); }
ImmutableMap<String, Integer> parameters = builder.build();
execute(KEY_EVENT, parameters);
}

/**
Expand All @@ -168,6 +171,48 @@ public String currentActivity() {
Response response = execute(CURRENT_ACTIVITY);
return response.getValue().toString();
}

/**
* Launches an arbitrary activity during a test. If the activity belongs to
* another application, that application is started and the activity is opened.
*
* This is an Android-only method.
* @param appPackage The package containing the activity. [Required]
* @param appActivity The activity to start. [Required]
* @param appWaitPackage Automation will begin after this package starts. [Optional]
* @param appWaitActivity Automation will begin after this activity starts. [Optional]
* @example
* driver.startActivity("com.foo.bar", ".MyActivity", null, null);
*/
public void startActivity(String appPackage, String appActivity, String appWaitPackage, String appWaitActivity)
throws IllegalArgumentException {

Preconditions.checkArgument((_isNotNullOrEmpty(appPackage) && _isNotNullOrEmpty(appActivity)),
String.format("'%s' and '%s' are required.",
MobileCapabilityType.APP_PACKAGE,
MobileCapabilityType.APP_ACTIVITY));

appWaitPackage = _isNotNullOrEmpty(appWaitPackage) ? appWaitPackage : "";
appWaitActivity = _isNotNullOrEmpty(appWaitActivity) ? appWaitActivity : "";

ImmutableMap<String, String> parameters = ImmutableMap.of(MobileCapabilityType.APP_PACKAGE, appPackage,
MobileCapabilityType.APP_ACTIVITY, appActivity,
MobileCapabilityType.APP_WAIT_PACKAGE, appWaitPackage,
MobileCapabilityType.APP_WAIT_ACTIVITY, appWaitActivity);

execute(START_ACTIVITY, parameters);
}

/**
* Checks if a string is null, empty, or whitespace.
*
* @param str String to check.
*
* @return True if str is not null or empty.
*/
private static boolean _isNotNullOrEmpty(String str) {
return str != null && !str.isEmpty() && str.trim().length() > 0;
}

/**
*
Expand Down Expand Up @@ -229,7 +274,7 @@ public void hideKeyboard() {
*/
public void hideKeyboard(String strategy, String keyName) {
ImmutableMap<String, String> parameters = ImmutableMap.of("strategy", strategy);
if (keyName != null) {
if (_isNotNullOrEmpty(keyName)) {
parameters = parameters.of("key", keyName);
}

Expand Down Expand Up @@ -574,7 +619,7 @@ public void setNetworkConnection(NetworkConnectionSetting connection) {

@Override
public WebDriver context(String name) {
if (name == null) {
if (_isNotNullOrEmpty(name)) {
throw new IllegalArgumentException("Must supply a context name");
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/io/appium/java_client/MobileCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,6 @@ public interface MobileCommand {
String OPEN_NOTIFICATIONS = "openNotifications";
String GET_NETWORK_CONNECTION = "getNetworkConnection";
String SET_NETWORK_CONNECTION = "setNetworkConnection";
String START_ACTIVITY = "startActivity";

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ public interface MobileCapabilityType extends CapabilityType {
String APP_PACKAGE = "appPackage";
String APP_ACTIVITY = "appActivity";
String APP_WAIT_ACTIVITY = "appWaitActivity";
String APP_WAIT_PACKAGE = "appWaitPackage";
}
16 changes: 16 additions & 0 deletions src/test/java/io/appium/java_client/MobileDriverAndroidTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.*;

Expand Down Expand Up @@ -129,4 +131,18 @@ public void networkConnectionTest() {
public void isLockedTest() {
assertEquals(false, driver.isLocked());
}

@Test
public void startActivityInThisAppTest(){
driver.startActivity("io.appium.android.apis", ".accessibility.AccessibilityNodeProviderActivity", null, null);
String activity = driver.currentActivity();
assertTrue(activity.contains("Node"));
}

@Test
public void startActivityInAnotherAppTest(){
driver.startActivity("com.android.contacts", ".ContactsListActivity", null, null);
String activity = driver.currentActivity();
assertTrue(activity.contains("Contact"));
}
}

0 comments on commit 047bf83

Please sign in to comment.