calabash 2.0.0.pre10 → 2.0.0.pre11
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/README.md +5 -17
- data/bin/calabash +3 -4
- data/lib/calabash.rb +53 -10
- data/lib/calabash/android.rb +89 -28
- data/lib/calabash/android/adb.rb +32 -20
- data/lib/calabash/android/application.rb +1 -1
- data/lib/calabash/android/build/builder.rb +1 -1
- data/lib/calabash/android/build/java_keystore.rb +1 -1
- data/lib/calabash/android/build/resigner.rb +1 -1
- data/lib/calabash/android/device.rb +22 -66
- data/lib/calabash/android/device/helper_application.rb +95 -0
- data/lib/calabash/android/environment.rb +14 -1
- data/lib/calabash/android/gestures.rb +6 -22
- data/lib/calabash/android/interactions.rb +14 -17
- data/lib/calabash/android/lib/.irbrc +9 -1
- data/lib/calabash/android/lib/AndroidManifest.xml +23 -2
- data/lib/calabash/android/lib/HelperApplication.apk +0 -0
- data/lib/calabash/android/lib/HelperApplicationTestServer.apk +0 -0
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +3 -3
- data/lib/calabash/android/orientation.rb +8 -8
- data/lib/calabash/android/physical_buttons.rb +19 -16
- data/lib/calabash/android/server.rb +1 -1
- data/lib/calabash/android/text.rb +12 -12
- data/lib/calabash/android/web.rb +12 -0
- data/lib/calabash/application.rb +3 -0
- data/lib/calabash/cli/generate.rb +8 -18
- data/lib/calabash/cli/helpers.rb +4 -9
- data/lib/calabash/cli/run.rb +1 -1
- data/lib/calabash/console_helpers.rb +179 -11
- data/lib/calabash/device.rb +4 -19
- data/lib/calabash/gestures.rb +292 -198
- data/lib/calabash/interactions.rb +3 -40
- data/lib/calabash/internal.rb +48 -0
- data/lib/calabash/ios.rb +76 -16
- data/lib/calabash/ios/automator.rb +9 -0
- data/lib/calabash/ios/automator/automator.rb +217 -0
- data/lib/calabash/ios/automator/coordinates.rb +37 -0
- data/lib/calabash/ios/automator/device_agent.rb +379 -0
- data/lib/calabash/ios/conditions.rb +1 -1
- data/lib/calabash/ios/console_helpers.rb +2 -2
- data/lib/calabash/ios/date_picker.rb +10 -8
- data/lib/calabash/ios/device.rb +0 -1
- data/lib/calabash/ios/device/device_implementation.rb +9 -21
- data/lib/calabash/ios/device/gestures_mixin.rb +53 -55
- data/lib/calabash/ios/device/keyboard_mixin.rb +21 -0
- data/lib/calabash/ios/device/rotation_mixin.rb +3 -65
- data/lib/calabash/ios/gestures.rb +24 -90
- data/lib/calabash/ios/interactions.rb +1 -6
- data/lib/calabash/ios/lib/.irbrc +9 -2
- data/lib/calabash/ios/orientation.rb +8 -8
- data/lib/calabash/ios/runtime.rb +14 -14
- data/lib/calabash/ios/scroll.rb +25 -17
- data/lib/calabash/ios/slider.rb +11 -18
- data/lib/calabash/ios/text.rb +20 -74
- data/lib/calabash/ios/uia.rb +1 -1
- data/lib/calabash/ios/web.rb +10 -0
- data/lib/calabash/lib/skeleton/{Gemfile → Gemfile.skeleton} +0 -0
- data/lib/calabash/lib/skeleton/config/{cucumber.yml → cucumber.yml.skeleton} +0 -0
- data/lib/calabash/lib/skeleton/features/{sample.feature → sample.feature.skeleton} +0 -0
- data/lib/calabash/lib/skeleton/features/step_definitions/{calabash_steps.rb → sample_steps.rb.skeleton} +8 -8
- data/lib/calabash/lib/skeleton/features/support/{dry_run.rb → dry_run.rb.skeleton} +2 -5
- data/lib/calabash/lib/skeleton/features/support/{env.rb → env.rb.skeleton} +2 -8
- data/lib/calabash/lib/skeleton/features/support/hooks.rb.skeleton +34 -0
- data/lib/calabash/life_cycle.rb +16 -8
- data/lib/calabash/location.rb +14 -15
- data/lib/calabash/orientation.rb +8 -8
- data/lib/calabash/page.rb +1 -4
- data/lib/calabash/retry.rb +33 -0
- data/lib/calabash/screenshot.rb +3 -3
- data/lib/calabash/stubs.rb +21 -0
- data/lib/calabash/text.rb +31 -19
- data/lib/calabash/utility.rb +41 -8
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +177 -192
- data/lib/calabash/web.rb +44 -0
- metadata +39 -32
- data/lib/calabash/ios/device/text_mixin.rb +0 -21
- data/lib/calabash/lib/skeleton/features/support/hooks.rb +0 -83
@@ -13,7 +13,7 @@ module Calabash
|
|
13
13
|
# in the background
|
14
14
|
# @raise [ArgumentError] If number of seconds is less than 1 and more
|
15
15
|
# than 60 seconds.
|
16
|
-
|
16
|
+
define_method(:_send_current_app_to_background) do |seconds|
|
17
17
|
unless (1..60).member?(seconds)
|
18
18
|
raise ArgumentError,
|
19
19
|
"Number of seconds: '#{seconds}' must be between 1 and 60"
|
@@ -30,11 +30,6 @@ module Calabash
|
|
30
30
|
)
|
31
31
|
uia(javascript)
|
32
32
|
end
|
33
|
-
|
34
|
-
# @!visibility private
|
35
|
-
def _evaluate_javascript_in(query, javascript)
|
36
|
-
query(query, calabashStringByEvaluatingJavaScript: javascript)
|
37
|
-
end
|
38
33
|
end
|
39
34
|
end
|
40
35
|
end
|
data/lib/calabash/ios/lib/.irbrc
CHANGED
@@ -37,10 +37,17 @@ rescue LoadError => e
|
|
37
37
|
end
|
38
38
|
|
39
39
|
begin
|
40
|
-
|
41
40
|
require 'calabash/ios'
|
42
41
|
|
43
|
-
|
42
|
+
IRB.conf[:PROMPT][:CALABASH] = {
|
43
|
+
:PROMPT_I => "calabash #{Calabash::VERSION}> ",
|
44
|
+
:PROMPT_S => "%03n> ",
|
45
|
+
:PROMPT_C => "%03n> ",
|
46
|
+
:RETURN => "%s\n"
|
47
|
+
}
|
48
|
+
|
49
|
+
IRB.conf[:PROMPT_MODE] = :CALABASH
|
50
|
+
|
44
51
|
extend Calabash::ConsoleHelpers
|
45
52
|
|
46
53
|
Calabash::IOS.setup_defaults!
|
@@ -13,7 +13,7 @@ module Calabash
|
|
13
13
|
# @return [String] Returns the device orientation as one of
|
14
14
|
# `{'down' | 'up' | 'left' | 'right'}`.
|
15
15
|
def status_bar_orientation
|
16
|
-
|
16
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.status_bar_orientation}
|
17
17
|
end
|
18
18
|
|
19
19
|
# Rotate the device left - clockwise relative to the home button.
|
@@ -26,7 +26,7 @@ module Calabash
|
|
26
26
|
# @return [String] The position of the home button relative to the status
|
27
27
|
# bar after the rotation. Can be one of 'down', 'left', 'right', 'up'.
|
28
28
|
def rotate_device_left
|
29
|
-
|
29
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.rotate(:left)}
|
30
30
|
status_bar_orientation
|
31
31
|
end
|
32
32
|
|
@@ -40,7 +40,7 @@ module Calabash
|
|
40
40
|
# @return [String] The position of the home button relative to the status
|
41
41
|
# bar after the rotation. Can be one of 'down', 'left', 'right', 'up'.
|
42
42
|
def rotate_device_right
|
43
|
-
|
43
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.rotate(:right)}
|
44
44
|
status_bar_orientation
|
45
45
|
end
|
46
46
|
|
@@ -83,11 +83,11 @@ module Calabash
|
|
83
83
|
canonical_position = :down if position.to_sym == :bottom
|
84
84
|
canonical_position = :up if position.to_sym == :top
|
85
85
|
|
86
|
-
Calabash::
|
86
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.rotate_home_button_to(canonical_position)}
|
87
87
|
end
|
88
88
|
|
89
89
|
# @!visibility private
|
90
|
-
|
90
|
+
define_method(:_set_orientation_landscape) do
|
91
91
|
orientation = status_bar_orientation
|
92
92
|
return orientation if landscape?
|
93
93
|
|
@@ -95,7 +95,7 @@ module Calabash
|
|
95
95
|
end
|
96
96
|
|
97
97
|
# @!visibility private
|
98
|
-
|
98
|
+
define_method(:_set_orientation_portrait) do
|
99
99
|
orientation = status_bar_orientation
|
100
100
|
return orientation if portrait?
|
101
101
|
|
@@ -103,13 +103,13 @@ module Calabash
|
|
103
103
|
end
|
104
104
|
|
105
105
|
# @!visibility private
|
106
|
-
|
106
|
+
define_method(:_portrait?) do
|
107
107
|
orientation = status_bar_orientation
|
108
108
|
orientation.eql?('up') || orientation.eql?('down')
|
109
109
|
end
|
110
110
|
|
111
111
|
# @!visibility private
|
112
|
-
|
112
|
+
define_method(:_landscape?) do
|
113
113
|
orientation = status_bar_orientation
|
114
114
|
orientation.eql?('right') || orientation.eql?('left')
|
115
115
|
end
|
data/lib/calabash/ios/runtime.rb
CHANGED
@@ -11,27 +11,27 @@ module Calabash
|
|
11
11
|
|
12
12
|
# Is the device under test a simulator?
|
13
13
|
def simulator?
|
14
|
-
Calabash::
|
14
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.simulator?}
|
15
15
|
end
|
16
16
|
|
17
17
|
# Is the device under test a physical device?
|
18
18
|
def physical_device?
|
19
|
-
Calabash::
|
19
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.physical_device?}
|
20
20
|
end
|
21
21
|
|
22
22
|
# Is the device under test an iPad?
|
23
23
|
def ipad?
|
24
|
-
Calabash::
|
24
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.device_family == 'iPad'}
|
25
25
|
end
|
26
26
|
|
27
27
|
# Is the device under test an iPhone?
|
28
28
|
def iphone?
|
29
|
-
Calabash::
|
29
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.device_family == 'iPhone'}
|
30
30
|
end
|
31
31
|
|
32
32
|
# Is the device under test an iPod?
|
33
33
|
def ipod?
|
34
|
-
Calabash::
|
34
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.device_family == 'iPod'}
|
35
35
|
end
|
36
36
|
|
37
37
|
# Is the device under test an iPhone or iPod?
|
@@ -44,22 +44,22 @@ module Calabash
|
|
44
44
|
# An iPhone only app running on an iPad will be displayed in an emulated
|
45
45
|
# mode. Starting in iOS 7, such apps will always be launched in 2x mode.
|
46
46
|
def iphone_app_emulated_on_ipad?
|
47
|
-
Calabash::
|
47
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.iphone_app_emulated_on_ipad?}
|
48
48
|
end
|
49
49
|
|
50
50
|
# Is the device under test have a 4 inch screen?
|
51
51
|
def iphone_4in?
|
52
|
-
Calabash::
|
52
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.form_factor == 'iphone 4in'}
|
53
53
|
end
|
54
54
|
|
55
55
|
# Is the device under test an iPhone 6.
|
56
56
|
def iphone_6?
|
57
|
-
Calabash::
|
57
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.form_factor == 'iphone 6'}
|
58
58
|
end
|
59
59
|
|
60
60
|
# Is the device under test an iPhone 6+?
|
61
61
|
def iphone_6_plus?
|
62
|
-
Calabash::
|
62
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.form_factor == 'iphone 6 +'}
|
63
63
|
end
|
64
64
|
|
65
65
|
# Is the device under test an iPhone 3.5in?
|
@@ -72,7 +72,7 @@ module Calabash
|
|
72
72
|
# @see #iphone_app_emulated_on_ipad?
|
73
73
|
# @see #ipad?
|
74
74
|
def iphone_35in?
|
75
|
-
Calabash::
|
75
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.form_factor == 'iphone 3.5in'}
|
76
76
|
end
|
77
77
|
|
78
78
|
# The screen dimensions and details about scale and sample rates.
|
@@ -88,7 +88,7 @@ module Calabash
|
|
88
88
|
#
|
89
89
|
# @return [Hash] See the example.
|
90
90
|
def app_screen_details
|
91
|
-
Calabash::
|
91
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.screen_dimensions}
|
92
92
|
end
|
93
93
|
|
94
94
|
# The version of iOS running on the test device.
|
@@ -100,7 +100,7 @@ module Calabash
|
|
100
100
|
#
|
101
101
|
# @return [RunLoop::Version] A version object.
|
102
102
|
def ios_version
|
103
|
-
Calabash::
|
103
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.ios_version}
|
104
104
|
end
|
105
105
|
|
106
106
|
# Is the device under test running iOS 6?
|
@@ -132,7 +132,7 @@ module Calabash
|
|
132
132
|
#
|
133
133
|
# @return [RunLoop::Version] A version object.
|
134
134
|
def server_version
|
135
|
-
Calabash::
|
135
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.server_version}
|
136
136
|
end
|
137
137
|
|
138
138
|
# Details about the version of the app under test.
|
@@ -161,7 +161,7 @@ module Calabash
|
|
161
161
|
# the methods in the {Calabash::IOS::Runtime} module instead.
|
162
162
|
# @return[Hash] Key/value pairs that describe the runtime environment.
|
163
163
|
def runtime_details
|
164
|
-
Calabash::
|
164
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.runtime_details}
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
data/lib/calabash/ios/scroll.rb
CHANGED
@@ -71,7 +71,7 @@ module Calabash
|
|
71
71
|
raise RuntimeError, e
|
72
72
|
end
|
73
73
|
|
74
|
-
results =
|
74
|
+
results = Calabash::Internal.with_default_device(required_os: :ios) {|device| device.map_route(query, :scroll, direction)}
|
75
75
|
|
76
76
|
if results.first.nil?
|
77
77
|
fail("Expected '#{query}' to match a UIScrollView or a subclass")
|
@@ -153,8 +153,10 @@ module Calabash
|
|
153
153
|
position = merged_options[:scroll_position].to_sym
|
154
154
|
animate = merged_options[:animate]
|
155
155
|
|
156
|
-
results =
|
157
|
-
|
156
|
+
results = Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
157
|
+
device.map_route(query, :scrollToRow, row.to_i,
|
158
|
+
section.to_i, position, animate)
|
159
|
+
end
|
158
160
|
|
159
161
|
if results.first.nil?
|
160
162
|
message = [
|
@@ -240,8 +242,10 @@ module Calabash
|
|
240
242
|
position = merged_options[:scroll_position].to_sym
|
241
243
|
animate = merged_options[:animate]
|
242
244
|
|
243
|
-
results =
|
244
|
-
|
245
|
+
results = Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
246
|
+
device.map_route(query, :scrollToRowWithMark, mark,
|
247
|
+
position, animate)
|
248
|
+
end
|
245
249
|
|
246
250
|
if results.first.nil?
|
247
251
|
message = [
|
@@ -334,9 +338,12 @@ module Calabash
|
|
334
338
|
position = merged_options[:scroll_position].to_sym
|
335
339
|
animate = merged_options[:animate]
|
336
340
|
|
337
|
-
results =
|
338
|
-
|
339
|
-
|
341
|
+
results = Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
342
|
+
device.map_route(query, :collectionViewScroll,
|
343
|
+
item.to_i, section.to_i,
|
344
|
+
position, animate)
|
345
|
+
end
|
346
|
+
|
340
347
|
if results.first.nil?
|
341
348
|
message = [
|
342
349
|
"Could not scroll collection to item '#{item}' and section '#{section}'.",
|
@@ -427,9 +434,11 @@ module Calabash
|
|
427
434
|
position = merged_options[:scroll_position].to_sym
|
428
435
|
animate = merged_options[:animate]
|
429
436
|
|
430
|
-
results =
|
431
|
-
|
432
|
-
|
437
|
+
results = Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
438
|
+
device.map_route(query,
|
439
|
+
:collectionViewScrollToItemWithMark,
|
440
|
+
mark, position, animate)
|
441
|
+
end
|
433
442
|
|
434
443
|
if results.first.nil?
|
435
444
|
message = [
|
@@ -455,8 +464,7 @@ module Calabash
|
|
455
464
|
:left, :center_horizontal, :right]
|
456
465
|
|
457
466
|
# @!visibility private
|
458
|
-
|
459
|
-
|
467
|
+
define_method(:_wait_for_exactly_one_scroll_view) do |query|
|
460
468
|
results = []
|
461
469
|
|
462
470
|
found_none = "Expected '#{query}' to match exactly one view, but found no matches."
|
@@ -477,7 +485,7 @@ module Calabash
|
|
477
485
|
end
|
478
486
|
|
479
487
|
# @!visibility private
|
480
|
-
|
488
|
+
define_method(:_expect_valid_scroll_positions) do |valid_positions, position|
|
481
489
|
unless valid_positions.include?(position.to_sym)
|
482
490
|
raise ArgumentError,
|
483
491
|
"Expected '#{position}' to be one of #{valid_positions.join(', ')}"
|
@@ -485,7 +493,7 @@ module Calabash
|
|
485
493
|
end
|
486
494
|
|
487
495
|
# @!visibility private
|
488
|
-
|
496
|
+
define_method(:_expect_valid_scroll_animate) do |animate|
|
489
497
|
unless [true, false].include?(animate)
|
490
498
|
raise ArgumentError,
|
491
499
|
"Expected '#{animate}' to be a Boolean true or false"
|
@@ -493,13 +501,13 @@ module Calabash
|
|
493
501
|
end
|
494
502
|
|
495
503
|
# @!visibility private
|
496
|
-
|
504
|
+
define_method(:_expect_valid_scroll_options) do |valid_positions, options|
|
497
505
|
_expect_valid_scroll_positions(valid_positions, options[:scroll_position])
|
498
506
|
_expect_valid_scroll_animate(options[:animate])
|
499
507
|
end
|
500
508
|
|
501
509
|
# @!visibility private
|
502
|
-
|
510
|
+
define_method(:_expect_valid_scroll_mark) do |mark|
|
503
511
|
if mark.nil? || mark == ''
|
504
512
|
raise ArgumentError,
|
505
513
|
if mark.nil?
|
data/lib/calabash/ios/slider.rb
CHANGED
@@ -16,34 +16,25 @@ module Calabash
|
|
16
16
|
# * Use the index language feature: "UISlider index:0"
|
17
17
|
#
|
18
18
|
# @example
|
19
|
-
# slider_set_value("UISlider marked:'office slider'", 2)
|
20
|
-
# slider_set_value("slider marked:'weather slider'", -1)
|
21
|
-
# slider_set_value("UISlider", 11)
|
19
|
+
# cal_ios.slider_set_value("UISlider marked:'office slider'", 2)
|
20
|
+
# cal_ios.slider_set_value("slider marked:'weather slider'", -1)
|
21
|
+
# cal_ios.slider_set_value("UISlider", 11)
|
22
22
|
#
|
23
23
|
# @param [String, Hash, Calabash::Query] query A query to that indicates
|
24
24
|
# in which slider to set the value.
|
25
25
|
# @param [Numeric] value The value to set the slider to. value.to_s should
|
26
26
|
# produce a String representation of a Number.
|
27
|
-
#
|
28
|
-
# @param [
|
29
|
-
# @option options [Boolean] :animate (true) Animate the change.
|
30
|
-
# @option options [Boolean] :notify_targets (true) Simulate a UIEvent by
|
27
|
+
# @param [Boolean] animate (default: true) Animate the change.
|
28
|
+
# @param [Boolean] notify_targets (default: true) simulate a UIEvent by
|
31
29
|
# calling every target/action pair defined on the UISlider matching
|
32
30
|
# `query`.
|
33
31
|
#
|
34
32
|
# @raise [RuntimeError] When `query` does not match exactly one slider.
|
35
33
|
# @raise [RuntimeError] When setting the value of the slider matched by
|
36
34
|
# `query` is not successful.
|
37
|
-
def slider_set_value(query, value,
|
35
|
+
def slider_set_value(query, value, animate: true, notify_targets: true)
|
38
36
|
Query.ensure_valid_query(query)
|
39
37
|
|
40
|
-
default_options = {
|
41
|
-
:animate => true,
|
42
|
-
:notify_targets => true
|
43
|
-
}
|
44
|
-
|
45
|
-
merged_options = default_options.merge(options)
|
46
|
-
|
47
38
|
found_none = "Expected '#{query}' to match exactly one view, but found no matches."
|
48
39
|
query_object = Query.new(query)
|
49
40
|
wait_for(found_none) do
|
@@ -53,7 +44,7 @@ module Calabash
|
|
53
44
|
"Expected '#{query}' to match exactly one view, but found '#{results.length}'",
|
54
45
|
results.join("\n")
|
55
46
|
].join("\n")
|
56
|
-
|
47
|
+
raise message
|
57
48
|
else
|
58
49
|
results.length == 1
|
59
50
|
end
|
@@ -61,9 +52,11 @@ module Calabash
|
|
61
52
|
|
62
53
|
value_str = value.to_s
|
63
54
|
|
64
|
-
args = [
|
55
|
+
args = [animate, notify_targets]
|
65
56
|
|
66
|
-
|
57
|
+
Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
58
|
+
device.map_route(query, :changeSlider, value_str, *args)
|
59
|
+
end
|
67
60
|
end
|
68
61
|
end
|
69
62
|
end
|
data/lib/calabash/ios/text.rb
CHANGED
@@ -3,21 +3,21 @@ module Calabash
|
|
3
3
|
# Methods for entering text and interacting with iOS keyboards.
|
4
4
|
module Text
|
5
5
|
# @!visibility private
|
6
|
-
|
6
|
+
define_method(:_enter_text) do |text|
|
7
7
|
wait_for_keyboard
|
8
8
|
existing_text = text_from_keyboard_first_responder
|
9
9
|
options = { existing_text: existing_text }
|
10
|
-
|
10
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.enter_text(text, options)}
|
11
11
|
end
|
12
12
|
|
13
13
|
# @!visibility private
|
14
|
-
|
14
|
+
define_method(:_enter_text_in) do |view, text|
|
15
15
|
tap(view)
|
16
16
|
enter_text(text)
|
17
17
|
end
|
18
18
|
|
19
19
|
# @!visibility private
|
20
|
-
|
20
|
+
define_method(:_clear_text) do
|
21
21
|
unless view_exists?("* isFirstResponder:1")
|
22
22
|
raise 'Cannot clear text. No view has focus'
|
23
23
|
end
|
@@ -26,7 +26,7 @@ module Calabash
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# @!visibility private
|
29
|
-
|
29
|
+
define_method(:_clear_text_in) do |view|
|
30
30
|
unless keyboard_visible?
|
31
31
|
tap(view)
|
32
32
|
wait_for_keyboard
|
@@ -35,6 +35,7 @@ module Calabash
|
|
35
35
|
unless wait_for_view(view)['text'].empty?
|
36
36
|
tap(view)
|
37
37
|
tap("UICalloutBarButton marked:'Select All'")
|
38
|
+
sleep 0.5
|
38
39
|
tap_keyboard_delete_key
|
39
40
|
end
|
40
41
|
|
@@ -49,7 +50,7 @@ module Calabash
|
|
49
50
|
#
|
50
51
|
# @return [Boolean] Returns true if a keyboard is visible and docked.
|
51
52
|
def docked_keyboard_visible?
|
52
|
-
|
53
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.docked_keyboard_visible?}
|
53
54
|
end
|
54
55
|
|
55
56
|
# Returns true if an undocked keyboard is visible.
|
@@ -59,7 +60,7 @@ module Calabash
|
|
59
60
|
# @return [Boolean] Returns false if the device is not an iPad; all
|
60
61
|
# keyboards on the iPhone and iPod are docked.
|
61
62
|
def undocked_keyboard_visible?
|
62
|
-
|
63
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.undocked_keyboard_visible?}
|
63
64
|
end
|
64
65
|
|
65
66
|
# Returns true if a split keyboard is visible.
|
@@ -70,7 +71,7 @@ module Calabash
|
|
70
71
|
# @return [Boolean] Returns false if the device is not an iPad; all
|
71
72
|
# keyboards on the Phone and iPod are docked and not split.
|
72
73
|
def split_keyboard_visible?
|
73
|
-
|
74
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.split_keyboard_visible?}
|
74
75
|
end
|
75
76
|
|
76
77
|
# Touches the keyboard action key.
|
@@ -90,86 +91,29 @@ module Calabash
|
|
90
91
|
# @todo Refactor uia_route to a public API call
|
91
92
|
# @todo Move this documentation to the public method
|
92
93
|
# @!visibility private
|
93
|
-
|
94
|
+
define_method(:_tap_keyboard_action_key) do |action_key|
|
94
95
|
unless action_key.nil?
|
95
96
|
raise ArgumentError,
|
96
97
|
"An iOS keyboard does not have multiple action keys"
|
97
98
|
end
|
98
99
|
|
99
|
-
|
100
|
-
|
100
|
+
wait_for_keyboard
|
101
|
+
Calabash::Internal.with_default_device(required_os: :ios) {|device| device.tap_keyboard_action_key}
|
101
102
|
end
|
102
103
|
|
103
104
|
# @!visibility private
|
104
|
-
|
105
|
+
define_method(:_keyboard_visible?) do
|
105
106
|
docked_keyboard_visible? || undocked_keyboard_visible? || split_keyboard_visible?
|
106
107
|
end
|
107
108
|
|
108
109
|
# Touches the keyboard delete key.
|
109
|
-
#
|
110
|
-
# The 'delete' key difficult to find and touch because its behavior
|
111
|
-
# changes depending on the iOS version and keyboard type. Consider the
|
112
|
-
# following:
|
113
|
-
#
|
114
|
-
# On iOS 6, the 'delete' char code is _not_ \b.
|
115
|
-
# On iOS 7: The Delete char code is \b on non-numeric keyboards.
|
116
|
-
# On numeric keyboards, the delete key is a button on the
|
117
|
-
# the keyboard.
|
118
|
-
#
|
119
|
-
# By default, Calabash uses a raw UIAutomaton JavaScript call to tap the
|
120
|
-
# element named 'Delete'. This works well in English localizations for
|
121
|
-
# most keyboards. If you find that it does not work, use the options
|
122
|
-
# pass either an translation of 'Delete' for your localization or use the
|
123
|
-
# default the escaped keyboard character.
|
124
|
-
#
|
125
110
|
# @example
|
126
|
-
#
|
127
|
-
# tap_keyboard_delete_key
|
128
|
-
#
|
129
|
-
# # Types the \b key.
|
130
|
-
# tap_keyboard_delete_key({:use_escaped_char => true})
|
111
|
+
# cal_ios.tap_keyboard_delete_key
|
131
112
|
#
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
# # Uses UIAutomation to tap the 'Slet' key or button.
|
136
|
-
# tap_keyboard_delete_key({:delete_key_label => 'Slet'})
|
137
|
-
#
|
138
|
-
# # Don't specify both options! If :use_escape_sequence is truthy,
|
139
|
-
# # Calabash will ignore the :delete_key_label and try to use an
|
140
|
-
# # escaped character sequence.
|
141
|
-
# tap_keyboard_delete_key({:use_escaped_char => true,
|
142
|
-
# :delete_key_label => 'Slet'})
|
143
|
-
#
|
144
|
-
# @param [Hash] options Alternative ways to tap the delete key.
|
145
|
-
# @option options [Boolean, String] :use_escaped_char (false) If true,
|
146
|
-
# delete by typing the \b character. If this value is truthy, but not
|
147
|
-
# 'true', they it is expected to be an alternative escaped character.
|
148
|
-
# @option options [String] :delete_key_label ('Delete') An alternative
|
149
|
-
# localization of 'Delete'.
|
150
|
-
# @todo Need translations of 'Delete' key.
|
151
|
-
def tap_keyboard_delete_key(options = {})
|
152
|
-
default_options =
|
153
|
-
{
|
154
|
-
use_escaped_char: false,
|
155
|
-
delete_key_label: 'Delete'
|
156
|
-
}
|
157
|
-
merged_options = default_options.merge(options)
|
158
|
-
|
159
|
-
use_escape_sequence = merged_options[:use_escaped_char]
|
160
|
-
if use_escape_sequence
|
161
|
-
if use_escape_sequence.to_s == 'true'
|
162
|
-
# Use the default \b
|
163
|
-
char_sequence = ESCAPED_KEYBOARD_CHARACTERS[:delete]
|
164
|
-
else
|
165
|
-
char_sequence = use_escape_sequence
|
166
|
-
end
|
167
|
-
return Device.default.uia_route("uia.keyboard().typeString('#{char_sequence}')")
|
113
|
+
def tap_keyboard_delete_key
|
114
|
+
Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
115
|
+
device.tap_keyboard_delete_key
|
168
116
|
end
|
169
|
-
|
170
|
-
delete_key_label = merged_options[:delete_key_label]
|
171
|
-
uia = "uia.keyboard().elements().firstWithName('#{delete_key_label}').tap()"
|
172
|
-
Device.default.uia_route(uia)
|
173
117
|
end
|
174
118
|
|
175
119
|
# Returns the the text in the first responder.
|
@@ -183,7 +127,9 @@ module Calabash
|
|
183
127
|
#
|
184
128
|
# @raise [RuntimeError] If there is no visible keyboard.
|
185
129
|
def text_from_keyboard_first_responder
|
186
|
-
|
130
|
+
Calabash::Internal.with_default_device(required_os: :ios) do |device|
|
131
|
+
device.text_from_keyboard_first_responder
|
132
|
+
end
|
187
133
|
end
|
188
134
|
|
189
135
|
private
|