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.
- data/bin/calabash-android +7 -0
- data/bin/calabash-android-build.rb +1 -1
- data/bin/calabash-android-console.rb +1 -1
- data/bin/calabash-android-run.rb +1 -1
- data/calabash-android.gemspec +1 -0
- data/irbrc +2 -0
- data/lib/calabash-android/helpers.rb +4 -2
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +31 -22
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/instrumentation-backend/.classpath +0 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +11 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +4 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +95 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +7 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +15 -23
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +13 -10
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +136 -36
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +38 -18
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +38 -16
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +94 -66
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +55 -33
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +54 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +44 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +52 -27
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +39 -32
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +56 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +50 -25
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +19 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +40 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +201 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +7 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +56 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +144 -72
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +15 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +22 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +38 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +226 -109
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +237 -84
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +100 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +26 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +170 -102
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +54 -155
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +97 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
- metadata +27 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +0 -44
- data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +0 -134
@@ -1,11 +1,16 @@
|
|
1
1
|
package sh.calaba.instrumentationbackend.actions.webview;
|
2
2
|
|
3
|
-
import java.lang.reflect.Field;
|
4
3
|
import java.lang.reflect.Method;
|
5
4
|
import java.util.ArrayList;
|
5
|
+
import java.util.HashMap;
|
6
6
|
import java.util.List;
|
7
|
-
import java.util.
|
7
|
+
import java.util.Map;
|
8
|
+
import java.util.concurrent.ExecutionException;
|
9
|
+
import java.util.concurrent.Future;
|
10
|
+
import java.util.concurrent.TimeUnit;
|
11
|
+
import java.util.concurrent.TimeoutException;
|
8
12
|
|
13
|
+
import android.os.Looper;
|
9
14
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
10
15
|
import android.os.Build;
|
11
16
|
import android.os.ConditionVariable;
|
@@ -14,72 +19,167 @@ import android.webkit.JsPromptResult;
|
|
14
19
|
import android.webkit.WebChromeClient;
|
15
20
|
import android.webkit.WebView;
|
16
21
|
|
17
|
-
|
18
22
|
public class CalabashChromeClient extends WebChromeClient {
|
19
|
-
private final ConditionVariable eventHandled = new ConditionVariable();
|
20
|
-
private final Result result = new Result();
|
21
23
|
private WebChromeClient mWebChromeClient;
|
22
24
|
private final WebView webView;
|
25
|
+
private final WebFuture scriptFuture;
|
23
26
|
|
24
|
-
public CalabashChromeClient(WebView webView) {
|
27
|
+
public CalabashChromeClient(final WebView webView) {
|
25
28
|
this.webView = webView;
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
this.scriptFuture = new WebFuture(webView);
|
30
|
+
if (Build.VERSION.SDK_INT < 16) { // jelly bean
|
31
|
+
try {
|
32
|
+
Method methodGetConfiguration = webView.getClass().getMethod(
|
33
|
+
"getWebChromeClient");
|
34
|
+
mWebChromeClient = (WebChromeClient) methodGetConfiguration
|
35
|
+
.invoke(webView);
|
36
|
+
} catch (Exception e) {
|
37
|
+
throw new RuntimeException(e);
|
38
|
+
}
|
33
39
|
}
|
34
|
-
|
40
|
+
|
41
|
+
if ( Looper.getMainLooper().getThread() == Thread.currentThread()) {
|
42
|
+
webView.setWebChromeClient(this);
|
43
|
+
} else {
|
44
|
+
InstrumentationBackend.instrumentation.runOnMainSync(new Runnable() {
|
45
|
+
@Override
|
46
|
+
public void run() {
|
47
|
+
webView.setWebChromeClient(CalabashChromeClient.this);
|
48
|
+
}
|
49
|
+
});
|
50
|
+
}
|
35
51
|
}
|
36
52
|
|
37
53
|
@Override
|
38
|
-
public boolean onJsPrompt(WebView view, String url, String message,
|
54
|
+
public boolean onJsPrompt(WebView view, String url, String message,
|
55
|
+
String defaultValue, JsPromptResult r) {
|
39
56
|
if (message != null && message.startsWith("calabash:")) {
|
40
57
|
r.confirm("CALABASH_ACK");
|
41
58
|
System.out.println("onJsPrompt: " + message);
|
42
|
-
|
43
|
-
|
44
|
-
|
59
|
+
String jsonResponse = message.replaceFirst("calabash:", "");
|
60
|
+
try {
|
61
|
+
scriptFuture.setResult(jsonResponse);
|
62
|
+
} catch (Exception e) {
|
63
|
+
e.printStackTrace();
|
64
|
+
scriptFuture.setResult(null);
|
65
|
+
}
|
45
66
|
return true;
|
46
67
|
} else {
|
47
68
|
if (mWebChromeClient == null) {
|
48
69
|
r.confirm("CALABASH_ERROR");
|
70
|
+
scriptFuture.complete();
|
49
71
|
return true;
|
50
72
|
} else {
|
51
|
-
|
73
|
+
// TODO I'm not what this case does...
|
74
|
+
return mWebChromeClient.onJsPrompt(view, url, message,
|
75
|
+
defaultValue, r);
|
52
76
|
}
|
53
77
|
}
|
54
78
|
}
|
55
79
|
|
56
|
-
|
57
|
-
|
58
|
-
}
|
59
|
-
|
60
|
-
public String getResult() {
|
61
|
-
eventHandled.block(3000);
|
62
|
-
if (result.message == null) {
|
63
|
-
throw new RuntimeException("Timed out waiting for result for JavaScript");
|
64
|
-
}
|
65
|
-
return result.message;
|
80
|
+
public WebView getWebView() {
|
81
|
+
return webView;
|
66
82
|
}
|
67
83
|
|
68
|
-
|
69
|
-
|
84
|
+
public static CalabashChromeClient prepareWebView(WebView webView) {
|
85
|
+
CalabashChromeClient calabashChromeClient = new CalabashChromeClient(
|
86
|
+
webView);
|
87
|
+
webView.getSettings().setJavaScriptEnabled(true);
|
88
|
+
return calabashChromeClient;
|
70
89
|
}
|
71
90
|
|
72
91
|
public static List<CalabashChromeClient> findAndPrepareWebViews() {
|
73
92
|
List<CalabashChromeClient> webViews = new ArrayList<CalabashChromeClient>();
|
74
93
|
ArrayList<View> views = InstrumentationBackend.solo.getCurrentViews();
|
75
94
|
for (View view : views) {
|
76
|
-
if (
|
77
|
-
WebView webView = (WebView)view;
|
78
|
-
webViews.add(
|
79
|
-
webView.getSettings().setJavaScriptEnabled(true);
|
80
|
-
System.out.println("Setting CalabashChromeClient");
|
95
|
+
if (view instanceof WebView) {
|
96
|
+
WebView webView = (WebView) view;
|
97
|
+
webViews.add(prepareWebView(webView));
|
81
98
|
}
|
82
99
|
}
|
83
100
|
return webViews;
|
101
|
+
|
102
|
+
}
|
103
|
+
|
104
|
+
public WebFuture getResult() {
|
105
|
+
return scriptFuture;
|
106
|
+
}
|
107
|
+
|
108
|
+
@SuppressWarnings("rawtypes")
|
109
|
+
public static class WebFuture implements Future {
|
110
|
+
private final ConditionVariable eventHandled;
|
111
|
+
private volatile boolean complete;
|
112
|
+
private String result;
|
113
|
+
private final WebView webView;
|
114
|
+
|
115
|
+
public WebView getWebView() {
|
116
|
+
return webView;
|
117
|
+
}
|
118
|
+
|
119
|
+
public void complete() {
|
120
|
+
this.complete = true;
|
121
|
+
this.eventHandled.open();
|
122
|
+
}
|
123
|
+
|
124
|
+
public WebFuture(WebView webView) {
|
125
|
+
this.webView = webView;
|
126
|
+
eventHandled = new ConditionVariable();
|
127
|
+
result = null;
|
128
|
+
}
|
129
|
+
|
130
|
+
public synchronized void setResult(String result) {
|
131
|
+
this.result = result;
|
132
|
+
this.complete();
|
133
|
+
}
|
134
|
+
|
135
|
+
public synchronized String getResult() {
|
136
|
+
return this.result;
|
137
|
+
}
|
138
|
+
|
139
|
+
public boolean cancel(boolean mayInterruptIfRunning) {
|
140
|
+
return false;
|
141
|
+
}
|
142
|
+
|
143
|
+
@Override
|
144
|
+
public Object get() throws InterruptedException, ExecutionException {
|
145
|
+
eventHandled.block();
|
146
|
+
return asMap();
|
147
|
+
}
|
148
|
+
|
149
|
+
@Override
|
150
|
+
public Object get(long timeout, TimeUnit unit)
|
151
|
+
throws InterruptedException, ExecutionException,
|
152
|
+
TimeoutException {
|
153
|
+
eventHandled.block(unit.convert(timeout, TimeUnit.MILLISECONDS));
|
154
|
+
return asMap();
|
155
|
+
}
|
156
|
+
|
157
|
+
@Override
|
158
|
+
public boolean isCancelled() {
|
159
|
+
return false;
|
160
|
+
}
|
161
|
+
|
162
|
+
@Override
|
163
|
+
public boolean isDone() {
|
164
|
+
return complete;
|
165
|
+
}
|
166
|
+
|
167
|
+
public String getAsString() {
|
168
|
+
try {
|
169
|
+
get(10,TimeUnit.SECONDS);
|
170
|
+
return getResult();
|
171
|
+
} catch (Exception e) {
|
172
|
+
e.printStackTrace();
|
173
|
+
throw new RuntimeException(e);
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
@SuppressWarnings("unchecked")
|
178
|
+
public Map asMap() {
|
179
|
+
HashMap m = new HashMap();
|
180
|
+
m.put("webView", webView);
|
181
|
+
m.put("result",getResult());
|
182
|
+
return m;
|
183
|
+
}
|
84
184
|
}
|
85
185
|
}
|
@@ -1,31 +1,51 @@
|
|
1
1
|
package sh.calaba.instrumentationbackend.actions.webview;
|
2
2
|
|
3
3
|
|
4
|
-
import
|
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
9
|
import sh.calaba.instrumentationbackend.actions.Action;
|
10
|
+
import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
|
11
|
+
import sh.calaba.instrumentationbackend.query.ast.UIQueryUtils;
|
7
12
|
import android.webkit.WebView;
|
8
13
|
|
14
|
+
@Deprecated
|
9
15
|
public class DumpBodyHtml implements Action {
|
10
16
|
|
11
|
-
@
|
17
|
+
@SuppressWarnings({ "rawtypes", "unchecked" })
|
18
|
+
@Override
|
12
19
|
public Result execute(String... args) {
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
|
21
|
+
List<WebFuture> webResults = (List<WebFuture>) UIQueryUtils.evaluateSyncInMainThread(new Callable() {
|
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
|
+
webView.loadUrl("javascript:(function() {" +
|
28
|
+
"prompt('calabash:' + document.body.innerHTML);" +
|
29
|
+
"})()");
|
30
|
+
webResults.add(ccc.getResult());
|
31
|
+
}
|
32
|
+
return webResults;
|
33
|
+
|
34
|
+
}
|
35
|
+
});
|
36
|
+
|
37
|
+
List<String> allResults = new ArrayList<String>(webResults.size());
|
38
|
+
for (WebFuture f : webResults) {
|
39
|
+
allResults.add(f.getAsString());
|
40
|
+
}
|
41
|
+
|
42
|
+
if (allResults.size() == 0) {
|
43
|
+
return new Result(false, "No WebView found");
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
return new Result(true, allResults);
|
47
|
+
}
|
48
|
+
|
29
49
|
}
|
30
50
|
public String key() {
|
31
51
|
return "dump_body_html";
|
@@ -1,32 +1,54 @@
|
|
1
1
|
package sh.calaba.instrumentationbackend.actions.webview;
|
2
2
|
|
3
3
|
|
4
|
-
import
|
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
9
|
import sh.calaba.instrumentationbackend.actions.Action;
|
10
|
+
import sh.calaba.instrumentationbackend.actions.webview.CalabashChromeClient.WebFuture;
|
11
|
+
import sh.calaba.instrumentationbackend.query.ast.UIQueryUtils;
|
7
12
|
import android.webkit.WebView;
|
8
13
|
|
9
14
|
public class DumpHtml implements Action {
|
10
15
|
|
11
|
-
@
|
16
|
+
@SuppressWarnings({ "unchecked", "rawtypes" })
|
17
|
+
@Override
|
12
18
|
public Result execute(String... args) {
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
|
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
|
+
final WebView webView = ccc.getWebView();
|
27
|
+
webView.loadUrl("javascript:(function() {" +
|
28
|
+
"prompt('calabash:' + document.body.parentNode.innerHTML);" +
|
29
|
+
"})()");
|
30
|
+
webResults.add(ccc.getResult());
|
31
|
+
}
|
32
|
+
return webResults;
|
33
|
+
|
34
|
+
}
|
35
|
+
});
|
36
|
+
|
37
|
+
List<String> allResults = new ArrayList<String>(webResults.size());
|
38
|
+
for (WebFuture f : webResults) {
|
39
|
+
allResults.add(f.getAsString());
|
40
|
+
}
|
41
|
+
|
42
|
+
if (allResults.size() == 0) {
|
43
|
+
return new Result(false, "No WebView found");
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
return new Result(true, allResults);
|
47
|
+
}
|
25
48
|
|
26
|
-
return result;
|
27
49
|
}
|
28
50
|
|
29
|
-
|
51
|
+
@Override
|
30
52
|
public String key() {
|
31
53
|
return "dump_html";
|
32
54
|
}
|
@@ -1,88 +1,116 @@
|
|
1
1
|
package sh.calaba.instrumentationbackend.actions.webview;
|
2
2
|
|
3
3
|
|
4
|
-
import
|
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 EnterTextByCssSelector implements Action {
|
12
16
|
|
13
|
-
@
|
17
|
+
@SuppressWarnings({ "unchecked", "rawtypes" })
|
18
|
+
@Override
|
14
19
|
public Result execute(String... args) {
|
15
20
|
final String cssSelector = args[0];
|
16
21
|
final String value = args[1];
|
22
|
+
|
23
|
+
List<WebFuture> webResults = (List<WebFuture>) UIQueryUtils.evaluateSyncInMainThread(new Callable() {
|
24
|
+
|
25
|
+
public Object call() throws Exception {
|
26
|
+
|
27
|
+
List<WebFuture> webResults = new ArrayList();
|
28
|
+
for (CalabashChromeClient ccc : CalabashChromeClient.findAndPrepareWebViews()) {
|
29
|
+
WebView webView = ccc.getWebView();
|
17
30
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
" elem.dispatchEvent(evt);\n" +
|
37
|
-
" }\n" +
|
38
|
-
"";
|
31
|
+
String functions = " function simulateKeyEvent(elem, character) {\n" +
|
32
|
+
" var ch = character.charCodeAt(0);\n" +
|
33
|
+
"\n" +
|
34
|
+
" var evt;\n" +
|
35
|
+
"\n" +
|
36
|
+
" evt = document.createEvent('KeyboardEvent');\n" +
|
37
|
+
" evt.initKeyboardEvent('keydown', true, true, window, 0, 0, 0, 0, 0, ch);\n" +
|
38
|
+
" elem.dispatchEvent(evt);\n" +
|
39
|
+
"\n" +
|
40
|
+
" evt = document.createEvent('KeyboardEvent');\n" +
|
41
|
+
" evt.initKeyboardEvent('keyup', true, true, window, 0, 0, 0, 0, 0, ch);\n" +
|
42
|
+
" elem.dispatchEvent(evt);\n" +
|
43
|
+
"\n" +
|
44
|
+
" evt = document.createEvent('KeyboardEvent');\n" +
|
45
|
+
" evt.initKeyboardEvent('keypress', true, true, window, 0, 0, 0, 0, 0, ch);\n" +
|
46
|
+
" elem.dispatchEvent(evt);\n" +
|
47
|
+
" }\n" +
|
48
|
+
"";
|
39
49
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
functions +=
|
51
|
+
" function enterTextIntoInputField(elem, text) {\n" +
|
52
|
+
" for (var i = 0; i < text.length; i++) {\n" +
|
53
|
+
" var ch = text.charAt(i);\n" +
|
54
|
+
" elem.value += ch;\n" +
|
55
|
+
" simulateKeyEvent(elem, ch);\n" +
|
56
|
+
" }\n" +
|
57
|
+
" }\n" +
|
58
|
+
"";
|
49
59
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
60
|
+
functions +=
|
61
|
+
" function fireHTMLEvent(elem, eventName) {\n" +
|
62
|
+
" var evt = document.createEvent(\"HTMLEvents\");\n" +
|
63
|
+
" evt.initEvent(eventName, true, true );\n" +
|
64
|
+
" return !elem.dispatchEvent(evt);\n" +
|
65
|
+
" }\n" +
|
66
|
+
"";
|
57
67
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
68
|
+
functions +=
|
69
|
+
" function selectInputField(elem) {\n" +
|
70
|
+
" elem.click();\n" +
|
71
|
+
" elem.focus();\n" +
|
72
|
+
" }\n" +
|
73
|
+
"";
|
64
74
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
75
|
+
functions +=
|
76
|
+
" function deselectInputField(elem) {\n" +
|
77
|
+
" fireHTMLEvent(elem, 'change');\n" +
|
78
|
+
" fireHTMLEvent(elem, 'blur');\n" +
|
79
|
+
" }\n" +
|
80
|
+
"";
|
71
81
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
82
|
+
webView.loadUrl("javascript:(function() {" +
|
83
|
+
functions +
|
84
|
+
"var elem = document.querySelector(\"" + cssSelector + "\"); selectInputField(elem); enterTextIntoInputField(elem, '" + value + "'); deselectInputField(elem); " +
|
85
|
+
"prompt('calabash:true');" +
|
86
|
+
"})()");
|
87
|
+
|
88
|
+
webResults.add(ccc.getResult());
|
89
|
+
}
|
90
|
+
|
91
|
+
return webResults;
|
92
|
+
|
93
|
+
}
|
94
|
+
});
|
95
|
+
|
96
|
+
List<String> allResults = new ArrayList<String>(webResults.size());
|
97
|
+
boolean allSucceed = true;
|
98
|
+
for (WebFuture f : webResults) {
|
99
|
+
String result = f.getAsString();
|
100
|
+
allResults.add(result);
|
101
|
+
if (!"true".equals(result)) {
|
102
|
+
allSucceed = false;
|
103
|
+
}
|
104
|
+
}
|
77
105
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
106
|
+
|
107
|
+
if (allResults.size() == 0) {
|
108
|
+
return new Result(false, "No WebView found");
|
109
|
+
}
|
110
|
+
else {
|
111
|
+
return new Result(allSucceed, allResults);
|
112
|
+
}
|
113
|
+
|
86
114
|
}
|
87
115
|
|
88
116
|
@Override
|