calabash-android 0.4.0.pre6 → 0.4.0.pre7

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.
Files changed (50) hide show
  1. data/bin/calabash-android +7 -0
  2. data/bin/calabash-android-build.rb +1 -1
  3. data/bin/calabash-android-console.rb +1 -1
  4. data/bin/calabash-android-run.rb +1 -1
  5. data/calabash-android.gemspec +1 -0
  6. data/irbrc +2 -0
  7. data/lib/calabash-android/helpers.rb +4 -2
  8. data/lib/calabash-android/lib/TestServer.apk +0 -0
  9. data/lib/calabash-android/operations.rb +31 -22
  10. data/lib/calabash-android/version.rb +1 -1
  11. data/test-server/instrumentation-backend/.classpath +0 -1
  12. data/test-server/instrumentation-backend/antlr/UIQuery.g +11 -2
  13. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +4 -3
  14. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +95 -0
  15. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +7 -1
  16. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +15 -23
  17. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +13 -10
  18. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +136 -36
  19. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +38 -18
  20. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +38 -16
  21. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +94 -66
  22. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +55 -33
  23. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +54 -31
  24. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +44 -0
  25. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +52 -27
  26. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +39 -32
  27. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +56 -41
  28. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +50 -25
  29. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +19 -22
  30. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +40 -0
  31. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +201 -0
  32. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +7 -0
  33. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +56 -0
  34. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +144 -72
  35. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +15 -12
  36. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +22 -0
  37. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +38 -11
  38. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +226 -109
  39. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +237 -84
  40. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +100 -0
  41. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
  42. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +26 -22
  43. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +170 -102
  44. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +54 -155
  45. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +97 -2
  46. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
  47. metadata +27 -5
  48. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +0 -24
  49. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +0 -44
  50. data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +0 -134
@@ -1,50 +1,72 @@
1
1
  package sh.calaba.instrumentationbackend.actions.webview;
2
2
 
3
+ import java.util.ArrayList;
3
4
  import java.util.List;
5
+ import java.util.concurrent.Callable;
4
6
 
5
- import sh.calaba.instrumentationbackend.InstrumentationBackend;
6
7
  import sh.calaba.instrumentationbackend.Result;
7
8
  import sh.calaba.instrumentationbackend.actions.Action;
9
+ import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
10
+ import sh.calaba.instrumentationbackend.query.ast.UIQueryUtils;
8
11
  import android.webkit.WebView;
9
12
 
10
13
  public class ExecuteAsyncJavascript implements Action {
11
14
 
15
+ @SuppressWarnings({ "unchecked", "rawtypes" })
12
16
  @Override
13
17
  public Result execute(String... args) {
18
+ final String scriptCode = args[0];
19
+ List<WebFuture> webResults = (List<WebFuture>) UIQueryUtils.evaluateSyncInMainThread(new Callable() {
20
+
21
+ public Object call() throws Exception {
22
+
23
+ List<WebFuture> webResults = new ArrayList();
24
+ List<CalabashChromeClient> list = CalabashChromeClient.findAndPrepareWebViews();
25
+ if (list.isEmpty()) {
26
+ return webResults;
27
+ }
28
+
29
+ CalabashChromeClient ccc = list.get(0);
30
+ WebView webView = ccc.getWebView();
31
+ final String script = "javascript:(function() {"
32
+ + " function cb(ret) {"
33
+ + " prompt('calabash:'+ret);"
34
+ + " }"
35
+ + " try {"
36
+ + " (function(returnValue) {"
37
+ + scriptCode + ";"
38
+ + " }(cb));"
39
+ + " } catch (e) {"
40
+ + " prompt('calabash:Exception: ' + e);"
41
+ + " }"
42
+ + "}())";
14
43
 
15
- List<CalabashChromeClient> list = CalabashChromeClient.findAndPrepareWebViews();
16
- if (list.isEmpty()) {
17
- return new Result(false, "No WebView component found");
18
- }
44
+ System.out.println("execute javascript: " + script);
45
+
46
+ webView.loadUrl(script);
47
+ webResults.add(ccc.getResult());
48
+ return webResults;
49
+
50
+ }
51
+ });
52
+
53
+ List<String> allResults = new ArrayList<String>(webResults.size());
54
+ boolean success = true;
55
+ for (WebFuture f : webResults) {
56
+ String result = f.getAsString();
57
+ allResults.add(result);
58
+ if (result.startsWith("Exception:")) {
59
+ success = false;
60
+ }
61
+ }
62
+
63
+ if (allResults.size() == 0) {
64
+ return new Result(false, "No WebView found");
65
+ }
66
+ else {
67
+ return new Result(success, allResults);
68
+ }
19
69
 
20
- CalabashChromeClient ccc = list.get(0);
21
- WebView webView = ccc.getWebView();
22
- final String script = "javascript:(function() {"
23
- + " function cb(ret) {"
24
- + " prompt('calabash:'+ret);"
25
- + " }"
26
- + " try {"
27
- + " (function(returnValue) {"
28
- + args[0] + ";"
29
- + " }(cb));"
30
- + " } catch (e) {"
31
- + " prompt('calabash:Exception: ' + e);"
32
- + " }"
33
- + "}())";
34
-
35
- System.out.println("execute javascript: " + script);
36
-
37
- webView.loadUrl(script);
38
-
39
- String r = ccc.getResult();
40
- System.out.println("javascript result: " + r);
41
-
42
- boolean success = true;
43
- if (r.startsWith("Exception:")) {
44
- success = false;
45
- }
46
-
47
- return new Result(success, r);
48
70
  }
49
71
 
50
72
  @Override
@@ -1,48 +1,71 @@
1
1
  package sh.calaba.instrumentationbackend.actions.webview;
2
2
 
3
+ import java.util.ArrayList;
3
4
  import java.util.List;
5
+ import java.util.concurrent.Callable;
4
6
 
5
- import sh.calaba.instrumentationbackend.InstrumentationBackend;
6
7
  import sh.calaba.instrumentationbackend.Result;
7
8
  import sh.calaba.instrumentationbackend.actions.Action;
9
+ import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
10
+ import sh.calaba.instrumentationbackend.query.ast.UIQueryUtils;
8
11
  import android.webkit.WebView;
9
12
 
10
13
  public class ExecuteJavascript implements Action {
11
14
 
15
+ @SuppressWarnings({ "unchecked", "rawtypes" })
12
16
  @Override
13
17
  public Result execute(String... args) {
18
+ final String scriptCode = args[0];
19
+ List<WebFuture> webResults = (List<WebFuture>) UIQueryUtils.evaluateSyncInMainThread(new Callable() {
20
+
21
+ public Object call() throws Exception {
22
+
23
+ List<WebFuture> webResults = new ArrayList();
24
+ List<CalabashChromeClient> list = CalabashChromeClient.findAndPrepareWebViews();
25
+ if (list.isEmpty()) {
26
+ return webResults;
27
+ }
28
+
29
+ CalabashChromeClient ccc = list.get(0);
30
+ WebView webView = ccc.getWebView();
31
+ final String script = "javascript:(function() {"
32
+ + " function cb(ret) {"
33
+ + " prompt('calabash:'+ret);"
34
+ + " }"
35
+ + " try {"
36
+ + " (function(returnValue) {"
37
+ + scriptCode + ";"
38
+ + " }(cb));"
39
+ + " } catch (e) {"
40
+ + " prompt('calabash:Exception: ' + e);"
41
+ + " }"
42
+ + "}())";
14
43
 
15
- List<CalabashChromeClient> list = CalabashChromeClient.findAndPrepareWebViews();
16
- if (list.isEmpty()) {
17
- return new Result(false, "No WebView component found");
18
- }
19
-
20
- CalabashChromeClient ccc = list.get(0);
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
-
34
- System.out.println("execute javascript: " + script);
35
- webView.loadUrl(script);
36
-
37
- String r = ccc.getResult();
38
- System.out.println("javascript result: " + r);
39
-
40
- boolean success = true;
41
- if (r.startsWith("Exception:")) {
42
- success = false;
43
- }
44
+ System.out.println("execute javascript: " + script);
44
45
 
45
- return new Result(success, r);
46
+ webView.loadUrl(script);
47
+ webResults.add(ccc.getResult());
48
+ return webResults;
49
+
50
+ }
51
+ });
52
+
53
+ List<String> allResults = new ArrayList<String>(webResults.size());
54
+ boolean success = true;
55
+ for (WebFuture f : webResults) {
56
+ String result = f.getAsString();
57
+ allResults.add(result);
58
+ if (result.startsWith("Exception:")) {
59
+ success = false;
60
+ }
61
+ }
62
+
63
+ if (allResults.size() == 0) {
64
+ return new Result(false, "No WebView found");
65
+ }
66
+ else {
67
+ return new Result(success, allResults);
68
+ }
46
69
  }
47
70
 
48
71
  @Override
@@ -0,0 +1,44 @@
1
+ package sh.calaba.instrumentationbackend.actions.webview;
2
+
3
+ import sh.calaba.instrumentationbackend.query.Operation;
4
+
5
+ public class JavaScriptOperation implements Operation {
6
+
7
+ public final String script;
8
+ public final String arg;
9
+
10
+ public JavaScriptOperation(String script, String args) {
11
+ this.script = script;
12
+ this.arg = args;
13
+ }
14
+
15
+ @SuppressWarnings("unchecked")
16
+ @Override
17
+ public Object apply(Object o) {
18
+ throw new UnsupportedOperationException("asd");
19
+ /*
20
+ Map<String, Object> domEl = (Map<String, Object>) o;
21
+
22
+ WebView webView = (WebView) domEl.get("webView");
23
+
24
+ domEl.remove("class");
25
+ domEl.remove("html");
26
+ domEl.remove("webView");
27
+
28
+ String elJson = QueryHelper.toJsonString(domEl);
29
+
30
+
31
+ WebFuture asyncRes = QueryHelper.executeAsyncJavascriptInWebviews(webView, this.script,
32
+ elJson, this.arg);
33
+ return asyncRes.getAsString();
34
+ */
35
+ }
36
+
37
+ @Override
38
+ public String getName() {
39
+ return "JSOp[script="+this.script+"]";
40
+ }
41
+
42
+
43
+
44
+ }
@@ -1,40 +1,65 @@
1
1
  package sh.calaba.instrumentationbackend.actions.webview;
2
2
 
3
3
 
4
- import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import java.util.ArrayList;
5
+ import java.util.List;
6
+ import java.util.concurrent.Callable;
7
+
5
8
  import sh.calaba.instrumentationbackend.Result;
6
- import sh.calaba.instrumentationbackend.TestHelpers;
7
9
  import sh.calaba.instrumentationbackend.actions.Action;
10
+ import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
11
+ import sh.calaba.instrumentationbackend.query.ast.UIQueryUtils;
8
12
  import android.webkit.WebView;
9
13
 
10
-
14
+ @Deprecated
11
15
  public class PressByCssSelector implements Action {
12
16
 
13
- @Override
17
+ @SuppressWarnings({ "unchecked", "rawtypes" })
18
+ @Override
14
19
  public Result execute(final String... args) {
15
- for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
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
- "})()");
28
-
29
- String r = ccc.getResult();
30
- System.out.println("clickOnSelector: " + r);
31
- if ("true".equals(r)) {
32
- TestHelpers.wait(0.3);
33
- return Result.successResult();
34
- }
35
- }
36
-
37
- return new Result(false,"No WebView Found");
20
+ List<WebFuture> webResults = (List<WebFuture>) UIQueryUtils.evaluateSyncInMainThread(new Callable() {
21
+
22
+ public Object call() throws Exception {
23
+
24
+ List<WebFuture> webResults = new ArrayList();
25
+ for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
26
+ WebView webView = ccc.getWebView();
27
+
28
+ webView.loadUrl("javascript:(function() {" +
29
+ "var element = document.querySelector(\"" + args[0] + "\");" +
30
+ "if (element != null) {" +
31
+ " var oEvent = document.createEvent ('MouseEvent');" +
32
+ " oEvent.initMouseEvent('click', true, true,window, 1, 1, 1, 1, 1, false, false, false, false, 0, element);" +
33
+ " element.dispatchEvent( oEvent );" +
34
+ " prompt('calabash:true');" +
35
+ " return;" +
36
+ "}" +
37
+ "prompt('calabash:false');" +
38
+ "})()");
39
+
40
+ webResults.add(ccc.getResult());
41
+ }
42
+ return webResults;
43
+
44
+ }
45
+ });
46
+
47
+ List<String> allResults = new ArrayList<String>(webResults.size());
48
+ boolean success = false;
49
+ for (WebFuture f : webResults) {
50
+ String result = f.getAsString();
51
+ allResults.add(result);
52
+ if ("true".equals(result)) {
53
+ success = true;
54
+ }
55
+ }
56
+
57
+ if (allResults.size() == 0) {
58
+ return new Result(false, "No WebView found");
59
+ }
60
+ else {
61
+ return new Result(success, allResults);
62
+ }
38
63
  }
39
64
 
40
65
  @Override
@@ -4,36 +4,17 @@ import java.io.BufferedReader;
4
4
  import java.io.IOException;
5
5
  import java.io.InputStream;
6
6
  import java.io.InputStreamReader;
7
- import java.lang.reflect.Field;
8
7
  import java.util.HashMap;
9
8
  import java.util.List;
10
9
  import java.util.Map;
11
- import java.util.concurrent.atomic.AtomicReference;
12
10
 
13
11
  import sh.calaba.instrumentationbackend.InstrumentationBackend;
12
+ import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
14
13
  import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
15
14
  import android.webkit.WebView;
16
15
 
17
16
  public class QueryHelper {
18
17
 
19
- public static String executeJavascriptInWebview(String scriptPath, String... args) {
20
-
21
- String script = readJavascriptFromAsset(scriptPath);
22
-
23
- for (String arg : args) {
24
- script = script.replaceFirst("%@", arg);
25
- }
26
-
27
- final String myScript = script;
28
- List<CalabashChromeClient> webViews = CalabashChromeClient.findAndPrepareWebViews();
29
-
30
- for (CalabashChromeClient ccc : webViews) {
31
- WebView webView = ccc.getWebView();
32
- webView.loadUrl("javascript:calabash_result = " + myScript + ";prompt('calabash:' + calabash_result);");
33
- return ccc.getResult();
34
- }
35
- throw new RuntimeException("No webviews found");
36
- }
37
18
 
38
19
  @SuppressWarnings("unchecked")
39
20
  public static Map<String, Object> findFirstVisibleRectangle(List<HashMap<String,Object>> elements) {
@@ -45,25 +26,36 @@ public class QueryHelper {
45
26
  return (Map<String, Object>)elements.get(0);
46
27
  }
47
28
 
48
- public static float[] getScreenCoordinatesForCenter(Map<String, Object> rectangle) {
29
+ public static float translateCoordToScreen(int offset, float scale, Object point) {
30
+ return offset + ((Number)point).floatValue() *scale;
31
+ }
32
+
33
+ public static Map<String, Object> translateRectToScreenCoordinates(WebView webView, Map<String, Object> rectangle) {
49
34
  try {
50
35
 
51
- CalabashChromeClient calabashChromeClient = CalabashChromeClient.findAndPrepareWebViews().get(0);
52
-
53
- WebView webView = calabashChromeClient.getWebView();
54
-
55
-
56
36
  float scale = webView.getScale();
57
37
 
58
-
59
- System.out.println("scale: " + scale);
60
38
  int[] webviewLocation = new int[2];
61
39
  webView.getLocationOnScreen(webviewLocation);
40
+ //center_x, center_y
41
+ //left, top, width, height
42
+ float center_x = translateCoordToScreen(webviewLocation[0], scale,
43
+ rectangle.get("center_x"));
44
+ float center_y = translateCoordToScreen(webviewLocation[1], scale,
45
+ rectangle.get("center_y"));
46
+
47
+ float x = translateCoordToScreen(webviewLocation[0], scale, rectangle.get("left"));
48
+ float y = translateCoordToScreen(webviewLocation[0], scale, rectangle.get("top"));
49
+ Map<String,Object> result = new HashMap<String, Object>(rectangle);
62
50
 
63
- //TODO: Exception if center_x or center_y are not numbers
64
- float x = webviewLocation[0] + ((Number)rectangle.get("center_x")).floatValue() * scale;
65
- float y = webviewLocation[1] + ((Number)rectangle.get("center_y")).floatValue() * scale;
66
- return new float[]{x, y};
51
+ result.put("x",x);
52
+ result.put("y",y);
53
+ result.put("center_x",center_x);
54
+ result.put("center_y",center_y);
55
+
56
+ return result;
57
+
58
+
67
59
  } catch (Exception e) {
68
60
  throw new RuntimeException(e);
69
61
  }
@@ -94,4 +86,19 @@ public class QueryHelper {
94
86
  }
95
87
  return script.toString();
96
88
  }
89
+
90
+ public static WebFuture executeAsyncJavascriptInWebviews(WebView webView,
91
+ String scriptPath, String selector, String type) {
92
+
93
+ String script = readJavascriptFromAsset(scriptPath);
94
+
95
+ script = script.replaceFirst("%@", selector);
96
+ script = script.replaceFirst("%@", type);
97
+
98
+ CalabashChromeClient chromeClient = CalabashChromeClient.prepareWebView(webView);
99
+ webView.loadUrl("javascript:calabash_result = " + script + ";prompt('calabash:' + calabash_result);");
100
+ return chromeClient.getResult();
101
+ }
102
+
103
+
97
104
  }