calabash-android 0.3.3.pre3 → 0.3.3.pre5
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 +12 -0
- data/bin/calabash-android-console.rb +21 -0
- data/bin/calabash-android-generate.rb +0 -2
- data/{features-skeleton/.irbrc → irbrc} +4 -2
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +2 -1
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +17 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/InstrumentationBackend.java +13 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListData.java +85 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemProperties.java +2 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/search/EnterQueryByIndex.java +1 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +5 -4
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +4 -10
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +3 -10
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +21 -27
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +3 -9
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +13 -20
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/GetLoadProgress.java +2 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +12 -18
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +10 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +5 -13
- metadata +5 -4
- data/features-skeleton/irb_android.sh +0 -22
data/bin/calabash-android
CHANGED
@@ -9,6 +9,7 @@ require File.join(File.dirname(__FILE__), "calabash-android-generate")
|
|
9
9
|
require File.join(File.dirname(__FILE__), "calabash-android-build")
|
10
10
|
require File.join(File.dirname(__FILE__), "calabash-android-run")
|
11
11
|
require File.join(File.dirname(__FILE__), "calabash-android-setup")
|
12
|
+
require File.join(File.dirname(__FILE__), "calabash-android-console")
|
12
13
|
|
13
14
|
@features_dir = File.join(FileUtils.pwd, "features")
|
14
15
|
@support_dir = File.join(@features_dir, "support")
|
@@ -52,6 +53,17 @@ elsif cmd == 'run'
|
|
52
53
|
elsif cmd == 'gen'
|
53
54
|
calabash_scaffold
|
54
55
|
exit 0
|
56
|
+
elsif cmd == 'console'
|
57
|
+
if ARGV.empty?
|
58
|
+
puts "Please specify an app"
|
59
|
+
exit 1
|
60
|
+
end
|
61
|
+
unless File.exist? ARGV.first
|
62
|
+
puts "No such file #{ARGV.first}"
|
63
|
+
exit 1
|
64
|
+
end
|
65
|
+
calabash_console ARGV.first
|
66
|
+
exit 0
|
55
67
|
elsif cmd == 'setup'
|
56
68
|
calabash_setup
|
57
69
|
exit 0
|
@@ -0,0 +1,21 @@
|
|
1
|
+
def calabash_console(app_path = nil)
|
2
|
+
test_server_path = test_server_path(app_path)
|
3
|
+
|
4
|
+
unless ENV["TEST_SERVER_PORT"]
|
5
|
+
ENV["TEST_SERVER_PORT"] = "34777"
|
6
|
+
end
|
7
|
+
|
8
|
+
unless ENV["IRBRC"]
|
9
|
+
ENV["IRBRC"] = File.join(File.dirname(__FILE__), '..', 'irbrc')
|
10
|
+
end
|
11
|
+
|
12
|
+
unless ENV["PACKAGE_NAME"]
|
13
|
+
ENV["PACKAGE_NAME"] = package_name(app_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
unless ENV["MAIN_ACTIVITY"]
|
17
|
+
ENV["MAIN_ACTIVITY"] = main_activity(app_path)
|
18
|
+
end
|
19
|
+
|
20
|
+
system "irb"
|
21
|
+
end
|
@@ -12,8 +12,6 @@ def calabash_scaffold
|
|
12
12
|
exit 2 unless STDIN.gets.chomp == ''
|
13
13
|
|
14
14
|
FileUtils.cp_r(@source_dir, @features_dir)
|
15
|
-
FileUtils.mv "#{@features_dir}/.irbrc", "."
|
16
|
-
FileUtils.mv "#{@features_dir}/irb_android.sh", "."
|
17
15
|
|
18
16
|
msg("Info") do
|
19
17
|
puts "features subdirectory created. \n"
|
@@ -6,7 +6,7 @@ ARGV.concat [ "--readline",
|
|
6
6
|
"--prompt-mode",
|
7
7
|
"simple" ]
|
8
8
|
|
9
|
-
#
|
9
|
+
# 50 entries in the list
|
10
10
|
IRB.conf[:SAVE_HISTORY] = 50
|
11
11
|
|
12
12
|
# Store results in home directory with specified file name
|
@@ -15,4 +15,6 @@ IRB.conf[:HISTORY_FILE] = ".irb-history"
|
|
15
15
|
require 'calabash-android/operations'
|
16
16
|
include Calabash::Android::Operations
|
17
17
|
|
18
|
-
|
18
|
+
def embed(*args)
|
19
|
+
puts "Embed is a Cucumber method and is not available in this console."
|
20
|
+
end
|
Binary file
|
@@ -243,7 +243,8 @@ module Operations
|
|
243
243
|
path = "#{prefix}#{name}_#{@@screenshot_count}.png"
|
244
244
|
|
245
245
|
if ENV["SCREENSHOT_VIA_USB"] == "true"
|
246
|
-
|
246
|
+
device_args = "-s #{@serial}" if @serial
|
247
|
+
screenshot_cmd = "java -jar #{File.join(File.dirname(__FILE__), 'lib', 'screenShotTaker.jar')} #{path} #{device_args}"
|
247
248
|
log screenshot_cmd
|
248
249
|
raise "Could not take screenshot" unless system(screenshot_cmd)
|
249
250
|
else
|
@@ -1,7 +1,9 @@
|
|
1
1
|
package sh.calaba.instrumentationbackend;
|
2
2
|
|
3
3
|
import java.util.Arrays;
|
4
|
+
import java.util.concurrent.atomic.AtomicReference;
|
4
5
|
|
6
|
+
import android.os.Looper;
|
5
7
|
import sh.calaba.instrumentationbackend.actions.Action;
|
6
8
|
|
7
9
|
|
@@ -41,8 +43,21 @@ public class Command {
|
|
41
43
|
}
|
42
44
|
|
43
45
|
public Result execute() {
|
44
|
-
Action action = InstrumentationBackend.actions.lookup(getCommand());
|
45
|
-
|
46
|
+
final Action action = InstrumentationBackend.actions.lookup(getCommand());
|
47
|
+
|
48
|
+
if ( Looper.getMainLooper().getThread() != Thread.currentThread()) {
|
49
|
+
return action.execute(getArguments());
|
50
|
+
}
|
51
|
+
|
52
|
+
final AtomicReference<Result> result = new AtomicReference<Result>();
|
53
|
+
InstrumentationBackend.instrumentation.runOnMainSync(new Runnable() {
|
54
|
+
@Override
|
55
|
+
public void run() {
|
56
|
+
result.set(action.execute(getArguments()));
|
57
|
+
}
|
58
|
+
});
|
59
|
+
return result.get();
|
60
|
+
|
46
61
|
}
|
47
62
|
|
48
63
|
}
|
@@ -2,8 +2,11 @@ package sh.calaba.instrumentationbackend;
|
|
2
2
|
|
3
3
|
import sh.calaba.instrumentationbackend.actions.Actions;
|
4
4
|
import sh.calaba.instrumentationbackend.actions.HttpServer;
|
5
|
+
import android.app.Activity;
|
5
6
|
import android.app.Instrumentation;
|
7
|
+
import android.content.Context;
|
6
8
|
import android.test.ActivityInstrumentationTestCase2;
|
9
|
+
import android.location.LocationManager;
|
7
10
|
import android.util.Log;
|
8
11
|
|
9
12
|
import com.jayway.android.robotium.solo.SoloEnhanced;
|
@@ -53,6 +56,8 @@ public class InstrumentationBackend extends ActivityInstrumentationTestCase2 {
|
|
53
56
|
e.printStackTrace();
|
54
57
|
}
|
55
58
|
|
59
|
+
removeTestLocationProviders(this.getActivity());
|
60
|
+
|
56
61
|
this.getActivity().finish();
|
57
62
|
super.tearDown();
|
58
63
|
|
@@ -65,4 +70,12 @@ public class InstrumentationBackend extends ActivityInstrumentationTestCase2 {
|
|
65
70
|
public static void logError(String message) {
|
66
71
|
Log.e(TAG, message);
|
67
72
|
}
|
73
|
+
|
74
|
+
private static void removeTestLocationProviders(Activity activity) {
|
75
|
+
final LocationManager locationService =
|
76
|
+
(LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
|
77
|
+
for (final String provider : locationService.getAllProviders()) {
|
78
|
+
locationService.removeTestProvider(provider);
|
79
|
+
}
|
80
|
+
}
|
68
81
|
}
|
@@ -0,0 +1,85 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.list;
|
2
|
+
|
3
|
+
import java.util.ArrayList;
|
4
|
+
|
5
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
6
|
+
import sh.calaba.instrumentationbackend.Result;
|
7
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
8
|
+
import android.widget.ListView;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Provides access to a list through its adapter.
|
12
|
+
*
|
13
|
+
* args:
|
14
|
+
* <ul>
|
15
|
+
* <li>1-based list index (first list is used if not specified)</li>
|
16
|
+
* </ul>
|
17
|
+
*
|
18
|
+
* eg: (all items of the 1st list) <code>performAction( 'get_list_data' )</code>
|
19
|
+
* eg: (all items of the 2nd list) <code>performAction( 'get_list_data', 2 )</code>
|
20
|
+
*
|
21
|
+
* @return <code>bonusInformation</code>: a JSON-formatted Array<String> that is an
|
22
|
+
* Array of objects with a single property "value". The value of this property is generated by calling
|
23
|
+
* <code>list.getAdapter().getItem().toString()</code>, so make sure you implement the toString() method
|
24
|
+
* on the objects that go to the adapter AND that it returns a value valid for JSON.
|
25
|
+
*
|
26
|
+
* In ruby we can then parse the response:
|
27
|
+
* <pre>
|
28
|
+
* result = performAction('get_list_data')
|
29
|
+
* bonusInfo = result['bonusInformation'][0]
|
30
|
+
* JSON.parse(bonusInfo).each do |item|
|
31
|
+
* puts "#{item["value"]}"
|
32
|
+
* end
|
33
|
+
* </pre>
|
34
|
+
*
|
35
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
36
|
+
*/
|
37
|
+
|
38
|
+
public class GetListData implements Action {
|
39
|
+
|
40
|
+
@Override
|
41
|
+
public Result execute(String... args) {
|
42
|
+
|
43
|
+
int listIndex;
|
44
|
+
|
45
|
+
if( args.length == 0 ) {
|
46
|
+
listIndex = 0;
|
47
|
+
} else {
|
48
|
+
listIndex = (Integer.parseInt(args[0]) - 1);
|
49
|
+
}
|
50
|
+
|
51
|
+
ArrayList<ListView> listViews = InstrumentationBackend.solo.getCurrentListViews();
|
52
|
+
|
53
|
+
if( listViews == null || listViews.size() <= listIndex ) {
|
54
|
+
return new Result(false, "Could not find list #" + (listIndex + 1));
|
55
|
+
}
|
56
|
+
|
57
|
+
ListView list = listViews.get(listIndex);
|
58
|
+
Result result = new Result(true);
|
59
|
+
|
60
|
+
StringBuilder json = new StringBuilder("[");
|
61
|
+
|
62
|
+
int count = list.getAdapter().getCount();
|
63
|
+
for( int i = 0; i < count; i++ ) {
|
64
|
+
json.append("{\"value\": \"");
|
65
|
+
json.append(list.getAdapter().getItem(i).toString());
|
66
|
+
json.append("\"},");
|
67
|
+
}
|
68
|
+
|
69
|
+
if(count > 0)
|
70
|
+
{
|
71
|
+
json.deleteCharAt( json.length() - 1 ); // remove the last comma
|
72
|
+
}
|
73
|
+
|
74
|
+
json.append("]");
|
75
|
+
|
76
|
+
result.addBonusInformation(json.toString());
|
77
|
+
|
78
|
+
return result;
|
79
|
+
}
|
80
|
+
|
81
|
+
@Override
|
82
|
+
public String key() {
|
83
|
+
return "get_list_data";
|
84
|
+
}
|
85
|
+
}
|
@@ -90,7 +90,6 @@ public class GetListItemProperties implements Action {
|
|
90
90
|
addViewInfo( json, (ViewGroup)row );
|
91
91
|
}
|
92
92
|
|
93
|
-
json.deleteCharAt( json.length() - 1 ); // remove the last comma
|
94
93
|
json.append('}');
|
95
94
|
return json.toString();
|
96
95
|
}
|
@@ -99,8 +98,8 @@ public class GetListItemProperties implements Action {
|
|
99
98
|
int resId = view.getId();
|
100
99
|
String resIdName = view.getResources().getResourceEntryName(resId);
|
101
100
|
|
102
|
-
json.append("\"id\":\"").append(resIdName).append("\", \"text:\"").append( ((TextView)view).getText() ).append("\"");
|
103
|
-
|
101
|
+
json.append("\"id\":\"").append(resIdName).append("\", \"text\":\"").append( ((TextView)view).getText() ).append("\"");
|
102
|
+
|
104
103
|
json.append(", \"color\":").append( view.getCurrentTextColor() );
|
105
104
|
Drawable background = view.getBackground();
|
106
105
|
if( background instanceof ColorDrawable ) {
|
@@ -12,13 +12,7 @@ public class EnterQueryByIndex implements Action {
|
|
12
12
|
final String query = args[0];
|
13
13
|
final SearchView view = (SearchView) InstrumentationBackend.solo.getView(
|
14
14
|
SearchView.class, Integer.parseInt(args[1]) - 1);
|
15
|
-
|
16
|
-
InstrumentationBackend.instrumentation.runOnMainSync(new Runnable() {
|
17
|
-
@Override
|
18
|
-
public void run() {
|
19
|
-
view.setQuery(query, true);
|
20
|
-
}
|
21
|
-
});
|
15
|
+
view.setQuery(query, true);
|
22
16
|
|
23
17
|
return Result.successResult();
|
24
18
|
}
|
@@ -4,6 +4,7 @@ import java.lang.reflect.Field;
|
|
4
4
|
import java.lang.reflect.Method;
|
5
5
|
import java.util.ArrayList;
|
6
6
|
import java.util.List;
|
7
|
+
import java.util.concurrent.atomic.AtomicReference;
|
7
8
|
|
8
9
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
9
10
|
import android.os.Build;
|
@@ -52,9 +53,9 @@ public class CalabashChromeClient extends WebChromeClient {
|
|
52
53
|
}
|
53
54
|
}
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
public WebView getWebView() {
|
57
|
+
return webView;
|
58
|
+
}
|
58
59
|
|
59
60
|
public String getResult() {
|
60
61
|
eventHandled.block(3000);
|
@@ -64,7 +65,7 @@ public class CalabashChromeClient extends WebChromeClient {
|
|
64
65
|
return result.message;
|
65
66
|
}
|
66
67
|
|
67
|
-
|
68
|
+
private class Result {
|
68
69
|
String message;
|
69
70
|
}
|
70
71
|
|
@@ -13,16 +13,10 @@ public class DumpBodyHtml implements Action {
|
|
13
13
|
|
14
14
|
final Result result = Result.successResult();
|
15
15
|
for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
webView.loadUrl("javascript:(function() {" +
|
22
|
-
"prompt('calabash:' + document.body.innerHTML);" +
|
23
|
-
"})()");
|
24
|
-
}
|
25
|
-
});
|
16
|
+
WebView webView = ccc.getWebView();
|
17
|
+
webView.loadUrl("javascript:(function() {" +
|
18
|
+
"prompt('calabash:' + document.body.innerHTML);" +
|
19
|
+
"})()");
|
26
20
|
String r = ccc.getResult();
|
27
21
|
System.out.println("Html:");
|
28
22
|
System.out.println("" + r);
|
@@ -14,16 +14,9 @@ public class DumpHtml implements Action {
|
|
14
14
|
Result result = Result.successResult();
|
15
15
|
for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
|
16
16
|
final WebView webView = ccc.getWebView();
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
public void run() {
|
21
|
-
|
22
|
-
webView.loadUrl("javascript:(function() {" +
|
23
|
-
"prompt('calabash:' + document.body.parentNode.innerHTML);" +
|
24
|
-
"})()");
|
25
|
-
}
|
26
|
-
});
|
17
|
+
webView.loadUrl("javascript:(function() {" +
|
18
|
+
"prompt('calabash:' + document.body.parentNode.innerHTML);" +
|
19
|
+
"})()");
|
27
20
|
String r = ccc.getResult();
|
28
21
|
System.out.println("Html:");
|
29
22
|
System.out.println("" + r);
|
@@ -16,17 +16,13 @@ public class EnterTextByCssSelector implements Action {
|
|
16
16
|
final String value = args[1];
|
17
17
|
|
18
18
|
for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
InstrumentationBackend.solo.getCurrentActivity().runOnUiThread(new Runnable() {
|
23
|
-
@Override
|
24
|
-
public void run() {
|
25
|
-
String functions = " function simulateKeyEvent(elem, character) {\n" +
|
19
|
+
WebView webView = ccc.getWebView();
|
20
|
+
|
21
|
+
String functions = " function simulateKeyEvent(elem, character) {\n" +
|
26
22
|
" var ch = character.charCodeAt(0);\n" +
|
27
23
|
"\n" +
|
28
24
|
" var evt;\n" +
|
29
|
-
|
25
|
+
"\n" +
|
30
26
|
" evt = document.createEvent('KeyboardEvent');\n" +
|
31
27
|
" evt.initKeyboardEvent('keydown', true, true, window, 0, 0, 0, 0, 0, ch);\n" +
|
32
28
|
" elem.dispatchEvent(evt);\n" +
|
@@ -41,8 +37,8 @@ public class EnterTextByCssSelector implements Action {
|
|
41
37
|
" }\n" +
|
42
38
|
"";
|
43
39
|
|
44
|
-
|
45
|
-
|
40
|
+
functions +=
|
41
|
+
" function enterTextIntoInputField(elem, text) {\n" +
|
46
42
|
" for (var i = 0; i < text.length; i++) {\n" +
|
47
43
|
" var ch = text.charAt(i);\n" +
|
48
44
|
" elem.value += ch;\n" +
|
@@ -51,35 +47,33 @@ public class EnterTextByCssSelector implements Action {
|
|
51
47
|
" }\n" +
|
52
48
|
"";
|
53
49
|
|
54
|
-
|
55
|
-
|
50
|
+
functions +=
|
51
|
+
" function fireHTMLEvent(elem, eventName) {\n" +
|
56
52
|
" var evt = document.createEvent(\"HTMLEvents\");\n" +
|
57
53
|
" evt.initEvent(eventName, true, true );\n" +
|
58
54
|
" return !elem.dispatchEvent(evt);\n" +
|
59
55
|
" }\n" +
|
60
56
|
"";
|
61
57
|
|
62
|
-
|
63
|
-
|
58
|
+
functions +=
|
59
|
+
" function selectInputField(elem) {\n" +
|
64
60
|
" elem.click();\n" +
|
65
61
|
" elem.focus();\n" +
|
66
62
|
" }\n" +
|
67
63
|
"";
|
68
64
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
65
|
+
functions +=
|
66
|
+
" function deselectInputField(elem) {\n" +
|
67
|
+
" fireHTMLEvent(elem, 'change');\n" +
|
68
|
+
" fireHTMLEvent(elem, 'blur');\n" +
|
69
|
+
" }\n" +
|
70
|
+
"";
|
75
71
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
}
|
82
|
-
});
|
72
|
+
webView.loadUrl("javascript:(function() {" +
|
73
|
+
functions +
|
74
|
+
"var elem = document.querySelector(\"" + cssSelector + "\"); selectInputField(elem); enterTextIntoInputField(elem, '" + value + "'); deselectInputField(elem); " +
|
75
|
+
"prompt('calabash:true');" +
|
76
|
+
"})()");
|
83
77
|
|
84
78
|
String r = ccc.getResult();
|
85
79
|
System.out.println("enterTextIntoInputField: " + r);
|
@@ -18,7 +18,7 @@ public class ExecuteAsyncJavascript implements Action {
|
|
18
18
|
}
|
19
19
|
|
20
20
|
CalabashChromeClient ccc = list.get(0);
|
21
|
-
|
21
|
+
WebView webView = ccc.getWebView();
|
22
22
|
final String script = "javascript:(function() {"
|
23
23
|
+ " function cb(ret) {"
|
24
24
|
+ " prompt('calabash:'+ret);"
|
@@ -33,14 +33,8 @@ public class ExecuteAsyncJavascript implements Action {
|
|
33
33
|
+ "}())";
|
34
34
|
|
35
35
|
System.out.println("execute javascript: " + script);
|
36
|
-
|
37
|
-
|
38
|
-
new Runnable() {
|
39
|
-
@Override
|
40
|
-
public void run() {
|
41
|
-
webView.loadUrl(script);
|
42
|
-
}
|
43
|
-
});
|
36
|
+
|
37
|
+
webView.loadUrl(script);
|
44
38
|
|
45
39
|
String r = ccc.getResult();
|
46
40
|
System.out.println("javascript result: " + r);
|
@@ -18,28 +18,21 @@ public class ExecuteJavascript implements Action {
|
|
18
18
|
}
|
19
19
|
|
20
20
|
CalabashChromeClient ccc = list.get(0);
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
21
|
+
WebView webView = ccc.getWebView();
|
22
|
+
String script = "javascript:(function() {"
|
23
|
+
+ " var r;"
|
24
|
+
+ " try {"
|
25
|
+
+ " r = (function() {"
|
26
|
+
+ args[0] + ";"
|
27
|
+
+ " }());"
|
28
|
+
+ " } catch (e) {"
|
29
|
+
+ " r = 'Exception: ' + e;"
|
30
|
+
+ " }"
|
31
|
+
+ " prompt('calabash:'+r);"
|
32
|
+
+ "}())";
|
33
33
|
|
34
34
|
System.out.println("execute javascript: " + script);
|
35
|
-
|
36
|
-
InstrumentationBackend.solo.getCurrentActivity().runOnUiThread(
|
37
|
-
new Runnable() {
|
38
|
-
@Override
|
39
|
-
public void run() {
|
40
|
-
webView.loadUrl(script);
|
41
|
-
}
|
42
|
-
});
|
35
|
+
webView.loadUrl(script);
|
43
36
|
|
44
37
|
String r = ccc.getResult();
|
45
38
|
System.out.println("javascript result: " + r);
|
@@ -9,9 +9,8 @@ public class GetLoadProgress implements Action {
|
|
9
9
|
@Override
|
10
10
|
public Result execute(String... args) {
|
11
11
|
CalabashChromeClient ccc = CalabashChromeClient.findAndPrepareWebViews().get(0);
|
12
|
-
|
13
|
-
|
14
|
-
return new Result(true, "" + p);
|
12
|
+
WebView webView = ccc.getWebView();
|
13
|
+
return new Result(true, "" + webView.getProgress());
|
15
14
|
}
|
16
15
|
|
17
16
|
@Override
|
@@ -13,24 +13,18 @@ public class PressByCssSelector implements Action {
|
|
13
13
|
@Override
|
14
14
|
public Result execute(final String... args) {
|
15
15
|
for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
" prompt('calabash:true');" +
|
29
|
-
"}" +
|
30
|
-
"prompt('calabash:false');" +
|
31
|
-
"})()");
|
32
|
-
}
|
33
|
-
});
|
16
|
+
WebView webView = ccc.getWebView();
|
17
|
+
|
18
|
+
webView.loadUrl("javascript:(function() {" +
|
19
|
+
"var element = document.querySelector(\"" + args[0] + "\");" +
|
20
|
+
"if (element != null) {" +
|
21
|
+
" var oEvent = document.createEvent ('MouseEvent');" +
|
22
|
+
" oEvent.initMouseEvent('click', true, true,window, 1, 1, 1, 1, 1, false, false, false, false, 0, element);" +
|
23
|
+
" element.dispatchEvent( oEvent );" +
|
24
|
+
" prompt('calabash:true');" +
|
25
|
+
"}" +
|
26
|
+
"prompt('calabash:false');" +
|
27
|
+
"})()");
|
34
28
|
|
35
29
|
String r = ccc.getResult();
|
36
30
|
System.out.println("clickOnSelector: " + r);
|
@@ -8,6 +8,7 @@ import java.lang.reflect.Field;
|
|
8
8
|
import java.util.HashMap;
|
9
9
|
import java.util.List;
|
10
10
|
import java.util.Map;
|
11
|
+
import java.util.concurrent.atomic.AtomicReference;
|
11
12
|
|
12
13
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
13
14
|
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
@@ -15,10 +16,10 @@ import android.webkit.WebView;
|
|
15
16
|
|
16
17
|
public class QueryHelper {
|
17
18
|
|
18
|
-
|
19
|
+
public static String executeJavascriptInWebview(String scriptPath, String... args) {
|
19
20
|
|
20
21
|
String script = readJavascriptFromAsset(scriptPath);
|
21
|
-
|
22
|
+
|
22
23
|
for (String arg : args) {
|
23
24
|
script = script.replaceFirst("%@", arg);
|
24
25
|
}
|
@@ -27,14 +28,8 @@ public class QueryHelper {
|
|
27
28
|
List<CalabashChromeClient> webViews = CalabashChromeClient.findAndPrepareWebViews();
|
28
29
|
|
29
30
|
for (CalabashChromeClient ccc : webViews) {
|
30
|
-
|
31
|
-
|
32
|
-
@Override
|
33
|
-
public void run() {
|
34
|
-
webView.loadUrl("javascript:calabash_result = " + myScript + ";prompt('calabash:' + calabash_result);");
|
35
|
-
}
|
36
|
-
});
|
37
|
-
|
31
|
+
WebView webView = ccc.getWebView();
|
32
|
+
webView.loadUrl("javascript:calabash_result = " + myScript + ";prompt('calabash:' + calabash_result);");
|
38
33
|
return ccc.getResult();
|
39
34
|
}
|
40
35
|
throw new RuntimeException("No webviews found");
|
@@ -56,8 +51,11 @@ public class QueryHelper {
|
|
56
51
|
CalabashChromeClient calabashChromeClient = CalabashChromeClient.findAndPrepareWebViews().get(0);
|
57
52
|
|
58
53
|
WebView webView = calabashChromeClient.getWebView();
|
59
|
-
|
60
|
-
|
54
|
+
|
55
|
+
|
56
|
+
float scale = webView.getScale();
|
57
|
+
|
58
|
+
|
61
59
|
System.out.println("scale: " + scale);
|
62
60
|
int[] webviewLocation = new int[2];
|
63
61
|
webView.getLocationOnScreen(webviewLocation);
|
@@ -60,7 +60,7 @@ public class ScrollTo implements Action {
|
|
60
60
|
WebView webView = calabashChromeClient.getWebView();
|
61
61
|
int windowTop = webView.getScrollY();
|
62
62
|
int windowBottom = webView.getScrollY() + webView.getHeight();
|
63
|
-
int centerY = (int) ((Integer)rectangle.get("center_y") *
|
63
|
+
int centerY = (int) ((Integer)rectangle.get("center_y") * webView.getScale());
|
64
64
|
|
65
65
|
return windowTop < centerY && centerY < windowBottom;
|
66
66
|
}
|
@@ -17,22 +17,14 @@ public class SetPropertyByCssSelector implements Action {
|
|
17
17
|
String value = args[2];
|
18
18
|
|
19
19
|
for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
|
20
|
-
|
20
|
+
WebView webView = ccc.getWebView();
|
21
21
|
|
22
22
|
final String assignment = "document.querySelector(\"" + cssSelector + "\")." + propertyName + " = " + value + ";";
|
23
23
|
System.out.println(assignment);
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
webView.loadUrl("javascript:(function() {" +
|
30
|
-
assignment +
|
31
|
-
"prompt('calabash:true');" +
|
32
|
-
"})()");
|
33
|
-
|
34
|
-
}
|
35
|
-
});
|
24
|
+
webView.loadUrl("javascript:(function() {" +
|
25
|
+
assignment +
|
26
|
+
"prompt('calabash:true');" +
|
27
|
+
"})()");
|
36
28
|
String r = ccc.getResult();
|
37
29
|
System.out.println("setPropertyByCssSelector: " + r);
|
38
30
|
if ("true".equals(r)) {
|
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.3.
|
4
|
+
version: 0.3.3.pre5
|
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-
|
12
|
+
date: 2012-11-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- Rakefile
|
107
107
|
- bin/calabash-android
|
108
108
|
- bin/calabash-android-build.rb
|
109
|
+
- bin/calabash-android-console.rb
|
109
110
|
- bin/calabash-android-generate.rb
|
110
111
|
- bin/calabash-android-helpers.rb
|
111
112
|
- bin/calabash-android-run.rb
|
@@ -113,14 +114,13 @@ files:
|
|
113
114
|
- calabash-android.gemspec
|
114
115
|
- doc/calabash-android-help.txt
|
115
116
|
- epl-v10.html
|
116
|
-
- features-skeleton/.irbrc
|
117
|
-
- features-skeleton/irb_android.sh
|
118
117
|
- features-skeleton/my_first.feature
|
119
118
|
- features-skeleton/step_definitions/calabash_steps.rb
|
120
119
|
- features-skeleton/support/app_installation_hooks.rb
|
121
120
|
- features-skeleton/support/app_life_cycle_hooks.rb
|
122
121
|
- features-skeleton/support/env.rb
|
123
122
|
- features-skeleton/support/hooks.rb
|
123
|
+
- irbrc
|
124
124
|
- lib/calabash-android.rb
|
125
125
|
- lib/calabash-android/calabash_steps.rb
|
126
126
|
- lib/calabash-android/canned_steps.md
|
@@ -199,6 +199,7 @@ files:
|
|
199
199
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/L10nHelper.java
|
200
200
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/PressElement.java
|
201
201
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/l10n/WaitForElement.java
|
202
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListData.java
|
202
203
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemProperties.java
|
203
204
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemText.java
|
204
205
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/LongPressListItems.java
|
@@ -1,22 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
TEST_SERVER_PORT=34777
|
3
|
-
PACKAGE_NAME=$1
|
4
|
-
MAIN_ACTIVITY=$2
|
5
|
-
if [ -z "$PACKAGE_NAME" ]; then
|
6
|
-
echo 'The parameter about your mobile app package is missing: e.g. com.springsource.greenhouse.test'
|
7
|
-
exit 1
|
8
|
-
fi
|
9
|
-
|
10
|
-
if [ -z "$MAIN_ACTIVITY" ]; then
|
11
|
-
echo 'The parameter about your mobile app main activity is missing: e.g. com.springsource.greenhouse.MainActivity'
|
12
|
-
exit 1
|
13
|
-
fi
|
14
|
-
|
15
|
-
# use this line for calabash version 0.1
|
16
|
-
# adb shell am instrument -e class sh.calaba.instrumentationbackend.InstrumentationBackend -w $PACKAGE_NAME/android.test.InstrumentationTestRunner &
|
17
|
-
# use this for calabash-version 0.2
|
18
|
-
# adb shell am instrument -e class sh.calaba.instrumentationbackend.InstrumentationBackend -w $PACKAGE_NAME/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner &
|
19
|
-
#use this for calabash version 0.3
|
20
|
-
#adb shell am instrument -e target_package $PACKAGE_NAME -e main_activity $MAIN_ACTIVITY -e class sh.calaba.instrumentationbackend.InstrumentationBackend sh.calaba.android.test/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner
|
21
|
-
#sleep 7
|
22
|
-
IRBRC=.irbrc TEST_SERVER_PORT=$TEST_SERVER_PORT PACKAGE_NAME=$PACKAGE_NAME MAIN_ACTIVITY=$MAIN_ACTIVITY irb
|