calabash-android 0.4.9.pre2 → 0.4.9.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.
- checksums.yaml +4 -4
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/ViewDump.java +53 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +2 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +161 -27
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7382b7dab96dabda3ddc20acc43dcf35dd064673
|
4
|
+
data.tar.gz: db95474aa5d4d4a16e5226da72c1e961d880666e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 066c58155a9d3e3c0a63384340c0e2998fa19fdb75521ccbb0020bfd12acd2e316fb519a0da7400ee024bb150ae1bea0d63f3ab0e4a8d58b7f69e55e9f64d9d0
|
7
|
+
data.tar.gz: fe8ccf72731d38737eadccc1ee3ab10535f3e3c44098e409f49081d092b6d45abff9bf2112a8b5dcb9d5815584f6ffe5df4bab27db03deb1b97df7b5082f48b7
|
Binary file
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/ViewDump.java
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
package sh.calaba.instrumentationbackend.actions;
|
2
2
|
|
3
|
+
import java.io.IOException;
|
3
4
|
import java.util.ArrayList;
|
5
|
+
import java.util.Collection;
|
4
6
|
import java.util.List;
|
5
7
|
import java.util.Map;
|
6
8
|
import java.util.concurrent.Callable;
|
9
|
+
import java.util.concurrent.ExecutionException;
|
10
|
+
import java.util.concurrent.Future;
|
11
|
+
import java.util.concurrent.TimeUnit;
|
12
|
+
import java.util.concurrent.TimeoutException;
|
7
13
|
import java.util.concurrent.atomic.AtomicReference;
|
8
14
|
|
15
|
+
import sh.calaba.instrumentationbackend.json.JSONUtils;
|
16
|
+
import sh.calaba.instrumentationbackend.query.ast.DoubleFuture;
|
9
17
|
import sh.calaba.instrumentationbackend.query.ast.UIQueryUtils;
|
18
|
+
import sh.calaba.org.codehaus.jackson.JsonParseException;
|
19
|
+
import sh.calaba.org.codehaus.jackson.map.JsonMappingException;
|
20
|
+
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
21
|
+
import android.util.Log;
|
10
22
|
|
11
23
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
12
24
|
public class ViewDump {
|
@@ -37,13 +49,51 @@ public class ViewDump {
|
|
37
49
|
|
38
50
|
private Map<?, ?> sameTreeWithoutElements(Map<?, ?> dump) {
|
39
51
|
Map node = UIQueryUtils.mapWithElAsNull(dump);
|
40
|
-
List
|
52
|
+
List nodeChildren = (List) node.get("children");
|
41
53
|
List<Map> childrenNoEl = new ArrayList<Map>(nodeChildren.size());
|
42
|
-
|
43
|
-
|
54
|
+
|
55
|
+
for (Object child : nodeChildren) {
|
56
|
+
if (child instanceof Map) {
|
57
|
+
childrenNoEl.add(sameTreeWithoutElements((Map)child));
|
58
|
+
}
|
59
|
+
else {
|
60
|
+
Log.i("Calabash", child.toString());
|
61
|
+
Future webResults = (Future) child;
|
62
|
+
|
63
|
+
try {
|
64
|
+
Map webResultsMap = (Map) webResults.get(10,TimeUnit.SECONDS);
|
65
|
+
String json = (String) webResultsMap.get("result");
|
66
|
+
ObjectMapper mapper = new ObjectMapper();
|
67
|
+
List jsonResults = mapper.readValue(json, List.class);
|
68
|
+
for(Object m : jsonResults) {
|
69
|
+
Map domElement = UIQueryUtils.mapWithElAsNull(UIQueryUtils.serializeViewToDump(m));
|
70
|
+
childrenNoEl.add(domElement);
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
} catch (InterruptedException e) {
|
75
|
+
|
76
|
+
} catch (ExecutionException e) {
|
77
|
+
|
78
|
+
} catch (TimeoutException e) {
|
79
|
+
|
80
|
+
} catch (JsonParseException e) {
|
81
|
+
// TODO Auto-generated catch block
|
82
|
+
e.printStackTrace();
|
83
|
+
throw new RuntimeException(e);
|
84
|
+
} catch (JsonMappingException e) {
|
85
|
+
// TODO Auto-generated catch block
|
86
|
+
e.printStackTrace();
|
87
|
+
} catch (IOException e) {
|
88
|
+
// TODO Auto-generated catch block
|
89
|
+
e.printStackTrace();
|
90
|
+
}
|
91
|
+
}
|
44
92
|
}
|
45
93
|
node.put("children",childrenNoEl);
|
46
94
|
return node;
|
95
|
+
|
96
|
+
|
47
97
|
}
|
48
98
|
|
49
99
|
|
@@ -11,6 +11,7 @@ import java.util.Map;
|
|
11
11
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
12
12
|
import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
|
13
13
|
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
14
|
+
import android.util.Log;
|
14
15
|
import android.webkit.WebView;
|
15
16
|
|
16
17
|
public class QueryHelper {
|
@@ -94,7 +95,7 @@ public class QueryHelper {
|
|
94
95
|
|
95
96
|
script = script.replaceFirst("%@", selector);
|
96
97
|
script = script.replaceFirst("%@", type);
|
97
|
-
|
98
|
+
|
98
99
|
CalabashChromeClient chromeClient = CalabashChromeClient.prepareWebView(webView);
|
99
100
|
webView.loadUrl("javascript:calabash_result = " + script + ";prompt('calabash:' + calabash_result);");
|
100
101
|
return chromeClient.getResult();
|
@@ -17,6 +17,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
|
17
17
|
import org.antlr.runtime.tree.CommonTree;
|
18
18
|
|
19
19
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
20
|
+
import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
|
20
21
|
import sh.calaba.instrumentationbackend.actions.webview.QueryHelper;
|
21
22
|
import sh.calaba.instrumentationbackend.query.CompletedFuture;
|
22
23
|
import sh.calaba.instrumentationbackend.query.Query;
|
@@ -25,6 +26,7 @@ import sh.calaba.instrumentationbackend.query.antlr.UIQueryParser;
|
|
25
26
|
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
26
27
|
import sh.calaba.org.codehaus.jackson.type.TypeReference;
|
27
28
|
import android.text.InputType;
|
29
|
+
import android.util.Log;
|
28
30
|
import android.view.View;
|
29
31
|
import android.webkit.WebView;
|
30
32
|
import android.widget.Button;
|
@@ -35,6 +37,7 @@ public class UIQueryUtils {
|
|
35
37
|
|
36
38
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
37
39
|
public static List subviews(Object o) {
|
40
|
+
|
38
41
|
try {
|
39
42
|
Method getChild = o.getClass().getMethod("getChildAt", int.class);
|
40
43
|
getChild.setAccessible(true);
|
@@ -59,6 +62,19 @@ public class UIQueryUtils {
|
|
59
62
|
|
60
63
|
}
|
61
64
|
|
65
|
+
@SuppressWarnings({ "rawtypes" })
|
66
|
+
public static Future webViewSubViews(WebView o) {
|
67
|
+
|
68
|
+
Log.i("Calabash", "About to webViewSubViews");
|
69
|
+
|
70
|
+
|
71
|
+
WebFuture controls = QueryHelper.executeAsyncJavascriptInWebviews(o,
|
72
|
+
"calabash.js", "input,button","css");
|
73
|
+
|
74
|
+
return controls;
|
75
|
+
|
76
|
+
}
|
77
|
+
|
62
78
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
63
79
|
public static List parents(Object o) {
|
64
80
|
try {
|
@@ -167,9 +183,11 @@ public class UIQueryUtils {
|
|
167
183
|
return ViewMapper.getIdForView(view);
|
168
184
|
}
|
169
185
|
|
170
|
-
@SuppressWarnings("rawtypes")
|
186
|
+
@SuppressWarnings({ "rawtypes", "unchecked" })
|
171
187
|
public static Future evaluateAsyncInMainThread(final Callable callable)
|
172
|
-
throws Exception {
|
188
|
+
throws Exception {
|
189
|
+
|
190
|
+
|
173
191
|
final AtomicReference<Future> result = new AtomicReference<Future>();
|
174
192
|
final AtomicReference<Exception> errorResult = new AtomicReference<Exception>();
|
175
193
|
|
@@ -300,17 +318,26 @@ public class UIQueryUtils {
|
|
300
318
|
|
301
319
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
302
320
|
protected static Map<?, ?> dumpRecursively(Map parentView,
|
303
|
-
List
|
321
|
+
List children) {
|
304
322
|
ArrayList childrenArray = new ArrayList(32);
|
305
323
|
for (int i = 0; i < children.size(); i++) {
|
306
|
-
|
324
|
+
Object view = children.get(i);
|
307
325
|
Map serializedChild = serializeViewToDump(view);
|
308
326
|
List<Integer> childPath = new ArrayList<Integer>(
|
309
327
|
(List) parentView.get("path"));
|
310
328
|
childPath.add(i);
|
311
329
|
serializedChild.put("path", childPath);
|
312
|
-
|
313
|
-
|
330
|
+
List childrenList = null;
|
331
|
+
if (view instanceof WebView) {
|
332
|
+
Future webViewSubViews = webViewSubViews((WebView) view);
|
333
|
+
childrenArray.add(webViewSubViews);
|
334
|
+
}
|
335
|
+
else {
|
336
|
+
childrenList = UIQueryUtils.subviews(view);
|
337
|
+
childrenArray.add(dumpRecursively(serializedChild,
|
338
|
+
childrenList));
|
339
|
+
}
|
340
|
+
|
314
341
|
}
|
315
342
|
|
316
343
|
parentView.put("children", childrenArray);
|
@@ -339,31 +366,138 @@ public class UIQueryUtils {
|
|
339
366
|
return currentView;
|
340
367
|
}
|
341
368
|
|
369
|
+
/*
|
370
|
+
*
|
371
|
+
"enabled" => true,
|
372
|
+
"visible" => true,
|
373
|
+
"children" => [],
|
374
|
+
"label" => nil,
|
375
|
+
"rect" => {
|
376
|
+
"center_y" => 158.5,
|
377
|
+
"center_x" => 300.0,
|
378
|
+
"height" => 25,
|
379
|
+
"y" => 146,
|
380
|
+
"width" => 600,
|
381
|
+
"x" => 0
|
382
|
+
},
|
383
|
+
"type" => "android.widget.TextView",
|
384
|
+
"id" => "FacebookTextView",
|
385
|
+
"el" => nil,
|
386
|
+
"name" => "",
|
387
|
+
"action" => nil,
|
388
|
+
"value" => "",
|
389
|
+
"path" => [
|
390
|
+
[0] 0,
|
391
|
+
[1] 0,
|
392
|
+
[2] 2,
|
393
|
+
[3] 0,
|
394
|
+
[4] 2
|
395
|
+
],
|
396
|
+
"hit-point" => {
|
397
|
+
"y" => 158.5,
|
398
|
+
"x" => 300.0
|
399
|
+
},
|
400
|
+
"entry_types" => [
|
401
|
+
[0] "0"
|
402
|
+
]
|
403
|
+
*/
|
342
404
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
343
|
-
public static Map<?, ?> serializeViewToDump(
|
344
|
-
if (
|
405
|
+
public static Map<?, ?> serializeViewToDump(Object viewOrMap) {
|
406
|
+
if (viewOrMap == null) {
|
345
407
|
return null;
|
346
408
|
}
|
409
|
+
|
410
|
+
if (viewOrMap instanceof Map)
|
411
|
+
{
|
412
|
+
Map map = (Map) viewOrMap;
|
413
|
+
map.put("el", map);
|
414
|
+
|
415
|
+
Map rect = (Map) map.get("rect");
|
416
|
+
Map hitPoint = extractHitPointFromRect(rect);
|
417
|
+
|
418
|
+
map.put("hit-point", hitPoint);
|
419
|
+
Map result = new HashMap();
|
420
|
+
result.put("type", "touch");
|
421
|
+
result.put("gesture", "tap");
|
422
|
+
map.put("action", result);
|
423
|
+
map.put("enabled", true);
|
424
|
+
map.put("visible", true);
|
425
|
+
String nodeName = (String) map.get("nodeName");
|
426
|
+
if (nodeName != null && nodeName.toLowerCase().equals("input")) {
|
427
|
+
String domType = extractDomType((String)map.get("html"));
|
428
|
+
map.put("domType", domType);
|
429
|
+
Log.i("Calabash - domtype", domType);
|
430
|
+
if (domType!=null && domType.equals("password")) {
|
431
|
+
map.put("entry_types", Collections.singletonList("password"));
|
432
|
+
}
|
433
|
+
else {
|
434
|
+
map.put("entry_types", Collections.singletonList("text"));
|
435
|
+
}
|
436
|
+
|
437
|
+
}
|
438
|
+
|
439
|
+
|
440
|
+
|
441
|
+
map.put("value", null);
|
442
|
+
map.put("type", "dom");
|
443
|
+
map.put("name", null);
|
444
|
+
map.put("label", null);
|
445
|
+
return map;
|
446
|
+
|
447
|
+
}
|
448
|
+
else
|
449
|
+
{
|
450
|
+
Map m = new HashMap();
|
451
|
+
|
452
|
+
View view = (View) viewOrMap;
|
453
|
+
m.put("id", getId(view));
|
454
|
+
m.put("el", view);
|
455
|
+
|
456
|
+
Map rect = ViewMapper.getRectForView(view);
|
457
|
+
Map hitPoint = extractHitPointFromRect(rect);
|
458
|
+
|
459
|
+
m.put("rect", rect);
|
460
|
+
m.put("hit-point", hitPoint);
|
461
|
+
m.put("action", actionForView(view));
|
462
|
+
m.put("enabled", view.isEnabled());
|
463
|
+
m.put("visible", isVisible(view));
|
464
|
+
m.put("entry_types", elementEntryTypes(view));
|
465
|
+
m.put("value", extractValueFromView(view));
|
466
|
+
m.put("type", ViewMapper.getClassNameForView(view));
|
467
|
+
m.put("name", getNameForView(view));
|
468
|
+
m.put("label", ViewMapper.getContentDescriptionForView(view));
|
469
|
+
return m;
|
470
|
+
}
|
471
|
+
|
472
|
+
|
473
|
+
|
474
|
+
|
475
|
+
}
|
347
476
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
477
|
+
public static String extractDomType(String string) {
|
478
|
+
String[] split = string.split("type=");
|
479
|
+
if (split.length > 1) {
|
480
|
+
String lastPart = split[1];
|
481
|
+
if (lastPart == null) {
|
482
|
+
return null;
|
483
|
+
}
|
484
|
+
if (lastPart.charAt(0) == '"' || lastPart.charAt(0) == '\'') {
|
485
|
+
int endIndex = -1;
|
486
|
+
for (int i=1;i<lastPart.length();i++) {
|
487
|
+
if (lastPart.charAt(i) == '\'' || lastPart.charAt(i) == '"') {
|
488
|
+
endIndex = i;
|
489
|
+
break;
|
490
|
+
}
|
491
|
+
}
|
492
|
+
|
493
|
+
if (endIndex > 0) {
|
494
|
+
return lastPart.substring(1,endIndex);
|
495
|
+
}
|
496
|
+
|
497
|
+
}
|
498
|
+
}
|
499
|
+
return null;
|
500
|
+
|
367
501
|
}
|
368
502
|
|
369
503
|
public static List<String> elementEntryTypes(View view) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-android
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.9.
|
4
|
+
version: 0.4.9.pre3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Maturana Larsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|