calabash-android 0.4.4 → 0.4.5.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +2 -0
- data/bin/calabash-android-build.rb +4 -3
- data/lib/calabash-android/canned_steps.md +4 -0
- data/lib/calabash-android/helpers.rb +10 -0
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +7 -6
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/AndroidManifest.xml +1 -1
- data/test-server/build.xml +8 -15
- data/test-server/instrumentation-backend/CalabashApkBuilder.jar +0 -0
- data/test-server/instrumentation-backend/assets/{foo.bar → .gitkeep} +0 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/L10nHelper.java +8 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/PressElement.java +3 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/WaitForElement.java +3 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/EnterTextById.java +4 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForViewById.java +16 -9
- metadata +10 -6
data/Rakefile
CHANGED
@@ -11,7 +11,8 @@ def calabash_build(app)
|
|
11
11
|
FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)
|
12
12
|
|
13
13
|
unsigned_test_apk = File.join(File.dirname(__FILE__), '..', 'lib/calabash-android/lib/TestServer.apk')
|
14
|
-
|
14
|
+
platforms = Dir["#{android_home_path}/platforms/android-*"].sort_by! { |item| '%08s' % item.split('-').last }
|
15
|
+
android_platform = platforms.last
|
15
16
|
raise "No Android SDK found in #{ENV["ANDROID_HOME"].gsub("\\", "/")}/platforms/" unless android_platform
|
16
17
|
Dir.mktmpdir do |workspace_dir|
|
17
18
|
Dir.chdir(workspace_dir) do
|
@@ -26,7 +27,7 @@ def calabash_build(app)
|
|
26
27
|
raise "Could not replace test package name in manifest"
|
27
28
|
end
|
28
29
|
|
29
|
-
unless system %Q{"#{
|
30
|
+
unless system %Q{"#{tools_dir}/aapt" package -M AndroidManifest.xml -I "#{android_platform}/android.jar" -F dummy.apk}
|
30
31
|
raise "Could not create dummy.apk"
|
31
32
|
end
|
32
33
|
|
@@ -44,4 +45,4 @@ def calabash_build(app)
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
puts "Done signing the test server. Moved it to #{test_server_file_name}"
|
47
|
-
end
|
48
|
+
end
|
@@ -244,6 +244,10 @@ Simulates that the user pressed the toggle button with the label text of the l10
|
|
244
244
|
Then /^I wait for the translated "([^\"]*)" l10nkey to appear$/
|
245
245
|
Waits until the text of the translated l10nkey is displayed.
|
246
246
|
|
247
|
+
Note: you can assert or press interface elements using [Android's String resources](http://developer.android.com/reference/android/R.string.html) by passing a package in a custom step:
|
248
|
+
|
249
|
+
performAction('press_l10n_element', 'ok', nil, 'android')
|
250
|
+
|
247
251
|
Rotation
|
248
252
|
--------
|
249
253
|
|
@@ -80,6 +80,16 @@ def sign_apk(app_path, dest_path)
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
def tools_dir
|
84
|
+
dirs = Dir["#{android_home_path}/build-tools/*/"] + Dir["#{android_home_path}/platform-tools/"]
|
85
|
+
raise "Could not find tools directory in ANDROID_HOME" if dirs.empty?
|
86
|
+
dirs.first
|
87
|
+
end
|
88
|
+
|
89
|
+
def android_home_path
|
90
|
+
ENV["ANDROID_HOME"].gsub("\\", "/")
|
91
|
+
end
|
92
|
+
|
83
93
|
def read_keystore_info
|
84
94
|
keystore = default_keystore
|
85
95
|
|
Binary file
|
@@ -215,7 +215,11 @@ module Operations
|
|
215
215
|
end
|
216
216
|
|
217
217
|
def app_running?
|
218
|
-
|
218
|
+
begin
|
219
|
+
http("/ping") == "pong"
|
220
|
+
rescue
|
221
|
+
false
|
222
|
+
end
|
219
223
|
end
|
220
224
|
|
221
225
|
def keyguard_enabled?
|
@@ -255,12 +259,9 @@ module Operations
|
|
255
259
|
http.read_timeout = options[:read_timeout] if options[:read_timeout]
|
256
260
|
resp = http.post(path, "#{data.to_json}", {"Content-Type" => "application/json;charset=utf-8"})
|
257
261
|
resp.body
|
258
|
-
rescue
|
259
|
-
|
262
|
+
rescue EOFError => e
|
263
|
+
log "It looks like your app is no longer running. \nIt could be because of a crash or because your test script shut it down."
|
260
264
|
raise e
|
261
|
-
else
|
262
|
-
raise "App no longer running"
|
263
|
-
end
|
264
265
|
end
|
265
266
|
end
|
266
267
|
|
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
24
24
|
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
|
25
|
-
<uses-permission android:name="android.permission.
|
25
|
+
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
26
26
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
27
27
|
<uses-permission android:name="android.permission.INTERNET" />
|
28
28
|
|
data/test-server/build.xml
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
|
7
7
|
<property name="adb.device.arg" value="" />
|
8
8
|
<property environment="env"/>
|
9
|
-
<property file="build.properties"/>
|
10
9
|
<property name="staging.dir" location="staging"/>
|
11
10
|
<property name="bin.dir" location="bin"/>
|
12
11
|
<property name="test.app.aapt" location="${bin.dir}/Test_aapt.apk"/>
|
@@ -14,24 +13,19 @@
|
|
14
13
|
<property name="test.app.unsigned" location="${bin.dir}/Test_unsigned.apk"/>
|
15
14
|
<property name="calabashjs.dir" location="calabash-js/src"/>
|
16
15
|
|
17
|
-
|
18
16
|
<!-- Windows support -->
|
19
17
|
<condition property="bat" value=".bat" else=""><os family="windows" /></condition>
|
20
|
-
<property name="dx" location="${env.ANDROID_HOME}/platform-tools/dx${bat}" />
|
21
|
-
<property name="apkbuilder" location="${env.ANDROID_HOME}/tools/apkbuilder${bat}" />
|
22
18
|
|
19
|
+
<property name="dx" location="${tools.dir}/dx${bat}" />
|
20
|
+
<property name="aapt" location="${tools.dir}/aapt${bat}" />
|
21
|
+
|
23
22
|
<property name="android.lib" location="${env.ANDROID_HOME}/platforms/android-${android.api.level}/android.jar"/>
|
24
23
|
<path id="android.antlibs">
|
24
|
+
<pathelement path="${env.ANDROID_HOME}/tools/lib/ant-tasks.jar" />
|
25
25
|
<pathelement path="${env.ANDROID_HOME}/tools/lib/anttasks.jar" />
|
26
26
|
<pathelement path="${env.ANDROID_HOME}/tools/lib/sdklib.jar" />
|
27
27
|
<pathelement path="${env.ANDROID_HOME}/tools/lib/androidprefs.jar" />
|
28
28
|
</path>
|
29
|
-
<taskdef name="xpath" classname="com.android.ant.XPathTask" classpathref="android.antlibs"/>
|
30
|
-
<taskdef name="aapt" classname="com.android.ant.AaptExecTask" classpathref="android.antlibs" />
|
31
|
-
<taskdef name="apkbuilder" classname="com.android.ant.ApkBuilderTask" classpathref="android.antlibs" />
|
32
|
-
|
33
|
-
|
34
|
-
|
35
29
|
|
36
30
|
<path id="jar.libs.ref">
|
37
31
|
<fileset dir="${staging.dir}/libs/" includes="*.jar" />
|
@@ -103,7 +97,7 @@
|
|
103
97
|
</target>
|
104
98
|
|
105
99
|
<target name="-aapt">
|
106
|
-
<exec executable="${
|
100
|
+
<exec executable="${aapt}" failonerror="yes">
|
107
101
|
<arg value="package" />
|
108
102
|
<arg value="-f" />
|
109
103
|
<arg value="-F" />
|
@@ -131,12 +125,11 @@
|
|
131
125
|
</target>
|
132
126
|
|
133
127
|
<target name="-apk">
|
134
|
-
<exec executable="
|
128
|
+
<exec executable="java" failonerror="yes">
|
129
|
+
<arg value="-jar" />
|
130
|
+
<arg value="${staging.dir}/CalabashApkBuilder.jar" />
|
135
131
|
<arg file="${test.app.unsigned}" />
|
136
|
-
<arg value="-u" />
|
137
|
-
<arg value="-z" />
|
138
132
|
<arg file="${test.app.aapt}" />
|
139
|
-
<arg value="-f" />
|
140
133
|
<arg file="${dex.file}" />
|
141
134
|
</exec>
|
142
135
|
</target>
|
Binary file
|
File without changes
|
@@ -13,15 +13,20 @@ public class L10nHelper {
|
|
13
13
|
* get the translated value based on the current active locale.
|
14
14
|
*
|
15
15
|
* @param l10nKey The l10n key to use
|
16
|
+
* @param pckg Optional package to find the resource, defaults to the application's package if null
|
16
17
|
* @return The translated value.
|
17
18
|
*/
|
18
|
-
public static String getValue(String l10nKey) {
|
19
|
+
public static String getValue(String l10nKey, String pckg) {
|
20
|
+
|
21
|
+
if(pckg == null){
|
22
|
+
pckg = InstrumentationBackend.solo.getCurrentActivity().getPackageName();
|
23
|
+
}
|
24
|
+
|
19
25
|
int resourceId =
|
20
26
|
InstrumentationBackend.solo
|
21
27
|
.getCurrentActivity()
|
22
28
|
.getResources()
|
23
|
-
.getIdentifier(l10nKey, "string",
|
24
|
-
InstrumentationBackend.solo.getCurrentActivity().getPackageName());
|
29
|
+
.getIdentifier(l10nKey, "string", pckg);
|
25
30
|
|
26
31
|
String localizedString =
|
27
32
|
InstrumentationBackend.solo.getCurrentActivity().getResources().getString(resourceId);
|
@@ -21,7 +21,9 @@ public class PressElement implements Action {
|
|
21
21
|
public Result execute(String... args) {
|
22
22
|
String l10nKey = args[0];
|
23
23
|
String elementType = args.length > 1 ? args[1] : null;
|
24
|
-
String
|
24
|
+
String pckg = (args.length > 2)? args[2] : null;
|
25
|
+
|
26
|
+
String myLocalizedString = L10nHelper.getValue(l10nKey, pckg);
|
25
27
|
InstrumentationBackend.solo.searchText(myLocalizedString);
|
26
28
|
if (elementType == null) {
|
27
29
|
InstrumentationBackend.solo.clickOnText(myLocalizedString);
|
@@ -28,13 +28,14 @@ public class WaitForElement implements Action {
|
|
28
28
|
@Override
|
29
29
|
public Result execute(String... args) {
|
30
30
|
String l10nKey = args[0];
|
31
|
+
String pckg = (args.length > 1)? args[1] : null;
|
31
32
|
|
32
|
-
String myLocalizedString = L10nHelper.getValue(l10nKey);
|
33
|
+
String myLocalizedString = L10nHelper.getValue(l10nKey, pckg);
|
33
34
|
boolean timedOut = !InstrumentationBackend.solo.waitForText(
|
34
35
|
myLocalizedString, 1, 90000);
|
35
36
|
if (timedOut) {
|
36
37
|
return new Result(false, "Time out while waiting for text:"
|
37
|
-
+ args[0]);
|
38
|
+
+ args[0] + ", package: " + pckg);
|
38
39
|
} else {
|
39
40
|
return Result.successResult();
|
40
41
|
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.softkey;
|
2
|
+
|
3
|
+
|
4
|
+
import com.jayway.android.robotium.solo.Solo;
|
5
|
+
|
6
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
7
|
+
import sh.calaba.instrumentationbackend.Result;
|
8
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
9
|
+
|
10
|
+
|
11
|
+
public class LeftKey implements Action {
|
12
|
+
|
13
|
+
@Override
|
14
|
+
public Result execute(String... args) {
|
15
|
+
InstrumentationBackend.solo.sendKey(Solo.LEFT);
|
16
|
+
return Result.successResult();
|
17
|
+
}
|
18
|
+
|
19
|
+
@Override
|
20
|
+
public String key() {
|
21
|
+
return "send_key_left";
|
22
|
+
}
|
23
|
+
|
24
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.softkey;
|
2
|
+
|
3
|
+
|
4
|
+
import com.jayway.android.robotium.solo.Solo;
|
5
|
+
|
6
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
7
|
+
import sh.calaba.instrumentationbackend.Result;
|
8
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
9
|
+
|
10
|
+
|
11
|
+
public class RightKey implements Action {
|
12
|
+
|
13
|
+
@Override
|
14
|
+
public Result execute(String... args) {
|
15
|
+
InstrumentationBackend.solo.sendKey(Solo.RIGHT);
|
16
|
+
return Result.successResult();
|
17
|
+
}
|
18
|
+
|
19
|
+
@Override
|
20
|
+
public String key() {
|
21
|
+
return "send_key_right";
|
22
|
+
}
|
23
|
+
|
24
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.softkey;
|
2
|
+
|
3
|
+
|
4
|
+
import com.jayway.android.robotium.solo.Solo;
|
5
|
+
|
6
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
7
|
+
import sh.calaba.instrumentationbackend.Result;
|
8
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
9
|
+
|
10
|
+
|
11
|
+
public class UpKey implements Action {
|
12
|
+
|
13
|
+
@Override
|
14
|
+
public Result execute(String... args) {
|
15
|
+
InstrumentationBackend.solo.sendKey(Solo.UP);
|
16
|
+
return Result.successResult();
|
17
|
+
}
|
18
|
+
|
19
|
+
@Override
|
20
|
+
public String key() {
|
21
|
+
return "send_key_up";
|
22
|
+
}
|
23
|
+
|
24
|
+
}
|
@@ -11,7 +11,10 @@ public class EnterTextById implements Action {
|
|
11
11
|
|
12
12
|
@Override
|
13
13
|
public Result execute(String... args) {
|
14
|
-
|
14
|
+
if(args[1] == null) {
|
15
|
+
return Result.failedResult("Input text cannot be null");
|
16
|
+
}
|
17
|
+
View view = TestHelpers.getViewById(args[1]);
|
15
18
|
if(view == null) {
|
16
19
|
return new Result(false, "No view found with id: '" + args[1] + "'");
|
17
20
|
} else if (!(view instanceof EditText)) {
|
@@ -17,7 +17,7 @@ public class WaitForViewById implements Action {
|
|
17
17
|
if( getViewById(viewId, 60000) != null ) {
|
18
18
|
return Result.successResult();
|
19
19
|
} else {
|
20
|
-
return new Result(false, "
|
20
|
+
return new Result(false, "Waiting for view with id '" + viewId + "' to be visible timed out");
|
21
21
|
}
|
22
22
|
} catch( InterruptedException e ) {
|
23
23
|
return Result.fromThrowable(e);
|
@@ -25,22 +25,29 @@ public class WaitForViewById implements Action {
|
|
25
25
|
}
|
26
26
|
|
27
27
|
protected View getViewById( String viewId, long timeout ) throws InterruptedException {
|
28
|
-
|
28
|
+
|
29
|
+
System.out.println("Waiting for view with id '" + viewId + "' to appear");
|
30
|
+
|
31
|
+
View view = TestHelpers.getViewById(viewId);
|
32
|
+
|
33
|
+
// no view, quick exit
|
34
|
+
if(view == null){
|
35
|
+
throw new IllegalArgumentException("Could not find view with id '" + viewId + "'");
|
36
|
+
}
|
37
|
+
|
38
|
+
System.out.println("Waiting for view with id '" + viewId + "' found view " + view);
|
39
|
+
|
29
40
|
long endTime = System.currentTimeMillis() + timeout;
|
30
41
|
while (System.currentTimeMillis() < endTime) {
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
if (view != null) {
|
35
|
-
System.out.println("Waiting for view with id '" + viewId + "' Success");
|
42
|
+
if (view.getVisibility() == View.VISIBLE) {
|
43
|
+
System.out.println("View with id '" + viewId + "' is visible, success");
|
36
44
|
return view;
|
37
45
|
} else {
|
38
|
-
System.out.println("
|
46
|
+
System.out.println("View with id '" + viewId + "' is not visible, sleeping...");
|
39
47
|
Thread.sleep(500);
|
40
48
|
}
|
41
49
|
}
|
42
50
|
|
43
|
-
System.out.println("Waiting for view with id '" + viewId + "' Timed out");
|
44
51
|
return null;
|
45
52
|
}
|
46
53
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-android
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.5.pre1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jonas Maturana Larsen
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|
@@ -180,10 +180,11 @@ files:
|
|
180
180
|
- test-server/instrumentation-backend/.project
|
181
181
|
- test-server/instrumentation-backend/.settings/org.eclipse.jdt.core.prefs
|
182
182
|
- test-server/instrumentation-backend/AndroidManifest.xml
|
183
|
+
- test-server/instrumentation-backend/CalabashApkBuilder.jar
|
183
184
|
- test-server/instrumentation-backend/antlr.sh
|
184
185
|
- test-server/instrumentation-backend/antlr/UIQuery.g
|
185
186
|
- test-server/instrumentation-backend/antlr/UIQuery.tokens
|
186
|
-
- test-server/instrumentation-backend/assets
|
187
|
+
- test-server/instrumentation-backend/assets/.gitkeep
|
187
188
|
- test-server/instrumentation-backend/build-libs/antlr-3.4-complete.jar
|
188
189
|
- test-server/instrumentation-backend/build-libs/junit.jar
|
189
190
|
- test-server/instrumentation-backend/build.xml
|
@@ -341,8 +342,11 @@ files:
|
|
341
342
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/DownKey.java
|
342
343
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/EnterKey.java
|
343
344
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/GoBack.java
|
345
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java
|
344
346
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/PressMenu.java
|
347
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java
|
345
348
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/SelectFromMenuByText.java
|
349
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java
|
346
350
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/spinner/GetSelectedSpinnerItemText.java
|
347
351
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/spinner/SelectSpinnerItemByContentDescription.java
|
348
352
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/AssertGridViewContainsNoDuplicates.java
|
@@ -845,9 +849,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
845
849
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
846
850
|
none: false
|
847
851
|
requirements:
|
848
|
-
- - ! '
|
852
|
+
- - ! '>'
|
849
853
|
- !ruby/object:Gem::Version
|
850
|
-
version:
|
854
|
+
version: 1.3.1
|
851
855
|
requirements: []
|
852
856
|
rubyforge_project:
|
853
857
|
rubygems_version: 1.8.23
|