calabash-android 0.4.0.pre6 → 0.4.0.pre7

Sign up to get free protection for your applications and to get access to all the features.
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
  }