calabash 2.0.0.pre10 → 2.0.0.pre11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|