calabash-android 0.3.2.pre2 → 0.3.2.pre3
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/bin/calabash-android-run.rb +1 -1
- data/features-skeleton/irb_android.sh +12 -1
- data/features-skeleton/support/app_life_cycle_hooks.rb +1 -1
- data/lib/calabash-android/canned_steps.md +17 -0
- data/lib/calabash-android/helpers.rb +3 -1
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +9 -17
- data/lib/calabash-android/steps/l10n_steps.rb +19 -0
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/helpers/InspectCurrentDialog.java +76 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/L10nHelper.java +31 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/PressElement.java +48 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/WaitForElement.java +47 -0
- metadata +7 -2
data/bin/calabash-android-run.rb
CHANGED
@@ -1,2 +1,13 @@
|
|
1
1
|
#!/bin/bash
|
2
|
-
|
2
|
+
TEST_SERVER_PORT=34777
|
3
|
+
MOBILE_APP_PACKAGE=$1
|
4
|
+
if [ -z "$MOBILE_APP_PACKAGE" ]; then
|
5
|
+
echo 'The parameter about your mobile app package is missing: e.g. com.springsource.greenhouse.test'
|
6
|
+
exit 1
|
7
|
+
else
|
8
|
+
# use this line for calabash version 0.1
|
9
|
+
# adb shell am instrument -e class sh.calaba.instrumentationbackend.InstrumentationBackend -w $MOBILE_APP_PACKAGE/android.test.InstrumentationTestRunner &
|
10
|
+
adb shell am instrument -e class sh.calaba.instrumentationbackend.InstrumentationBackend -w $MOBILE_APP_PACKAGE/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner &
|
11
|
+
sleep 7
|
12
|
+
IRBRC=.irbrc TEST_SERVER_PORT=$TEST_SERVER_PORT irb
|
13
|
+
fi
|
@@ -220,6 +220,23 @@ To use a set of concrete GPS cordinates
|
|
220
220
|
Then /^I am at ([-+]?[0-9]*\.?[0-9]+), ([-+]?[0-9]*\.?[0-9]+)$/ do |latitude, longitude|
|
221
221
|
Then /^I go to ([-+]?[0-9]*\.?[0-9]+), ([-+]?[0-9]*\.?[0-9]+)$/ do |latitude, longitude|
|
222
222
|
|
223
|
+
Internationalization
|
224
|
+
--------------------
|
225
|
+
|
226
|
+
Then /^I press text of translated l10key (\d+)$/
|
227
|
+
Simulates that the user pressed the text of the l10nkey.
|
228
|
+
|
229
|
+
Then /^I press button of translated l10key (\d+)$/
|
230
|
+
Simulates that the user pressed the button with the label text of the l10nkey.
|
231
|
+
|
232
|
+
Then /^I press menu item of translated l10key (\d+)$/
|
233
|
+
Simulates that the user pressed the menu item with the label text of the l10nkey.
|
234
|
+
|
235
|
+
Then /^I press toggle button of translated l10key (\d+)$/
|
236
|
+
Simulates that the user pressed the toggle button with the label text of the l10nkey.
|
237
|
+
|
238
|
+
Then /^I wait for the translated "([^\"]*)" l10nkey to appear$/
|
239
|
+
Waits until the text of the translated l10nkey is displayed.
|
223
240
|
|
224
241
|
Rotation
|
225
242
|
--------
|
Binary file
|
@@ -30,7 +30,7 @@ module Operations
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
def default_device
|
33
|
-
Device.default_device
|
33
|
+
Device.default_device
|
34
34
|
end
|
35
35
|
|
36
36
|
def performAction(action, *arguments)
|
@@ -59,7 +59,8 @@ module Operations
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def screenshot_embed(options={:prefix => nil, :name => nil, :label => nil})
|
62
|
-
default_device.
|
62
|
+
path = default_device.screenshot(options)
|
63
|
+
embed(path, "image/png", options[:label] || File.basename(path))
|
63
64
|
end
|
64
65
|
|
65
66
|
def screenshot(options={:prefix => nil, :name => nil})
|
@@ -121,9 +122,9 @@ module Operations
|
|
121
122
|
class Device
|
122
123
|
@@default_device = nil
|
123
124
|
|
124
|
-
def self.default_device
|
125
|
+
def self.default_device
|
125
126
|
unless @@default_device
|
126
|
-
@@default_device = Device.new(
|
127
|
+
@@default_device = Device.new(ENV["ADB_DEVICE_ARG"], ENV["TEST_SERVER_PORT"], ENV["APP_PATH"], ENV["TEST_APP_PATH"])
|
127
128
|
end
|
128
129
|
@@default_device
|
129
130
|
end
|
@@ -132,15 +133,15 @@ module Operations
|
|
132
133
|
@@default_device = self
|
133
134
|
end
|
134
135
|
|
135
|
-
def initialize(
|
136
|
-
@cucumber_world = cucumber_world
|
136
|
+
def initialize(serial, server_port, app_path, test_server_path)
|
137
137
|
@serial = serial
|
138
138
|
@server_port = server_port
|
139
139
|
@app_path = app_path
|
140
140
|
@test_server_path = test_server_path
|
141
141
|
|
142
|
-
|
143
|
-
log
|
142
|
+
forward_cmd = "#{adb_command} forward tcp:#{server_port} tcp:7102"
|
143
|
+
log forward_cmd
|
144
|
+
log `#{forward_cmd}`
|
144
145
|
end
|
145
146
|
|
146
147
|
def reinstall_apps()
|
@@ -230,11 +231,6 @@ module Operations
|
|
230
231
|
end
|
231
232
|
end
|
232
233
|
|
233
|
-
def screenshot_embed(options={:prefix => nil, :name => nil, :label => nil})
|
234
|
-
path = screenshot(options)
|
235
|
-
@cucumber_world.embed(path, "image/png", options[:label] || File.basename(path))
|
236
|
-
end
|
237
|
-
|
238
234
|
def screenshot(options={:prefix => nil, :name => nil})
|
239
235
|
prefix = options[:prefix] || ENV['SCREENSHOT_PATH'] || ""
|
240
236
|
name = options[:name]
|
@@ -311,10 +307,6 @@ module Operations
|
|
311
307
|
http("/kill")
|
312
308
|
end
|
313
309
|
|
314
|
-
def log(message)
|
315
|
-
$stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{message}" if (ARGV.include? "-v" or ARGV.include? "--verbose")
|
316
|
-
end
|
317
|
-
|
318
310
|
##location
|
319
311
|
def set_gps_coordinates_from_location(location)
|
320
312
|
require 'geocoder'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Then /^I press text of translated l10key (\d+)$/ do |l10key|
|
2
|
+
performAction('press_l10n_element', l10key)
|
3
|
+
end
|
4
|
+
|
5
|
+
Then /^I press button of translated l10key (\d+)$/ do |l10key|
|
6
|
+
performAction('press_l10n_element', l10key,'button')
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^I press menu item of translated l10key (\d+)$/ do |l10key|
|
10
|
+
performAction('press_l10n_element', l10key,'menu_item')
|
11
|
+
end
|
12
|
+
|
13
|
+
Then /^I press toggle button of translated l10key (\d+)$/ do |l10key|
|
14
|
+
performAction('press_l10n_element', l10key,'toggle_button')
|
15
|
+
end
|
16
|
+
|
17
|
+
Then /^I wait for the translated "([^\"]*)" l10nkey to appear$/ do |l10nkey|
|
18
|
+
performAction('wait_for_l10n_element', l10nkey)
|
19
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.helpers;
|
2
|
+
|
3
|
+
|
4
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
5
|
+
import sh.calaba.instrumentationbackend.Result;
|
6
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
7
|
+
import android.view.View;
|
8
|
+
import android.widget.Button;
|
9
|
+
import android.widget.EditText;
|
10
|
+
import android.widget.FrameLayout;
|
11
|
+
import android.widget.LinearLayout;
|
12
|
+
import android.widget.RelativeLayout;
|
13
|
+
import android.widget.ScrollView;
|
14
|
+
import android.widget.Spinner;
|
15
|
+
import android.widget.TextView;
|
16
|
+
|
17
|
+
import com.jayway.android.robotium.solo.Solo;
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Command is inspecting the current dialog and returns a list of details about the current
|
21
|
+
* displayed UI items.
|
22
|
+
*
|
23
|
+
* @author Dominik Dary
|
24
|
+
*
|
25
|
+
*/
|
26
|
+
public class InspectCurrentDialog implements Action {
|
27
|
+
|
28
|
+
@Override
|
29
|
+
public Result execute(String... args) {
|
30
|
+
Solo solo = InstrumentationBackend.solo;
|
31
|
+
StringBuffer viewInfo = new StringBuffer();
|
32
|
+
viewInfo.append("<views activity='" + solo.getCurrentActivity().getComponentName() + "'>");
|
33
|
+
for (View view : solo.getViews()) {
|
34
|
+
if ((view instanceof RelativeLayout) || (view instanceof LinearLayout)
|
35
|
+
|| (view instanceof ScrollView) || (view instanceof FrameLayout)) {
|
36
|
+
// for automation are this ui elements normally not so interesting
|
37
|
+
continue;
|
38
|
+
}
|
39
|
+
viewInfo.append("<view>");
|
40
|
+
viewInfo.append("<type>" + view.getClass().getSimpleName() + "</type>");
|
41
|
+
|
42
|
+
try {
|
43
|
+
viewInfo.append("<name>"
|
44
|
+
+ InstrumentationBackend.solo.getCurrentActivity().getResources()
|
45
|
+
.getResourceName(view.getId()) + "</name>");
|
46
|
+
|
47
|
+
} catch (Exception e) {
|
48
|
+
// in case the resource name cannot be identified
|
49
|
+
viewInfo.append("<name></name>");
|
50
|
+
}
|
51
|
+
|
52
|
+
if (view instanceof TextView) {
|
53
|
+
viewInfo.append("<textViewText>" + ((TextView) view).getText() + "</textViewText>");
|
54
|
+
} else if (view instanceof Button) {
|
55
|
+
viewInfo.append("<buttonText>" + ((Button) view).getText() + "</buttonText>");
|
56
|
+
} else if (view instanceof Spinner) {
|
57
|
+
viewInfo.append("<spinnerText>" + ((Spinner) view).getSelectedItem() + "</spinnerText>");
|
58
|
+
} else if (view instanceof EditText) {
|
59
|
+
viewInfo.append("<editText>" + ((EditText) view).getText() + "</editText>");
|
60
|
+
}
|
61
|
+
|
62
|
+
viewInfo.append("</view>");
|
63
|
+
}
|
64
|
+
|
65
|
+
viewInfo.append("</views>");
|
66
|
+
Result result = new Result(true);
|
67
|
+
result.addBonusInformation(viewInfo.toString());
|
68
|
+
return result;
|
69
|
+
}
|
70
|
+
|
71
|
+
@Override
|
72
|
+
public String key() {
|
73
|
+
return "inspect_current_dialog";
|
74
|
+
}
|
75
|
+
|
76
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.l10n;
|
2
|
+
|
3
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Helper to access Android L10n files.
|
7
|
+
*
|
8
|
+
* @author Dominik Dary
|
9
|
+
*
|
10
|
+
*/
|
11
|
+
public class L10nHelper {
|
12
|
+
/**
|
13
|
+
* get the translated value based on the current active locale.
|
14
|
+
*
|
15
|
+
* @param l10nKey The l10n key to use
|
16
|
+
* @return The translated value.
|
17
|
+
*/
|
18
|
+
public static String getValue(String l10nKey) {
|
19
|
+
int resourceId =
|
20
|
+
InstrumentationBackend.solo
|
21
|
+
.getCurrentActivity()
|
22
|
+
.getResources()
|
23
|
+
.getIdentifier(l10nKey, "string",
|
24
|
+
InstrumentationBackend.solo.getCurrentActivity().getPackageName());
|
25
|
+
|
26
|
+
String localizedString =
|
27
|
+
InstrumentationBackend.solo.getCurrentActivity().getResources().getString(resourceId);
|
28
|
+
|
29
|
+
return localizedString;
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
package sh.calaba.instrumentationbackend.actions.l10n;
|
3
|
+
|
4
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
5
|
+
import sh.calaba.instrumentationbackend.Result;
|
6
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Action is getting the translated value of the provided #l10nKey and is
|
10
|
+
* searching for the text and then clicking on it.
|
11
|
+
*
|
12
|
+
* @author Dominik Dary
|
13
|
+
* @see L10nHelper
|
14
|
+
*/
|
15
|
+
public class PressElement implements Action {
|
16
|
+
public static final String BUTTON = "button";
|
17
|
+
public static final String TOGGLE_BUTTON = "toggle_button";
|
18
|
+
public static final String MENU_ITEM = "menu_item";
|
19
|
+
|
20
|
+
@Override
|
21
|
+
public Result execute(String... args) {
|
22
|
+
String l10nKey = args[0];
|
23
|
+
String elementType = args.length > 1 ? args[1] : null;
|
24
|
+
String myLocalizedString = L10nHelper.getValue(l10nKey);
|
25
|
+
InstrumentationBackend.solo.searchText(myLocalizedString);
|
26
|
+
if (elementType == null) {
|
27
|
+
InstrumentationBackend.solo.clickOnText(myLocalizedString);
|
28
|
+
} else if (BUTTON.equalsIgnoreCase(elementType)) {
|
29
|
+
InstrumentationBackend.solo.clickOnButton(myLocalizedString);
|
30
|
+
} else if (MENU_ITEM.equalsIgnoreCase(elementType)) {
|
31
|
+
InstrumentationBackend.solo.clickOnMenuItem(myLocalizedString);
|
32
|
+
} else if (TOGGLE_BUTTON.equalsIgnoreCase(elementType)) {
|
33
|
+
InstrumentationBackend.solo.clickOnToggleButton(myLocalizedString);
|
34
|
+
} else {
|
35
|
+
return Result.fromThrowable(new Throwable(
|
36
|
+
"specified element type: '" + elementType
|
37
|
+
+ " ' is not supported."));
|
38
|
+
}
|
39
|
+
|
40
|
+
return Result.successResult();
|
41
|
+
}
|
42
|
+
|
43
|
+
@Override
|
44
|
+
public String key() {
|
45
|
+
return "press_l10n_element";
|
46
|
+
}
|
47
|
+
|
48
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2012 calabash-driver committers.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
12
|
+
* the License.
|
13
|
+
*/
|
14
|
+
package sh.calaba.instrumentationbackend.actions.l10n;
|
15
|
+
|
16
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
17
|
+
import sh.calaba.instrumentationbackend.Result;
|
18
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Action is waiting until the text of the given #l10nKey is displayed.
|
22
|
+
*
|
23
|
+
* @author Dominik Dary
|
24
|
+
* @see L10nHelper
|
25
|
+
*/
|
26
|
+
public class WaitForElement implements Action {
|
27
|
+
|
28
|
+
@Override
|
29
|
+
public Result execute(String... args) {
|
30
|
+
String l10nKey = args[0];
|
31
|
+
|
32
|
+
String myLocalizedString = L10nHelper.getValue(l10nKey);
|
33
|
+
boolean timedOut = !InstrumentationBackend.solo.waitForText(
|
34
|
+
myLocalizedString, 1, 90000);
|
35
|
+
if (timedOut) {
|
36
|
+
return new Result(false, "Time out while waiting for text:"
|
37
|
+
+ args[0]);
|
38
|
+
} else {
|
39
|
+
return Result.successResult();
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
@Override
|
44
|
+
public String key() {
|
45
|
+
return "wait_for_l10n_element";
|
46
|
+
}
|
47
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-android
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.2.
|
4
|
+
version: 0.3.2.pre3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- lib/calabash-android/steps/context_menu_steps.rb
|
141
141
|
- lib/calabash-android/steps/date_picker_steps.rb
|
142
142
|
- lib/calabash-android/steps/enter_text_steps.rb
|
143
|
+
- lib/calabash-android/steps/l10n_steps.rb
|
143
144
|
- lib/calabash-android/steps/list_steps.rb
|
144
145
|
- lib/calabash-android/steps/location_steps.rb
|
145
146
|
- lib/calabash-android/steps/map_steps.rb
|
@@ -193,7 +194,11 @@ files:
|
|
193
194
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/ClickOnScreen.java
|
194
195
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Drag.java
|
195
196
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java
|
197
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/helpers/InspectCurrentDialog.java
|
196
198
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/helpers/ListActions.java
|
199
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/L10nHelper.java
|
200
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/PressElement.java
|
201
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/WaitForElement.java
|
197
202
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemProperties.java
|
198
203
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemText.java
|
199
204
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/LongPressListItems.java
|