calabash 2.0.0.pre2 → 2.0.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -26
- data/lib/calabash/android/adb.rb +9 -0
- data/lib/calabash/android/build/builder.rb +2 -0
- data/lib/calabash/android/build/java_keystore.rb +10 -0
- data/lib/calabash/android/build/resigner.rb +4 -0
- data/lib/calabash/android/build/test_server.rb +2 -0
- data/lib/calabash/android/defaults.rb +1 -0
- data/lib/calabash/android/device.rb +18 -0
- data/lib/calabash/android/interactions.rb +2 -0
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +1 -0
- data/lib/calabash/android/physical_buttons.rb +8 -0
- data/lib/calabash/android/screenshot.rb +1 -0
- data/lib/calabash/android/server.rb +1 -0
- data/lib/calabash/android/text.rb +1 -0
- data/lib/calabash/cli/build.rb +1 -0
- data/lib/calabash/cli/console.rb +2 -0
- data/lib/calabash/cli/generate.rb +3 -0
- data/lib/calabash/cli/helpers.rb +6 -0
- data/lib/calabash/cli/resign.rb +1 -0
- data/lib/calabash/cli/run.rb +2 -0
- data/lib/calabash/cli/setup_keystore.rb +2 -0
- data/lib/calabash/color.rb +7 -0
- data/lib/calabash/defaults.rb +1 -0
- data/lib/calabash/device.rb +2 -0
- data/lib/calabash/environment.rb +1 -0
- data/lib/calabash/http/retriable_client.rb +2 -0
- data/lib/calabash/interactions.rb +1 -0
- data/lib/calabash/ios/conditions.rb +3 -0
- data/lib/calabash/ios/date_picker.rb +412 -0
- data/lib/calabash/ios/defaults.rb +1 -0
- data/lib/calabash/ios/device/device_implementation.rb +5 -1
- data/lib/calabash/ios/device/ipad_1x_2x_mixin.rb +253 -0
- data/lib/calabash/ios/device/keyboard_mixin.rb +2 -0
- data/lib/calabash/ios/device/rotation_mixin.rb +1 -0
- data/lib/calabash/ios/device/routes/condition_route_mixin.rb +1 -0
- data/lib/calabash/ios/device/routes/map_route_mixin.rb +1 -0
- data/lib/calabash/ios/device/routes/response_parser.rb +1 -0
- data/lib/calabash/ios/device/routes/uia_route_mixin.rb +44 -6
- data/lib/calabash/ios/device/text_mixin.rb +2 -0
- data/lib/calabash/ios/device/uia_keyboard_mixin.rb +9 -0
- data/lib/calabash/ios/device/uia_mixin.rb +1 -0
- data/lib/calabash/ios/device.rb +1 -0
- data/lib/calabash/ios/interactions.rb +30 -1
- data/lib/calabash/ios/runtime.rb +8 -0
- data/lib/calabash/ios.rb +2 -0
- data/lib/calabash/life_cycle.rb +19 -2
- data/lib/calabash/location.rb +2 -0
- data/lib/calabash/page.rb +13 -0
- data/lib/calabash/patch.rb +1 -0
- data/lib/calabash/utility.rb +4 -4
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +4 -0
- data/lib/calabash.rb +6 -4
- metadata +113 -112
- data/lib/calabash/android/scroll.rb +0 -5
@@ -110,6 +110,7 @@ module Calabash
|
|
110
110
|
end.call(self)
|
111
111
|
end
|
112
112
|
|
113
|
+
# @!visibility private
|
113
114
|
def query_for_keyboard
|
114
115
|
keyboard_waiter.query(KEYBOARD_QUERY)
|
115
116
|
end
|
@@ -120,6 +121,7 @@ module Calabash
|
|
120
121
|
keyboard_waiter.query(KEYBOARD_KEY_QUERY)
|
121
122
|
end
|
122
123
|
|
124
|
+
# @!visibility private
|
123
125
|
def query_for_text_of_first_responder(query)
|
124
126
|
result = keyboard_waiter.query("#{query} isFirstResponder:1", :text)
|
125
127
|
if result.empty?
|
@@ -9,6 +9,7 @@ module Calabash
|
|
9
9
|
require 'run_loop'
|
10
10
|
require 'edn'
|
11
11
|
|
12
|
+
# @!visibility private
|
12
13
|
def uia_route(command)
|
13
14
|
unless run_loop
|
14
15
|
if defined?(IRB)
|
@@ -49,6 +50,49 @@ module Calabash
|
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
53
|
+
# @!visibility private
|
54
|
+
def uia_serialize_and_call(uia_command, *query_args)
|
55
|
+
command = uia_serialize_command(uia_command, *query_args)
|
56
|
+
result = uia_route(command)
|
57
|
+
result.first
|
58
|
+
end
|
59
|
+
|
60
|
+
# @!visibility private
|
61
|
+
# @todo Extract argument consing and unit test
|
62
|
+
def uia_query_then_make_javascript_calls(uia_command, query_parts, *javascript_parts)
|
63
|
+
if javascript_parts.empty?
|
64
|
+
uia_serialize_and_call(uia_command, *query_parts)
|
65
|
+
else
|
66
|
+
javascript_command = uia_serialize_command(uia_command, *query_parts)
|
67
|
+
|
68
|
+
javascript_args = []
|
69
|
+
javascript_parts.each do |invocation|
|
70
|
+
javascript_args << case invocation
|
71
|
+
when Symbol
|
72
|
+
"#{invocation}()"
|
73
|
+
when Hash
|
74
|
+
method = invocation.keys.first
|
75
|
+
method_args = invocation[method]
|
76
|
+
|
77
|
+
if method_args.is_a?(Array)
|
78
|
+
serialized_args = (method_args.map &:to_json).join(',')
|
79
|
+
else
|
80
|
+
serialized_args = method_args.to_json
|
81
|
+
end
|
82
|
+
|
83
|
+
"#{method}(#{serialized_args})"
|
84
|
+
else
|
85
|
+
raise Calabash::IOS::RouteError,
|
86
|
+
"Invalid invocation spec #{invocation}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
command = "#{javascript_command}.#{javascript_args.join('.')}"
|
90
|
+
|
91
|
+
result = uia_route(command)
|
92
|
+
result.first
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
52
96
|
private
|
53
97
|
|
54
98
|
UIA_STRATEGIES = [:preferences, :host, :shared_element]
|
@@ -159,12 +203,6 @@ module Calabash
|
|
159
203
|
end
|
160
204
|
end
|
161
205
|
|
162
|
-
def uia_serialize_and_call(uia_command, *query_args)
|
163
|
-
command = uia_serialize_command(uia_command, *query_args)
|
164
|
-
result = uia_route(command)
|
165
|
-
result.first
|
166
|
-
end
|
167
|
-
|
168
206
|
# @todo Verify this is the correct way to escape '\n in string
|
169
207
|
def uia_escape_string(string)
|
170
208
|
Calabash::Text.escape_single_quotes(string).gsub("\n", "\\\\n")
|
@@ -3,6 +3,7 @@ module Calabash
|
|
3
3
|
# @!visibility private
|
4
4
|
module TextMixin
|
5
5
|
|
6
|
+
# @!visibility private
|
6
7
|
def enter_text(text)
|
7
8
|
wait_for_keyboard(Calabash::Wait.default_options[:timeout])
|
8
9
|
existing_text = text_from_keyboard_first_responder
|
@@ -10,6 +11,7 @@ module Calabash
|
|
10
11
|
uia_type_string(text, options)
|
11
12
|
end
|
12
13
|
|
14
|
+
# @!visibility private
|
13
15
|
def _enter_text_in(query, text)
|
14
16
|
_tap(query)
|
15
17
|
enter_text(text)
|
@@ -43,6 +43,7 @@ module Calabash
|
|
43
43
|
|
44
44
|
private
|
45
45
|
|
46
|
+
# @!visibility private
|
46
47
|
def uia_type_string_handler(string, escaped_string, existing_text, result, logger)
|
47
48
|
UIATypeStringHandler.new(string,
|
48
49
|
escaped_string,
|
@@ -73,6 +74,7 @@ module Calabash
|
|
73
74
|
@logger = logger
|
74
75
|
end
|
75
76
|
|
77
|
+
# @!visibility private
|
76
78
|
def self.escape_backslashes_in_string(string)
|
77
79
|
return string if string.index(/\\/)
|
78
80
|
|
@@ -95,10 +97,12 @@ module Calabash
|
|
95
97
|
result['value']
|
96
98
|
end
|
97
99
|
|
100
|
+
# @!visibility private
|
98
101
|
def log(message)
|
99
102
|
logger.log(Color.blue(message), :info)
|
100
103
|
end
|
101
104
|
|
105
|
+
# @!visibility private
|
102
106
|
def log_preamble
|
103
107
|
log('When typing:')
|
104
108
|
log(" raw string: #{string}")
|
@@ -106,6 +110,7 @@ module Calabash
|
|
106
110
|
log("existing text: #{existing_text}")
|
107
111
|
end
|
108
112
|
|
113
|
+
# @!visibility private
|
109
114
|
def log_epilogue
|
110
115
|
log(" result: #{result}")
|
111
116
|
log('')
|
@@ -113,6 +118,7 @@ module Calabash
|
|
113
118
|
log('https://github.com/calabash/calabash-ios/issues/374')
|
114
119
|
end
|
115
120
|
|
121
|
+
# @!visibility private
|
116
122
|
def handle_result
|
117
123
|
the_status = status
|
118
124
|
if the_status == 'error'
|
@@ -130,6 +136,7 @@ module Calabash
|
|
130
136
|
end
|
131
137
|
end
|
132
138
|
|
139
|
+
# @!visibility private
|
133
140
|
def handle_error
|
134
141
|
log_preamble
|
135
142
|
if result.has_key? 'value'
|
@@ -161,6 +168,7 @@ module Calabash
|
|
161
168
|
end
|
162
169
|
end
|
163
170
|
|
171
|
+
# @!visibility private
|
164
172
|
def handle_success_with_incident
|
165
173
|
log_preamble
|
166
174
|
if value.nil?
|
@@ -176,6 +184,7 @@ module Calabash
|
|
176
184
|
false
|
177
185
|
end
|
178
186
|
|
187
|
+
# @!visibility private
|
179
188
|
def handle_unknown_status
|
180
189
|
log_preamble
|
181
190
|
log("receive response with an unknown value for 'status' key: '#{status}'")
|
data/lib/calabash/ios/device.rb
CHANGED
@@ -18,6 +18,7 @@ module Calabash
|
|
18
18
|
require 'calabash/ios/device/uia_keyboard_mixin'
|
19
19
|
require 'calabash/ios/device/text_mixin'
|
20
20
|
require 'calabash/ios/device/uia_mixin'
|
21
|
+
require 'calabash/ios/device/ipad_1x_2x_mixin'
|
21
22
|
require 'calabash/ios/device/device_implementation'
|
22
23
|
|
23
24
|
end
|
@@ -1,7 +1,36 @@
|
|
1
1
|
module Calabash
|
2
2
|
module IOS
|
3
|
-
|
3
|
+
|
4
|
+
# Interactions with your app that are specific to iOS
|
4
5
|
module Interactions
|
6
|
+
|
7
|
+
# @!visibility private
|
8
|
+
# Sends app to background. Simulates pressing the home button.
|
9
|
+
#
|
10
|
+
# @note Cannot be more than 60 seconds.
|
11
|
+
#
|
12
|
+
# @param [Numeric] seconds The number of seconds to keep the app
|
13
|
+
# in the background
|
14
|
+
# @raise [ArgumentError] If number of seconds is less than 1 and more
|
15
|
+
# than 60 seconds.
|
16
|
+
def _send_current_app_to_background(seconds)
|
17
|
+
unless (1..60).member?(seconds)
|
18
|
+
raise ArgumentError,
|
19
|
+
"Number of seconds: '#{seconds}' must be between 1 and 60"
|
20
|
+
end
|
21
|
+
|
22
|
+
javascript = %Q(
|
23
|
+
var x = target.deactivateAppForDuration(#{seconds});
|
24
|
+
var MAX_RETRY=5, retry_count = 0;
|
25
|
+
while (!x && retry_count < MAX_RETRY) {
|
26
|
+
x = target.deactivateAppForDuration(#{seconds});
|
27
|
+
retry_count += 1
|
28
|
+
};
|
29
|
+
x
|
30
|
+
)
|
31
|
+
uia(javascript)
|
32
|
+
end
|
33
|
+
|
5
34
|
# @!visibility private
|
6
35
|
def _evaluate_javascript_in(query, javascript)
|
7
36
|
query(query, calabashStringByEvaluatingJavaScript: javascript)
|
data/lib/calabash/ios/runtime.rb
CHANGED
@@ -63,6 +63,14 @@ module Calabash
|
|
63
63
|
end
|
64
64
|
|
65
65
|
# Is the device under test an iPhone 3.5in?
|
66
|
+
#
|
67
|
+
# @note If the app under test is an iPhone app emulated on an iPad then
|
68
|
+
# the form factor will _always_ be 'iphone 3.5.in'. If you need to
|
69
|
+
# branch on the actual device the app is running on, use the #ipad?
|
70
|
+
# method.
|
71
|
+
#
|
72
|
+
# @see #iphone_app_emulated_on_ipad?
|
73
|
+
# @see #ipad?
|
66
74
|
def iphone_35in?
|
67
75
|
Calabash::IOS::Device.default.form_factor == 'iphone 3.5in'
|
68
76
|
end
|
data/lib/calabash/ios.rb
CHANGED
@@ -31,6 +31,7 @@ module Calabash
|
|
31
31
|
require 'calabash/ios/runtime'
|
32
32
|
require 'calabash/ios/gestures'
|
33
33
|
require 'calabash/ios/slider'
|
34
|
+
require 'calabash/ios/date_picker'
|
34
35
|
|
35
36
|
include Calabash::IOS::Conditions
|
36
37
|
include Calabash::IOS::Orientation
|
@@ -41,6 +42,7 @@ module Calabash
|
|
41
42
|
include Calabash::IOS::Runtime
|
42
43
|
include Calabash::IOS::Gestures
|
43
44
|
include Calabash::IOS::Slider
|
45
|
+
include Calabash::IOS::DatePicker
|
44
46
|
|
45
47
|
end
|
46
48
|
end
|
data/lib/calabash/life_cycle.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
module Calabash
|
2
|
+
|
3
|
+
# Methods for managing an app's life cycle.
|
4
|
+
#
|
5
|
+
# The life cycle of an app includes:
|
6
|
+
# * installing / uninstalling
|
7
|
+
# * stopping / starting
|
8
|
+
# * clearing the application data
|
9
|
+
# * sending the application to background and resuming it
|
2
10
|
module LifeCycle
|
3
11
|
# Start the given application (and its test-server) on the port of
|
4
12
|
# {Calabash::Defaults#default_server Calabash.default_server}.
|
@@ -122,11 +130,20 @@ module Calabash
|
|
122
130
|
end
|
123
131
|
|
124
132
|
# Sends the current app to the background and resumes it after
|
125
|
-
# `for_seconds`.
|
133
|
+
# `for_seconds`.
|
134
|
+
#
|
135
|
+
# On iOS, `for_seconds` must be between 1 and 60 seconds.
|
136
|
+
#
|
137
|
+
# On iOS the _current app_ is the app under test (your app).
|
126
138
|
#
|
127
|
-
# On Android you can control the app lifecycle more
|
139
|
+
# On Android you can control the app lifecycle more granularity using
|
128
140
|
# {Calabash::Android::Interactions#go_home \#go_home} and
|
129
141
|
# {Calabash::Android::LifeCycle#resume_app \#resume_app}.
|
142
|
+
#
|
143
|
+
# @param [Numeric] for_seconds How long to keep the app to the background.
|
144
|
+
#
|
145
|
+
# @raise [ArgumentError] On iOS, if number of seconds is less than 1 and
|
146
|
+
# more than 60 seconds.
|
130
147
|
def send_current_app_to_background(for_seconds = 10)
|
131
148
|
_send_current_app_to_background(for_seconds)
|
132
149
|
|
data/lib/calabash/location.rb
CHANGED
data/lib/calabash/page.rb
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
module Calabash
|
2
|
+
|
3
|
+
# A base class for the Page Object Model (POM) or Page Object Pattern.
|
4
|
+
#
|
5
|
+
# We recommend the POM for testing cross-platform apps.
|
6
|
+
#
|
7
|
+
# We have a great examples of using the POM in the Calabash 2.0 repository.
|
8
|
+
# * https://github.com/calabash/calabash/tree/develop/samples/wordpress
|
9
|
+
# * https://github.com/calabash/calabash/tree/develop/samples/shared-page-logic
|
2
10
|
class Page
|
3
11
|
# For auto-completion
|
4
12
|
include Calabash
|
5
13
|
|
14
|
+
# @!visibility private
|
6
15
|
def self.inherited(subclass)
|
7
16
|
# Define the page into global scope
|
8
17
|
full_name = subclass.name
|
@@ -49,14 +58,18 @@ module Calabash
|
|
49
58
|
|
50
59
|
private_class_method :new
|
51
60
|
|
61
|
+
# @!visibility private
|
52
62
|
def initialize(world)
|
53
63
|
@world = world
|
54
64
|
end
|
55
65
|
|
66
|
+
# A query that distinguishes your page.
|
67
|
+
# @return [String, Hash, Calabash::Query] A query.
|
56
68
|
def trait
|
57
69
|
raise 'Implement your own trait'
|
58
70
|
end
|
59
71
|
|
72
|
+
# Waits for the page trait to appear.
|
60
73
|
def await(options={})
|
61
74
|
wait_for_view(trait, options)
|
62
75
|
end
|
data/lib/calabash/patch.rb
CHANGED
data/lib/calabash/utility.rb
CHANGED
@@ -5,6 +5,7 @@ module Calabash
|
|
5
5
|
|
6
6
|
end
|
7
7
|
|
8
|
+
# Utility methods for testing.
|
8
9
|
module Utility
|
9
10
|
|
10
11
|
# @!visibility private
|
@@ -39,17 +40,16 @@ module Calabash
|
|
39
40
|
alias_method :pct, :percent
|
40
41
|
|
41
42
|
# A convenience method for creating a coordinate hash that that can be
|
42
|
-
# passed to
|
43
|
+
# passed to the tap_coordinate gesture.
|
43
44
|
#
|
44
45
|
# @example
|
45
46
|
# # These are equivalent.
|
46
|
-
#
|
47
|
-
#
|
47
|
+
# tap_coordinate(coordinate(20, 50)
|
48
|
+
# tap_coordinate({x: 20, y: 50})
|
48
49
|
#
|
49
50
|
# @param [Number] x The value of the x.
|
50
51
|
# @param [Number] y The value of the y.
|
51
52
|
# @return [Hash] Representing the given values.
|
52
|
-
# @!visibility private
|
53
53
|
def coordinate(x, y)
|
54
54
|
{x: x, y: y}
|
55
55
|
end
|
data/lib/calabash/version.rb
CHANGED
data/lib/calabash/wait.rb
CHANGED
@@ -27,10 +27,14 @@ module Calabash
|
|
27
27
|
screenshot_on_error: true
|
28
28
|
}
|
29
29
|
|
30
|
+
# Returns the default wait options.
|
31
|
+
# @return [Hash] Key/value pairs describing the wait options.
|
30
32
|
def self.default_options
|
31
33
|
@@default_options
|
32
34
|
end
|
33
35
|
|
36
|
+
# Sets the default wait options.
|
37
|
+
# @param [Hash] value The new default wait options.
|
34
38
|
def self.default_options=(value)
|
35
39
|
@@default_options = value
|
36
40
|
end
|
data/lib/calabash.rb
CHANGED
@@ -241,6 +241,7 @@ module Calabash
|
|
241
241
|
@@has_set_embedding_context
|
242
242
|
end
|
243
243
|
|
244
|
+
# @!visibility private
|
244
245
|
def self.new_embed_method(method)
|
245
246
|
define_method(:embed) do |*args|
|
246
247
|
method.call(*args)
|
@@ -249,6 +250,7 @@ module Calabash
|
|
249
250
|
@@has_set_embedding_context = true
|
250
251
|
end
|
251
252
|
|
253
|
+
# @!visibility private
|
252
254
|
def embed(*_)
|
253
255
|
Logger.warn 'Embed is not available in this context. Will not embed.'
|
254
256
|
end
|
@@ -264,9 +266,9 @@ unless Object.const_defined?(:IOS)
|
|
264
266
|
end
|
265
267
|
|
266
268
|
if Calabash::Environment::DEBUG_CALLED_METHODS
|
267
|
-
$stdout.puts "#{Calabash::Color.red(
|
268
|
-
$stdout.puts "#{Calabash::Color.red(
|
269
|
-
$stdout.puts "#{Calabash::Color.red(
|
269
|
+
$stdout.puts "#{Calabash::Color.red('Will print every Calabash method called!')}"
|
270
|
+
$stdout.puts "#{Calabash::Color.red('Warning: This might slow down your test drastically')}"
|
271
|
+
$stdout.puts "#{Calabash::Color.red('and is an experimental feature.')}"
|
270
272
|
|
271
273
|
calabash_file = Calabash.method(:extended).source_location.first
|
272
274
|
$__calabash_dir_name = File.dirname(calabash_file)
|
@@ -274,7 +276,7 @@ if Calabash::Environment::DEBUG_CALLED_METHODS
|
|
274
276
|
trace_func = lambda do |event, file, line, id, binding, classname|
|
275
277
|
if event == 'call'
|
276
278
|
if classname.to_s.split('::').first == 'Calabash'
|
277
|
-
binding_caller_locations = binding.eval(
|
279
|
+
binding_caller_locations = binding.eval('caller_locations')
|
278
280
|
files = binding_caller_locations[3..-1].map(&:path)
|
279
281
|
|
280
282
|
calabash_not_in_stacktrace = files.none? do |file|
|