calabash-android 0.5.0.pre2 → 0.5.0
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/CHANGES.txt +20 -0
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +17 -98
- data/lib/calabash-android/steps/progress_steps.rb +1 -1
- data/lib/calabash-android/text_helpers.rb +41 -0
- data/lib/calabash-android/touch_helpers.rb +64 -0
- data/lib/calabash-android/version.rb +1 -1
- data/lib/calabash-android/wait_helpers.rb +3 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/CalabashInstrumentationTestRunner.java +12 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/InstrumentationBackend.java +6 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +53 -10
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/KeyboardEnterText.java +4 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da10e47ee0890ecd2b419637e87e39c926689c9e
|
4
|
+
data.tar.gz: 3fb9435c2c925d99664b28b957a7ebcc64419da3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7aed25ef751962b9f4396d3a323f0ff1a2234605e38ba88f72f96f05bb725b8edfdb52c9ab8c200dc7f7a41b69ee71f420fbf8d0ae72c0a3b0afb20191a35126
|
7
|
+
data.tar.gz: 82a7b377a02228b37d9fcc82cd3628666210b045c8bb50dee71ee9ec7ca220fa3e3a2681f9af67d37c63d115b40dfaca6c093c2d9ad8e32419eb8cc8069c2754
|
data/CHANGES.txt
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
0.5.0:
|
2
|
+
Removed many actions. They all have equivalent ruby wrappers/queries.
|
3
|
+
|
4
|
+
Added new ruby wrappers for scrolling and more complex gestures that would requre an action before.
|
5
|
+
|
6
|
+
Implemented flash method. It 'flashes' all found elements visually on the device to help the tester locate a view.
|
7
|
+
Its syntax is equivalent to query.
|
8
|
+
|
9
|
+
Added keyboard_enter_text/enter_text methods.
|
10
|
+
|
11
|
+
Updated all predefined steps. Their implementation is now more alike their naming.
|
12
|
+
|
13
|
+
Backoor method to invoke methods in the tested app.
|
14
|
+
|
15
|
+
Fixed visibility bugs:
|
16
|
+
- Views that were invisible were returned as visible in some cases.
|
17
|
+
- No visibility filtering on webviews.
|
18
|
+
|
19
|
+
Fixed various small bugs.
|
20
|
+
|
1
21
|
0.3.7:
|
2
22
|
Added calabash-android resign command
|
3
23
|
|
Binary file
|
@@ -7,8 +7,9 @@ require 'json'
|
|
7
7
|
require 'socket'
|
8
8
|
require 'timeout'
|
9
9
|
require 'calabash-android/helpers'
|
10
|
-
require 'calabash-android/
|
10
|
+
require 'calabash-android/text_helpers'
|
11
11
|
require 'calabash-android/touch_helpers'
|
12
|
+
require 'calabash-android/wait_helpers'
|
12
13
|
require 'calabash-android/version'
|
13
14
|
require 'calabash-android/env'
|
14
15
|
require 'retriable'
|
@@ -18,8 +19,9 @@ require 'cucumber'
|
|
18
19
|
module Calabash module Android
|
19
20
|
|
20
21
|
module Operations
|
21
|
-
include Calabash::Android::
|
22
|
+
include Calabash::Android::TextHelpers
|
22
23
|
include Calabash::Android::TouchHelpers
|
24
|
+
include Calabash::Android::WaitHelpers
|
23
25
|
|
24
26
|
def current_activity
|
25
27
|
`#{default_device.adb_command} shell dumpsys window windows`.each_line.grep(/mFocusedApp.+[\.\/]([^.\s\/\}]+)/){$1}.first
|
@@ -59,8 +61,9 @@ module Operations
|
|
59
61
|
@removed_actions.map! &:chomp
|
60
62
|
|
61
63
|
if @removed_actions.include?(action)
|
62
|
-
puts "
|
63
|
-
puts '
|
64
|
+
puts "\e[31mError: The action '#{action}' was removed in calabash-android 0.5\e[0m"
|
65
|
+
puts 'Solutions that do not require the removed action can be found on:'
|
66
|
+
puts "\e[36mhttps://github.com/calabash/calabash-android/blob/master/migrating_to_calabash_0.5.md\##{action}\e[0m"
|
64
67
|
end
|
65
68
|
|
66
69
|
default_device.perform_action(action, *arguments)
|
@@ -162,6 +165,10 @@ module Operations
|
|
162
165
|
map(uiquery,:query,*converted_args)
|
163
166
|
end
|
164
167
|
|
168
|
+
def flash(query_string)
|
169
|
+
map(query_string, :flash)
|
170
|
+
end
|
171
|
+
|
165
172
|
def each_item(opts={:query => "android.widget.ListView", :post_scroll => 0.2}, &block)
|
166
173
|
uiquery = opts[:query] || "android.widget.ListView"
|
167
174
|
skip_if = opts[:skip_if] || lambda { |i| false }
|
@@ -501,7 +508,6 @@ module Operations
|
|
501
508
|
env_options = {:target_package => package_name(@app_path),
|
502
509
|
:main_activity => main_activity(@app_path),
|
503
510
|
:test_server_port => @test_server_port,
|
504
|
-
:debug => false,
|
505
511
|
:class => "sh.calaba.instrumentationbackend.InstrumentationBackend"}
|
506
512
|
|
507
513
|
env_options = env_options.merge(options)
|
@@ -724,81 +730,10 @@ module Operations
|
|
724
730
|
raise(msg)
|
725
731
|
end
|
726
732
|
|
727
|
-
def has_text?(text)
|
728
|
-
!query("* {text CONTAINS[c] '#{text}'}").empty?
|
729
|
-
end
|
730
|
-
|
731
|
-
def assert_text(text, should_find = true)
|
732
|
-
raise "Text \"#{text}\" was #{should_find ? 'not ' : ''}found." if has_text?(text) ^ should_find
|
733
|
-
|
734
|
-
true
|
735
|
-
end
|
736
|
-
|
737
|
-
def double_tap(uiquery, options = {})
|
738
|
-
center_x, center_y = find_coordinate(uiquery)
|
739
|
-
|
740
|
-
perform_action("double_tap_coordinate", center_x, center_y)
|
741
|
-
end
|
742
|
-
|
743
|
-
# Performs a "long press" operation on a selected view
|
744
|
-
# Params:
|
745
|
-
# +uiquery+: a uiquery identifying one view
|
746
|
-
# +options[:length]+: the length of the long press in milliseconds (optional)
|
747
|
-
#
|
748
|
-
# Examples:
|
749
|
-
# - long_press("* id:'my_id'")
|
750
|
-
# - long_press("* id:'my_id'", {:length=>5000})
|
751
|
-
def long_press(uiquery, options = {})
|
752
|
-
center_x, center_y = find_coordinate(uiquery)
|
753
|
-
length = options[:length]
|
754
|
-
perform_action("long_press_coordinate", center_x, center_y, *(length unless length.nil?))
|
755
|
-
end
|
756
|
-
|
757
|
-
def touch(uiquery, options = {})
|
758
|
-
center_x, center_y = find_coordinate(uiquery)
|
759
|
-
|
760
|
-
perform_action("touch_coordinate", center_x, center_y)
|
761
|
-
end
|
762
|
-
|
763
|
-
def keyboard_enter_text(text, options = {})
|
764
|
-
perform_action('keyboard_enter_text', text)
|
765
|
-
end
|
766
|
-
|
767
|
-
def keyboard_enter_char(character, options = {})
|
768
|
-
keyboard_enter_text(character[0,1], options)
|
769
|
-
end
|
770
|
-
|
771
|
-
def enter_text(uiquery, text, options = {})
|
772
|
-
tap_when_element_exists(uiquery, options)
|
773
|
-
sleep 0.5
|
774
|
-
keyboard_enter_text(text, options)
|
775
|
-
end
|
776
|
-
|
777
|
-
def clear_text(query_string, options={})
|
778
|
-
result = query(query_string, setText: '')
|
779
|
-
|
780
|
-
raise "No elements found. Query: #{query_string}" if result.empty?
|
781
|
-
|
782
|
-
true
|
783
|
-
end
|
784
|
-
|
785
733
|
def hide_soft_keyboard
|
786
734
|
perform_action('hide_soft_keyboard')
|
787
735
|
end
|
788
736
|
|
789
|
-
def find_coordinate(uiquery)
|
790
|
-
raise "Cannot find nil" unless uiquery
|
791
|
-
|
792
|
-
element = execute_uiquery(uiquery)
|
793
|
-
|
794
|
-
raise "No elements found. Query: #{uiquery}" if element.nil?
|
795
|
-
|
796
|
-
center_x = element["rect"]["center_x"]
|
797
|
-
center_y = element["rect"]["center_y"]
|
798
|
-
|
799
|
-
[center_x, center_y]
|
800
|
-
end
|
801
|
-
|
802
737
|
def execute_uiquery(uiquery)
|
803
738
|
if uiquery.instance_of? String
|
804
739
|
elements = query(uiquery)
|
@@ -854,26 +789,6 @@ module Operations
|
|
854
789
|
touch(combined_query_string)
|
855
790
|
end
|
856
791
|
|
857
|
-
def tap_when_element_exists(query_string, options={})
|
858
|
-
options.merge!({action: lambda {|q| touch(q)}})
|
859
|
-
|
860
|
-
if options[:scroll] == true
|
861
|
-
scroll_to(query_string, options)
|
862
|
-
else
|
863
|
-
when_element_exists(query_string, options)
|
864
|
-
end
|
865
|
-
end
|
866
|
-
|
867
|
-
def long_press_when_element_exists(query_string, options={})
|
868
|
-
options.merge!({action: lambda {|q| long_press(q)}})
|
869
|
-
|
870
|
-
if options[:scroll] == true
|
871
|
-
scroll_to(query_string, options)
|
872
|
-
else
|
873
|
-
when_element_exists(query_string, options)
|
874
|
-
end
|
875
|
-
end
|
876
|
-
|
877
792
|
def swipe(dir,options={})
|
878
793
|
ni
|
879
794
|
end
|
@@ -943,7 +858,12 @@ module Operations
|
|
943
858
|
raise "No elements found. Query: #{all_query_string}" if element.nil?
|
944
859
|
element_center_y = element['rect']['center_y']
|
945
860
|
|
946
|
-
|
861
|
+
if element.has_key?('html')
|
862
|
+
scroll_view_query_string = element['webView']
|
863
|
+
else
|
864
|
+
scroll_view_query_string = "#{all_query_string} parent android.widget.ScrollView index:0"
|
865
|
+
end
|
866
|
+
|
947
867
|
scroll_element = query(scroll_view_query_string).first
|
948
868
|
|
949
869
|
raise "Could not find parent scroll view. Query: #{scroll_view_query_string}" if element.nil?
|
@@ -1067,7 +987,6 @@ module Operations
|
|
1067
987
|
def make_http_request(options)
|
1068
988
|
default_device.make_http_request(options)
|
1069
989
|
end
|
1070
|
-
|
1071
990
|
end
|
1072
991
|
|
1073
992
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Calabash
|
2
|
+
module Android
|
3
|
+
module TextHelpers
|
4
|
+
def has_text?(text)
|
5
|
+
!query("* {text CONTAINS[c] '#{text}'}").empty?
|
6
|
+
end
|
7
|
+
|
8
|
+
def assert_text(text, should_find = true)
|
9
|
+
raise "Text \"#{text}\" was #{should_find ? 'not ' : ''}found." if has_text?(text) ^ should_find
|
10
|
+
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def keyboard_enter_text(text, options = {})
|
15
|
+
perform_action('keyboard_enter_text', text)
|
16
|
+
end
|
17
|
+
|
18
|
+
def keyboard_enter_char(character, options = {})
|
19
|
+
keyboard_enter_text(character[0,1], options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def enter_text(uiquery, text, options = {})
|
23
|
+
tap_when_element_exists(uiquery, options)
|
24
|
+
sleep 0.5
|
25
|
+
keyboard_enter_text(text, options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def clear_text(query_string, options={})
|
29
|
+
result = query(query_string, setText: '')
|
30
|
+
|
31
|
+
raise "No elements found. Query: #{query_string}" if result.empty?
|
32
|
+
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def escape_quotes(str)
|
37
|
+
str.gsub("'", "\\\\'")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -4,6 +4,70 @@ module Calabash
|
|
4
4
|
def tap(mark, *args)
|
5
5
|
touch("* marked:'#{mark}'", *args)
|
6
6
|
end
|
7
|
+
|
8
|
+
def double_tap(uiquery, options = {})
|
9
|
+
center_x, center_y = find_coordinate(uiquery, options)
|
10
|
+
|
11
|
+
perform_action("double_tap_coordinate", center_x, center_y)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Performs a "long press" operation on a selected view
|
15
|
+
# Params:
|
16
|
+
# +uiquery+: a uiquery identifying one view
|
17
|
+
# +options[:length]+: the length of the long press in milliseconds (optional)
|
18
|
+
#
|
19
|
+
# Examples:
|
20
|
+
# - long_press("* id:'my_id'")
|
21
|
+
# - long_press("* id:'my_id'", {:length=>5000})
|
22
|
+
def long_press(uiquery, options = {})
|
23
|
+
center_x, center_y = find_coordinate(uiquery, options)
|
24
|
+
length = options[:length]
|
25
|
+
perform_action("long_press_coordinate", center_x, center_y, *(length unless length.nil?))
|
26
|
+
end
|
27
|
+
|
28
|
+
def touch(uiquery, options = {})
|
29
|
+
center_x, center_y = find_coordinate(uiquery, options)
|
30
|
+
|
31
|
+
perform_action("touch_coordinate", center_x, center_y)
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_coordinate(uiquery, options={})
|
35
|
+
raise "Cannot find nil" unless uiquery
|
36
|
+
|
37
|
+
element = execute_uiquery(uiquery)
|
38
|
+
|
39
|
+
raise "No elements found. Query: #{uiquery}" if element.nil?
|
40
|
+
|
41
|
+
x = element["rect"]["center_x"]
|
42
|
+
y = element["rect"]["center_y"]
|
43
|
+
|
44
|
+
if options[:offset]
|
45
|
+
x += options[:offset][:x] || 0
|
46
|
+
y += options[:offset][:y] || 0
|
47
|
+
end
|
48
|
+
|
49
|
+
[x, y]
|
50
|
+
end
|
51
|
+
|
52
|
+
def tap_when_element_exists(query_string, options={})
|
53
|
+
options.merge!({action: lambda {|q| touch(q, options)}})
|
54
|
+
|
55
|
+
if options[:scroll] == true
|
56
|
+
scroll_to(query_string, options)
|
57
|
+
else
|
58
|
+
when_element_exists(query_string, options)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def long_press_when_element_exists(query_string, options={})
|
63
|
+
options.merge!({action: lambda {|q| long_press(q, options)}})
|
64
|
+
|
65
|
+
if options[:scroll] == true
|
66
|
+
scroll_to(query_string, options)
|
67
|
+
else
|
68
|
+
when_element_exists(query_string, options)
|
69
|
+
end
|
70
|
+
end
|
7
71
|
end
|
8
72
|
end
|
9
73
|
end
|
@@ -100,7 +100,7 @@ module Calabash
|
|
100
100
|
end
|
101
101
|
|
102
102
|
#options for wait_for apply
|
103
|
-
def
|
103
|
+
def wait_for_element_does_not_exist(uiquery, options={})
|
104
104
|
wait_for_elements_do_not_exist([uiquery], options)
|
105
105
|
end
|
106
106
|
|
@@ -176,7 +176,7 @@ module Calabash
|
|
176
176
|
# Example usage: when_element_exists("Button", :timeout => 10)
|
177
177
|
def when_element_exists(uiquery, opts = {})
|
178
178
|
action = { :action => lambda { touch uiquery } }
|
179
|
-
opts =
|
179
|
+
opts = action.merge(opts)
|
180
180
|
wait_for_elements_exist([uiquery], opts)
|
181
181
|
|
182
182
|
if opts[:action].parameters.length == 0
|
@@ -191,7 +191,7 @@ module Calabash
|
|
191
191
|
end
|
192
192
|
|
193
193
|
def wait_for_text_to_disappear(text, options={})
|
194
|
-
|
194
|
+
wait_for_element_does_not_exist("* {text CONTAINS[c] '#{text}'}", options)
|
195
195
|
end
|
196
196
|
|
197
197
|
def wait_for_activity(activity_name, options={})
|
@@ -26,7 +26,18 @@ public class CalabashInstrumentationTestRunner extends InstrumentationTestRunner
|
|
26
26
|
HttpServer.instantiate(Integer.parseInt(arguments.getString("test_server_port")));
|
27
27
|
|
28
28
|
InstrumentationBackend.testPackage = arguments.getString("target_package");
|
29
|
-
|
29
|
+
|
30
|
+
Bundle extras = (Bundle)arguments.clone();
|
31
|
+
extras.remove("target_package");
|
32
|
+
extras.remove("main_activity");
|
33
|
+
extras.remove("test_server_port");
|
34
|
+
extras.remove("class");
|
35
|
+
|
36
|
+
if (extras.isEmpty()) {
|
37
|
+
extras = null;
|
38
|
+
}
|
39
|
+
|
40
|
+
InstrumentationBackend.extras = extras;
|
30
41
|
|
31
42
|
try {
|
32
43
|
InstrumentationBackend.mainActivityName = arguments.getString("main_activity");
|
@@ -69,7 +69,12 @@ public class InstrumentationBackend extends ActivityInstrumentationTestCase2<Act
|
|
69
69
|
Intent i = new Intent(Intent.ACTION_MAIN);
|
70
70
|
i.setClassName(testPackage, mainActivityName);
|
71
71
|
i.addCategory("android.intent.category.LAUNCHER");
|
72
|
-
i.
|
72
|
+
i.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
|
73
|
+
|
74
|
+
if (extras != null) {
|
75
|
+
i.putExtras(extras);
|
76
|
+
}
|
77
|
+
|
73
78
|
setActivityIntent(i);
|
74
79
|
|
75
80
|
actions = new Actions(getInstrumentation(), this);
|
@@ -6,9 +6,13 @@ import java.io.File;
|
|
6
6
|
import java.io.IOException;
|
7
7
|
import java.io.PrintWriter;
|
8
8
|
import java.io.StringWriter;
|
9
|
+
import java.lang.InterruptedException;
|
10
|
+
import java.lang.Override;
|
11
|
+
import java.lang.Runnable;
|
9
12
|
import java.util.Enumeration;
|
10
13
|
import java.util.List;
|
11
14
|
import java.util.Map;
|
15
|
+
import java.util.HashMap;
|
12
16
|
import java.util.Properties;
|
13
17
|
import java.util.concurrent.locks.Condition;
|
14
18
|
import java.util.concurrent.locks.Lock;
|
@@ -22,9 +26,12 @@ import sh.calaba.instrumentationbackend.json.JSONUtils;
|
|
22
26
|
import sh.calaba.instrumentationbackend.query.Query;
|
23
27
|
import sh.calaba.instrumentationbackend.query.QueryResult;
|
24
28
|
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
29
|
+
|
25
30
|
import android.graphics.Bitmap;
|
26
31
|
import android.util.Log;
|
27
32
|
import android.view.View;
|
33
|
+
import android.view.animation.Animation;
|
34
|
+
import android.view.animation.AlphaAnimation;
|
28
35
|
|
29
36
|
public class HttpServer extends NanoHTTPD {
|
30
37
|
private static final String TAG = "InstrumentationBackend";
|
@@ -127,17 +134,53 @@ public class HttpServer extends NanoHTTPD {
|
|
127
134
|
String uiQuery = (String) command.get("query");
|
128
135
|
uiQuery = uiQuery.trim();
|
129
136
|
Map op = (Map) command.get("operation");
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
137
|
+
String methodName = (String) op.get("method_name");
|
138
|
+
List arguments = (List) op.get("arguments");
|
139
|
+
|
140
|
+
if (methodName.equals("flash")) {
|
141
|
+
QueryResult queryResult = new Query(uiQuery, java.util.Collections.emptyList()).executeQuery();
|
142
|
+
List<View> views = queryResult.getResult();
|
143
|
+
|
144
|
+
if (views.isEmpty()) {
|
145
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
146
|
+
FranklyResult.failedResult("Could not find view to flash", "").asJson());
|
147
|
+
}
|
148
|
+
|
149
|
+
final Object firstItem = views.get(0);
|
150
|
+
|
151
|
+
if (!(firstItem instanceof View)) {
|
152
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
153
|
+
FranklyResult.failedResult("Only views can be flashed", "").asJson());
|
154
|
+
}
|
155
|
+
|
156
|
+
for (final View view : views) {
|
157
|
+
InstrumentationBackend.solo.runOnMainSync(new Runnable() {
|
158
|
+
@Override
|
159
|
+
public void run() {
|
160
|
+
Animation animation = new AlphaAnimation(1, 0);
|
161
|
+
animation.setRepeatMode(Animation.REVERSE);
|
162
|
+
animation.setDuration(200);
|
163
|
+
animation.setRepeatCount(5);
|
164
|
+
view.startAnimation(animation);
|
165
|
+
}
|
166
|
+
});
|
167
|
+
|
168
|
+
try {
|
169
|
+
Thread.sleep(1200);
|
170
|
+
} catch (InterruptedException e) {
|
171
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
172
|
+
FranklyResult.failedResult("Interrupted while flashing", "").asJson());
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
177
|
+
FranklyResult.successResult(queryResult).asJson());
|
178
|
+
} else {
|
179
|
+
QueryResult queryResult = new Query(uiQuery,arguments).executeQuery();
|
138
180
|
|
139
|
-
|
140
|
-
|
181
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
182
|
+
FranklyResult.successResult(queryResult).asJson());
|
183
|
+
}
|
141
184
|
} catch (Exception e ) {
|
142
185
|
e.printStackTrace();
|
143
186
|
errorResult = FranklyResult.fromThrowable(e);
|
@@ -22,6 +22,10 @@ public class KeyboardEnterText implements Action {
|
|
22
22
|
|
23
23
|
final InputConnection inputConnection = getInputConnection();
|
24
24
|
|
25
|
+
if (inputConnection == null) {
|
26
|
+
return Result.failedResult("Could not enter text. No element has focus.");
|
27
|
+
}
|
28
|
+
|
25
29
|
final String textToEnter = args[0];
|
26
30
|
InstrumentationBackend.solo.runOnMainSync(new Runnable() {
|
27
31
|
@Override
|
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.5.0
|
4
|
+
version: 0.5.0
|
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: 2014-
|
11
|
+
date: 2014-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- lib/calabash-android/steps/search_steps.rb
|
199
199
|
- lib/calabash-android/steps/spinner_steps.rb
|
200
200
|
- lib/calabash-android/steps/time_picker_steps.rb
|
201
|
+
- lib/calabash-android/text_helpers.rb
|
201
202
|
- lib/calabash-android/touch_helpers.rb
|
202
203
|
- lib/calabash-android/version.rb
|
203
204
|
- lib/calabash-android/wait_helpers.rb
|
@@ -839,9 +840,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
839
840
|
version: '0'
|
840
841
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
841
842
|
requirements:
|
842
|
-
- - '
|
843
|
+
- - '>='
|
843
844
|
- !ruby/object:Gem::Version
|
844
|
-
version:
|
845
|
+
version: '0'
|
845
846
|
requirements: []
|
846
847
|
rubyforge_project:
|
847
848
|
rubygems_version: 2.1.10
|