calabash-android 0.4.9.pre2 → 0.4.9.pre3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|