calabash 2.0.0.pre11 → 2.0.0.prelegacy
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 +17 -5
- data/bin/calabash +4 -3
- data/lib/calabash/android/adb.rb +37 -34
- 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 +46 -204
- data/lib/calabash/android/environment.rb +1 -14
- data/lib/calabash/android/gestures.rb +22 -6
- data/lib/calabash/android/interactions.rb +17 -14
- data/lib/calabash/android/legacy.rb +141 -4
- data/lib/calabash/android/lib/.irbrc +1 -9
- data/lib/calabash/android/lib/AndroidManifest.xml +2 -23
- 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 +16 -19
- data/lib/calabash/android/server.rb +1 -6
- data/lib/calabash/android/text.rb +12 -12
- data/lib/calabash/android.rb +26 -92
- data/lib/calabash/application.rb +0 -3
- data/lib/calabash/cli/generate.rb +18 -8
- data/lib/calabash/cli/helpers.rb +9 -4
- data/lib/calabash/cli/run.rb +1 -1
- data/lib/calabash/console_helpers.rb +11 -179
- data/lib/calabash/device.rb +19 -4
- data/lib/calabash/gestures.rb +198 -292
- data/lib/calabash/http/retriable_client.rb +3 -18
- data/lib/calabash/http.rb +0 -1
- data/lib/calabash/interactions.rb +40 -3
- data/lib/calabash/ios/conditions.rb +1 -1
- data/lib/calabash/ios/console_helpers.rb +2 -2
- data/lib/calabash/ios/date_picker.rb +8 -10
- data/lib/calabash/ios/device/device_implementation.rb +21 -9
- data/lib/calabash/ios/device/gestures_mixin.rb +55 -53
- data/lib/calabash/ios/device/keyboard_mixin.rb +0 -21
- data/lib/calabash/ios/device/rotation_mixin.rb +65 -3
- data/lib/calabash/ios/device/text_mixin.rb +21 -0
- data/lib/calabash/ios/device.rb +1 -0
- data/lib/calabash/ios/gestures.rb +90 -24
- data/lib/calabash/ios/interactions.rb +6 -1
- data/lib/calabash/ios/lib/.irbrc +2 -9
- data/lib/calabash/ios/orientation.rb +8 -8
- data/lib/calabash/ios/runtime.rb +14 -14
- data/lib/calabash/ios/scroll.rb +17 -25
- data/lib/calabash/ios/slider.rb +18 -11
- data/lib/calabash/ios/text.rb +74 -20
- data/lib/calabash/ios/uia.rb +1 -1
- data/lib/calabash/ios.rb +16 -77
- data/lib/calabash/legacy.rb +6 -9
- data/lib/calabash/lib/skeleton/{Gemfile.skeleton → Gemfile} +0 -0
- data/lib/calabash/lib/skeleton/config/{cucumber.yml.skeleton → cucumber.yml} +0 -0
- data/lib/calabash/lib/skeleton/features/{sample.feature.skeleton → sample.feature} +0 -0
- data/lib/calabash/lib/skeleton/features/step_definitions/{sample_steps.rb.skeleton → calabash_steps.rb} +8 -8
- data/lib/calabash/lib/skeleton/features/support/{dry_run.rb.skeleton → dry_run.rb} +5 -2
- data/lib/calabash/lib/skeleton/features/support/{env.rb.skeleton → env.rb} +8 -2
- data/lib/calabash/lib/skeleton/features/support/hooks.rb +83 -0
- data/lib/calabash/life_cycle.rb +8 -16
- data/lib/calabash/location.rb +15 -14
- data/lib/calabash/orientation.rb +8 -8
- data/lib/calabash/page.rb +4 -1
- data/lib/calabash/screenshot.rb +3 -3
- data/lib/calabash/text.rb +19 -31
- data/lib/calabash/utility.rb +8 -41
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +192 -177
- data/lib/calabash.rb +10 -53
- metadata +32 -43
- data/lib/calabash/android/device/helper_application.rb +0 -95
- data/lib/calabash/android/lib/HelperApplication.apk +0 -0
- data/lib/calabash/android/lib/HelperApplicationTestServer.apk +0 -0
- data/lib/calabash/android/web.rb +0 -12
- data/lib/calabash/http/forwarding_client.rb +0 -23
- data/lib/calabash/internal.rb +0 -48
- data/lib/calabash/ios/automator/automator.rb +0 -217
- data/lib/calabash/ios/automator/coordinates.rb +0 -37
- data/lib/calabash/ios/automator/device_agent.rb +0 -379
- data/lib/calabash/ios/automator.rb +0 -9
- data/lib/calabash/ios/legacy.rb +0 -6
- data/lib/calabash/ios/web.rb +0 -10
- data/lib/calabash/lib/skeleton/features/support/hooks.rb.skeleton +0 -34
- data/lib/calabash/retry.rb +0 -33
- data/lib/calabash/stubs.rb +0 -21
- data/lib/calabash/web.rb +0 -44
@@ -33,9 +33,6 @@ module Calabash
|
|
33
33
|
'Content-Type' => 'application/json;charset=utf-8'
|
34
34
|
}
|
35
35
|
|
36
|
-
# @!visibility private
|
37
|
-
attr_accessor :port_forward
|
38
|
-
|
39
36
|
# Creates a new retriable client.
|
40
37
|
#
|
41
38
|
# This initializer takes multiple options. If the option is not
|
@@ -110,7 +107,7 @@ module Calabash
|
|
110
107
|
retries = options.fetch(:retries, @retries)
|
111
108
|
timeout = options.fetch(:timeout, @timeout)
|
112
109
|
interval = options.fetch(:interval, @interval)
|
113
|
-
header =
|
110
|
+
header = options.fetch(:header, HEADER)
|
114
111
|
|
115
112
|
@logger.log "Getting: #{@server.endpoint + request.route} #{options}"
|
116
113
|
|
@@ -134,20 +131,8 @@ module Calabash
|
|
134
131
|
client.receive_timeout = [time_diff, client.receive_timeout].min
|
135
132
|
|
136
133
|
begin
|
137
|
-
|
138
|
-
|
139
|
-
request.params, header)
|
140
|
-
else
|
141
|
-
if request.params.is_a?(Hash)
|
142
|
-
if request.params.key?(:json)
|
143
|
-
return client.send(request_method, @server.endpoint + request.route,
|
144
|
-
{body: request.params[:json]}.merge(header: header))
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
return client.send(request_method, @server.endpoint + request.route,
|
149
|
-
{body: request.params}.merge(header: header))
|
150
|
-
end
|
134
|
+
return client.send(request_method, @server.endpoint + request.route,
|
135
|
+
request.params, header)
|
151
136
|
rescue *RETRY_ON => e
|
152
137
|
@logger.log "Http error: #{e}"
|
153
138
|
|
data/lib/calabash/http.rb
CHANGED
@@ -62,7 +62,7 @@ module Calabash
|
|
62
62
|
#
|
63
63
|
# @return [Calabash::QueryResult] A result of the query
|
64
64
|
def query(query, *args)
|
65
|
-
Calabash::
|
65
|
+
Calabash::Device.default.map_route(Query.new(query), :query, *args)
|
66
66
|
end
|
67
67
|
|
68
68
|
# Flashes any views matching `query`. Only one view is flashed at a time,
|
@@ -71,7 +71,39 @@ module Calabash
|
|
71
71
|
# @param [String, Hash, Calabash::Query] query The query to match the
|
72
72
|
# view(s)
|
73
73
|
def flash(query)
|
74
|
-
Calabash::
|
74
|
+
Calabash::Device.default.map_route(Query.new(query), :flash)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Evaluate javascript in a Web View. On iOS, an implicit return is
|
78
|
+
# inserted, on Android an explicit return is needed.
|
79
|
+
#
|
80
|
+
# @example
|
81
|
+
# # iOS
|
82
|
+
# evaluate_javascript_in("UIWebView", "2+2")
|
83
|
+
# # Android
|
84
|
+
# evaluate_javascript_in("WebView", "return 2+2")
|
85
|
+
#
|
86
|
+
# @example
|
87
|
+
# # iOS
|
88
|
+
# evaluate_javascript_in("WKWebView",
|
89
|
+
# "document.body.style.backgroundColor = 'red';")
|
90
|
+
#
|
91
|
+
# # Android
|
92
|
+
# evaluate_javascript_in("XWalkContent",
|
93
|
+
# "document.body.style.backgroundColor = 'red';")
|
94
|
+
#
|
95
|
+
# @note No error will be raised if the javascript given is invalid, or
|
96
|
+
# throws an exception.
|
97
|
+
#
|
98
|
+
# @param [String, Hash, Calabash::Query] query Query that matches the view
|
99
|
+
# @param [String] javascript The javascript to evaluate
|
100
|
+
#
|
101
|
+
# @raise ViewNotFoundError If no views are found matching `query`
|
102
|
+
def evaluate_javascript_in(query, javascript)
|
103
|
+
wait_for_view(query,
|
104
|
+
timeout: Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT)
|
105
|
+
|
106
|
+
_evaluate_javascript_in(query, javascript)
|
75
107
|
end
|
76
108
|
|
77
109
|
# Invoke a method in your application.
|
@@ -126,7 +158,12 @@ module Calabash
|
|
126
158
|
# @return [Object] the result of performing the selector/method with the
|
127
159
|
# arguments (serialized)
|
128
160
|
def backdoor(name, *arguments)
|
129
|
-
|
161
|
+
Device.default.backdoor(name, *arguments)
|
162
|
+
end
|
163
|
+
|
164
|
+
# @!visibility private
|
165
|
+
def _evaluate_javascript_in(query, javascript)
|
166
|
+
abstract_method!
|
130
167
|
end
|
131
168
|
end
|
132
169
|
end
|
@@ -72,7 +72,7 @@ module Calabash
|
|
72
72
|
# @return [nil] When the condition is satisfied.
|
73
73
|
# @raise [Calabash::Wait::TimeoutError] When the timeout is exceeded.
|
74
74
|
def wait_for_condition(condition, timeout, timeout_message, query='*')
|
75
|
-
unless
|
75
|
+
unless Device.default.condition_route(condition, timeout, query)
|
76
76
|
raise Calabash::Wait::TimeoutError, timeout_message
|
77
77
|
end
|
78
78
|
true
|
@@ -55,7 +55,7 @@ module Calabash
|
|
55
55
|
Calabash::Device.default = device
|
56
56
|
|
57
57
|
begin
|
58
|
-
Calabash::
|
58
|
+
Calabash::Device.default.ensure_test_server_ready({:timeout => 4})
|
59
59
|
rescue RuntimeError => e
|
60
60
|
if e.to_s == 'Calabash server did not respond'
|
61
61
|
raise RuntimeError, 'You can only attach to a running Calabash iOS App'
|
@@ -65,7 +65,7 @@ module Calabash
|
|
65
65
|
end
|
66
66
|
|
67
67
|
run_loop_device = device.send(:run_loop_device)
|
68
|
-
result = Calabash::
|
68
|
+
result = Calabash::Device.default.send(:attach_to_run_loop, run_loop_device, uia_strategy)
|
69
69
|
result[:application] = Calabash::Application.default
|
70
70
|
result
|
71
71
|
end
|
@@ -378,16 +378,14 @@ module Calabash
|
|
378
378
|
objc_format = date_picker_objc_date_format
|
379
379
|
target_date_string = date_time.strftime(ruby_format).squeeze(' ').strip
|
380
380
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
true)
|
390
|
-
end
|
381
|
+
Device.default.map_route(query,
|
382
|
+
:changeDatePickerDate,
|
383
|
+
target_date_string,
|
384
|
+
objc_format,
|
385
|
+
# notify targets
|
386
|
+
true,
|
387
|
+
# animate
|
388
|
+
true)
|
391
389
|
end
|
392
390
|
|
393
391
|
private
|
@@ -17,11 +17,13 @@ module Calabash
|
|
17
17
|
include Calabash::IOS::RotationMixin
|
18
18
|
include Calabash::IOS::KeyboardMixin
|
19
19
|
include Calabash::IOS::UIAKeyboardMixin
|
20
|
+
include Calabash::IOS::TextMixin
|
20
21
|
include Calabash::IOS::UIAMixin
|
21
22
|
include Calabash::IOS::IPadMixin
|
22
23
|
include Calabash::IOS::GesturesMixin
|
23
24
|
|
24
25
|
attr_reader :run_loop
|
26
|
+
attr_reader :uia_strategy
|
25
27
|
attr_reader :start_options
|
26
28
|
|
27
29
|
# Returns the default simulator identifier. The string that is return
|
@@ -48,7 +50,7 @@ module Calabash
|
|
48
50
|
if run_loop_device.nil?
|
49
51
|
raise "Could not find a simulator with a UDID or name matching '#{identifier}'"
|
50
52
|
end
|
51
|
-
run_loop_device.instruments_identifier
|
53
|
+
run_loop_device.instruments_identifier
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
@@ -82,14 +84,14 @@ module Calabash
|
|
82
84
|
elsif connected_devices.count > 1
|
83
85
|
raise 'There is more than one physical devices connected. Use CAL_DEVICE_ID to indicate which you want to connect to.'
|
84
86
|
else
|
85
|
-
connected_devices.first.instruments_identifier
|
87
|
+
connected_devices.first.instruments_identifier
|
86
88
|
end
|
87
89
|
else
|
88
90
|
run_loop_device = Device.fetch_matching_physical_device(identifier)
|
89
91
|
if run_loop_device.nil?
|
90
92
|
raise "Could not find a physical device with a UDID or name matching '#{identifier}'"
|
91
93
|
end
|
92
|
-
run_loop_device.instruments_identifier
|
94
|
+
run_loop_device.instruments_identifier
|
93
95
|
end
|
94
96
|
end
|
95
97
|
|
@@ -343,7 +345,8 @@ module Calabash
|
|
343
345
|
|
344
346
|
{
|
345
347
|
:device => self,
|
346
|
-
:application => application
|
348
|
+
:application => application,
|
349
|
+
:uia_strategy => uia_strategy
|
347
350
|
}
|
348
351
|
end
|
349
352
|
|
@@ -391,7 +394,7 @@ module Calabash
|
|
391
394
|
def start_app_with_device_and_options(application, run_loop_device, user_defined_options)
|
392
395
|
start_options = merge_start_options!(application, run_loop_device, user_defined_options)
|
393
396
|
@run_loop = RunLoop.run(start_options)
|
394
|
-
@
|
397
|
+
@uia_strategy = @run_loop[:uia_strategy]
|
395
398
|
end
|
396
399
|
|
397
400
|
# @!visibility private
|
@@ -525,6 +528,12 @@ module Calabash
|
|
525
528
|
end
|
526
529
|
end
|
527
530
|
|
531
|
+
# @!visibility private
|
532
|
+
def enter_text(text)
|
533
|
+
# @todo implement this
|
534
|
+
raise 'ni'
|
535
|
+
end
|
536
|
+
|
528
537
|
# @!visibility private
|
529
538
|
def clear_app_data_on_simulator(application, run_loop_device, bridge)
|
530
539
|
begin
|
@@ -621,8 +630,9 @@ module Calabash
|
|
621
630
|
# @!visibility private
|
622
631
|
# Expensive!
|
623
632
|
def Device.fetch_matching_simulator(udid_or_name)
|
624
|
-
RunLoop::SimControl.new
|
625
|
-
|
633
|
+
sim_control = RunLoop::SimControl.new
|
634
|
+
sim_control.simulators.detect do |sim|
|
635
|
+
sim.instruments_identifier == udid_or_name ||
|
626
636
|
sim.udid == udid_or_name
|
627
637
|
end
|
628
638
|
end
|
@@ -652,7 +662,7 @@ module Calabash
|
|
652
662
|
Logger.error('which resolves to a physical device.')
|
653
663
|
Logger.error("The server endpoint '#{server.endpoint}' is for an iOS Simulator.")
|
654
664
|
Logger.error('Use CAL_ENDPOINT to specify the IP address of your device')
|
655
|
-
Logger.error("Ex. $ CAL_ENDPOINT=http://10.0.1.2:37265 CAL_DEVICE_ID=#{identifier}
|
665
|
+
Logger.error("Ex. $ CAL_ENDPOINT=http://10.0.1.2:37265 CAL_DEVICE_ID=#{identifier} be calabash ...")
|
656
666
|
raise "Invalid device endpoint '#{server.endpoint}'"
|
657
667
|
end
|
658
668
|
end
|
@@ -693,7 +703,7 @@ module Calabash
|
|
693
703
|
{
|
694
704
|
:app => application.path,
|
695
705
|
:bundle_id => application.identifier,
|
696
|
-
:device_target => run_loop_device.instruments_identifier
|
706
|
+
:device_target => run_loop_device.instruments_identifier,
|
697
707
|
:uia_strategy => strategy
|
698
708
|
}
|
699
709
|
@start_options = default_options.merge(options_from_user)
|
@@ -765,11 +775,13 @@ module Calabash
|
|
765
775
|
|
766
776
|
if strategy == :host
|
767
777
|
@run_loop = RunLoop::HostCache.default.read
|
778
|
+
@uia_strategy = :host
|
768
779
|
else
|
769
780
|
pid = instruments_pid
|
770
781
|
@run_loop = {}
|
771
782
|
@run_loop[:uia_strategy] = strategy
|
772
783
|
@run_loop[:pid] = pid
|
784
|
+
@uia_strategy = strategy
|
773
785
|
end
|
774
786
|
|
775
787
|
# populate the @runtime_attributes
|
@@ -96,33 +96,36 @@ module Calabash
|
|
96
96
|
|
97
97
|
# @!visibility private
|
98
98
|
def _tap(query, options={})
|
99
|
-
view_to_touch = _gesture_waiter.wait_for_view(query,
|
99
|
+
view_to_touch = _gesture_waiter.wait_for_view(query, options)
|
100
100
|
|
101
101
|
rect = view_to_touch['rect']
|
102
102
|
x = rect['x'] + (rect['width'] * (options[:at][:x] / 100.0)).to_i
|
103
103
|
y = rect['y'] + (rect['height'] * (options[:at][:y] / 100.0)).to_i
|
104
104
|
|
105
|
-
|
105
|
+
offset = coordinate(x, y)
|
106
|
+
|
107
|
+
uia_serialize_and_call(:tapOffset, offset, options)
|
106
108
|
|
107
109
|
Calabash::QueryResult.create([view_to_touch], query)
|
108
110
|
end
|
109
111
|
|
110
112
|
# @!visibility private
|
111
113
|
def _double_tap(query, options={})
|
112
|
-
view_to_touch = _gesture_waiter.wait_for_view(query,
|
114
|
+
view_to_touch = _gesture_waiter.wait_for_view(query, options)
|
113
115
|
|
114
116
|
rect = view_to_touch['rect']
|
115
117
|
x = rect['x'] + (rect['width'] * (options[:at][:x] / 100.0)).to_i
|
116
118
|
y = rect['y'] + (rect['height'] * (options[:at][:y] / 100.0)).to_i
|
117
119
|
|
118
|
-
|
120
|
+
offset = coordinate(x, y)
|
121
|
+
|
122
|
+
uia_serialize_and_call(:doubleTapOffset, offset, options)
|
119
123
|
|
120
124
|
Calabash::QueryResult.create([view_to_touch], query)
|
121
125
|
end
|
122
126
|
|
123
127
|
# @!visibility private
|
124
128
|
def _long_press(query, options={})
|
125
|
-
options[:duration] += 0.2
|
126
129
|
|
127
130
|
begin
|
128
131
|
_expect_valid_duration(options)
|
@@ -130,66 +133,39 @@ module Calabash
|
|
130
133
|
raise ArgumentError e
|
131
134
|
end
|
132
135
|
|
133
|
-
view_to_touch = _gesture_waiter.wait_for_view(query,
|
136
|
+
view_to_touch = _gesture_waiter.wait_for_view(query, options)
|
134
137
|
|
135
138
|
rect = view_to_touch['rect']
|
136
139
|
x = rect['x'] + (rect['width'] * (options[:at][:x] / 100.0)).to_i
|
137
140
|
y = rect['y'] + (rect['height'] * (options[:at][:y] / 100.0)).to_i
|
138
141
|
|
139
|
-
|
142
|
+
offset = coordinate(x, y)
|
143
|
+
|
144
|
+
uia_serialize_and_call(:touchHoldOffset, options[:duration], offset)
|
140
145
|
|
141
146
|
Calabash::QueryResult.create([view_to_touch], query)
|
142
147
|
end
|
143
148
|
|
144
149
|
# @!visibility private
|
145
150
|
def _pan_between(query_from, query_to, options={})
|
146
|
-
from_query_result = nil
|
147
|
-
to_query_result = nil
|
148
|
-
from = coordinate(0, 0)
|
149
|
-
to = coordinate(0, 0)
|
150
|
-
|
151
|
-
unless query_from.nil?
|
152
|
-
from_view = _gesture_waiter.wait_for_view(query_from, timeout: options[:timeout])
|
153
|
-
from = coordinate(from_view['rect']['center_x'], from_view['rect']['center_y'])
|
154
|
-
from_query_result = Calabash::QueryResult.create([from_view], query_from)
|
155
|
-
end
|
156
151
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
152
|
+
begin
|
153
|
+
_expect_valid_duration(options)
|
154
|
+
rescue ArgumentError => e
|
155
|
+
raise ArgumentError e
|
161
156
|
end
|
162
157
|
|
163
|
-
|
164
|
-
|
165
|
-
if offset
|
166
|
-
from_offset = offset[:from]
|
167
|
-
|
168
|
-
if from_offset
|
169
|
-
x, y = from_offset[:x], from_offset[:y]
|
158
|
+
from_view = _gesture_waiter.wait_for_view(query_from, options)
|
159
|
+
to_view = _gesture_waiter.wait_for_view(query_to, options)
|
170
160
|
|
171
|
-
|
172
|
-
|
173
|
-
end
|
174
|
-
|
175
|
-
to_offset = offset[:to]
|
176
|
-
|
177
|
-
if from_offset
|
178
|
-
x, y = to_offset[:x], to_offset[:y]
|
179
|
-
|
180
|
-
to[:x] += x || 0
|
181
|
-
to[:y] += y || 0
|
182
|
-
end
|
183
|
-
end
|
161
|
+
from_offset = uia_center_of_view(from_view)
|
162
|
+
to_offset = uia_center_of_view(to_view)
|
184
163
|
|
185
|
-
|
186
|
-
{from: from,
|
187
|
-
to: to},
|
188
|
-
duration: options[:duration]})
|
164
|
+
uia_serialize_and_call(:panOffset, from_offset, to_offset, options)
|
189
165
|
|
190
166
|
{
|
191
|
-
:from =>
|
192
|
-
:to =>
|
167
|
+
:from => Calabash::QueryResult.create([from_view], query_from),
|
168
|
+
:to => Calabash::QueryResult.create([to_view], query_to)
|
193
169
|
}
|
194
170
|
end
|
195
171
|
|
@@ -202,24 +178,50 @@ module Calabash
|
|
202
178
|
# If the view has a UINavigationBar or UITabBar, the defaults *might*
|
203
179
|
# cause vertical gestures to start and/or end on one of these bars.
|
204
180
|
def _pan(query, from, to, options={})
|
181
|
+
|
182
|
+
begin
|
183
|
+
_expect_valid_duration(options)
|
184
|
+
rescue ArgumentError => e
|
185
|
+
raise ArgumentError, e
|
186
|
+
end
|
187
|
+
|
205
188
|
gesture_waiter = _gesture_waiter
|
206
|
-
view_to_pan = gesture_waiter.wait_for_view(query,
|
189
|
+
view_to_pan = gesture_waiter.wait_for_view(query, options)
|
190
|
+
|
191
|
+
begin
|
192
|
+
check_for_broken_uia_automation(query, view_to_pan, gesture_waiter)
|
193
|
+
rescue => e
|
194
|
+
raise "Could not pan with query: #{query}\n#{e.message}"
|
195
|
+
end
|
207
196
|
|
208
197
|
rect = view_to_pan['rect']
|
209
198
|
|
210
199
|
from_x = rect['width'] * (from[:x]/100.0)
|
211
200
|
from_y = rect['height'] * (from[:y]/100.0)
|
201
|
+
from_offset = coordinate(from_x, from_y)
|
212
202
|
|
213
203
|
to_x = rect['width'] * (to[:x]/100.0)
|
214
204
|
to_y = rect['height'] * (to[:y]/100.0)
|
205
|
+
to_offset = coordinate(to_x, to_y)
|
215
206
|
|
216
|
-
|
217
|
-
duration: options[:duration]})
|
218
|
-
|
207
|
+
uia_serialize_and_call(:panOffset, from_offset, to_offset)
|
219
208
|
|
220
209
|
Calabash::QueryResult.create([view_to_pan], query)
|
221
210
|
end
|
222
211
|
|
212
|
+
# @!visibility private
|
213
|
+
def pan_screen(view_to_pan, from_offset, to_offset, options)
|
214
|
+
begin
|
215
|
+
_expect_valid_duration(options)
|
216
|
+
rescue ArgumentError => e
|
217
|
+
raise ArgumentError, e
|
218
|
+
end
|
219
|
+
|
220
|
+
uia_serialize_and_call(:panOffset, from_offset, to_offset, options)
|
221
|
+
|
222
|
+
Calabash::QueryResult.create([view_to_pan], '*')
|
223
|
+
end
|
224
|
+
|
223
225
|
# @!visibility private
|
224
226
|
# @todo The default to and from for the screen_* methods are not good for iOS.
|
225
227
|
#
|
@@ -236,7 +238,7 @@ module Calabash
|
|
236
238
|
end
|
237
239
|
|
238
240
|
gesture_waiter = _gesture_waiter
|
239
|
-
view_to_flick = gesture_waiter.wait_for_view(query,
|
241
|
+
view_to_flick = gesture_waiter.wait_for_view(query, options)
|
240
242
|
|
241
243
|
begin
|
242
244
|
check_for_broken_uia_automation(query, view_to_flick, gesture_waiter)
|
@@ -285,7 +287,7 @@ module Calabash
|
|
285
287
|
|
286
288
|
gesture_waiter = _gesture_waiter
|
287
289
|
|
288
|
-
view_to_pinch = gesture_waiter.wait_for_view(query,
|
290
|
+
view_to_pinch = gesture_waiter.wait_for_view(query, options)
|
289
291
|
offset = uia_center_of_view(view_to_pinch)
|
290
292
|
|
291
293
|
gesture_direction = direction == :in ? :out : :in
|
@@ -3,12 +3,6 @@ module Calabash
|
|
3
3
|
|
4
4
|
# @!visibility private
|
5
5
|
module KeyboardMixin
|
6
|
-
# Enter `text` into the currently focused view.
|
7
|
-
# @see Calabash::Text#enter_text
|
8
|
-
# @!visibility private
|
9
|
-
def enter_text(text, options={})
|
10
|
-
@automator.enter_text_with_keyboard(text, options)
|
11
|
-
end
|
12
6
|
|
13
7
|
# Returns true if a docked keyboard is visible.
|
14
8
|
#
|
@@ -67,21 +61,6 @@ module Calabash
|
|
67
61
|
docked_keyboard_visible? || undocked_keyboard_visible? || split_keyboard_visible?
|
68
62
|
end
|
69
63
|
|
70
|
-
def tap_keyboard_delete_key(options={})
|
71
|
-
@automator.tap_keyboard_delete_key
|
72
|
-
end
|
73
|
-
|
74
|
-
def tap_keyboard_action_key
|
75
|
-
results = keyboard_waiter.query("* isFirstResponder:1", :returnKeyType)
|
76
|
-
|
77
|
-
if results.empty?
|
78
|
-
RunLoop.log_debug("Cannot find keyboard first responder to ask for its returnKeyType")
|
79
|
-
raise 'Cannot tap_keyboard_action_key. No view has focus'
|
80
|
-
end
|
81
|
-
|
82
|
-
@automator.tap_keyboard_action_key(results.first)
|
83
|
-
end
|
84
|
-
|
85
64
|
# Returns the the text in the first responder.
|
86
65
|
#
|
87
66
|
# The first responder will be the UITextField or UITextView instance
|
@@ -14,14 +14,55 @@ module Calabash
|
|
14
14
|
wait_for_server_to_start({:timeout => 1})
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
family = device_family
|
18
|
+
|
19
|
+
current_orientation = status_bar_orientation.to_sym
|
20
|
+
recording_name = nil
|
21
|
+
case direction
|
22
|
+
when :left
|
23
|
+
if current_orientation == :down
|
24
|
+
recording_name = 'left_home_down'
|
25
|
+
elsif current_orientation == :right
|
26
|
+
recording_name = 'left_home_right'
|
27
|
+
elsif current_orientation == :left
|
28
|
+
recording_name = 'left_home_left'
|
29
|
+
elsif current_orientation == :up
|
30
|
+
recording_name = 'left_home_up'
|
31
|
+
end
|
32
|
+
when :right
|
33
|
+
if current_orientation == :down
|
34
|
+
recording_name = 'right_home_down'
|
35
|
+
elsif current_orientation == :left
|
36
|
+
recording_name = 'right_home_left'
|
37
|
+
elsif current_orientation == :right
|
38
|
+
recording_name = 'right_home_right'
|
39
|
+
elsif current_orientation == :up
|
40
|
+
recording_name = 'right_home_up'
|
41
|
+
end
|
42
|
+
else
|
43
|
+
# Caller should have guarded us against this case.
|
44
|
+
raise ArgumentError, "Expected '#{direction}' to be :left or :right"
|
45
|
+
end
|
46
|
+
|
47
|
+
if family == 'iPad'
|
48
|
+
form_factor = 'ipad'
|
49
|
+
else
|
50
|
+
form_factor = 'iphone'
|
51
|
+
end
|
52
|
+
|
53
|
+
if recording_name.nil?
|
54
|
+
raise "Could not rotate device in direction '#{direction}' " \
|
55
|
+
"with orientation '#{current_orientation}'"
|
56
|
+
end
|
18
57
|
|
19
|
-
|
58
|
+
recording_name = "rotate_#{recording_name}"
|
59
|
+
playback_route(recording_name, form_factor)
|
20
60
|
end
|
21
61
|
|
22
62
|
# @!visibility private
|
23
63
|
# Caller must pass position one of these positions :down, :left, :right, :up
|
24
64
|
def rotate_home_button_to(position)
|
65
|
+
|
25
66
|
valid_positions = [:down, :left, :right, :up]
|
26
67
|
unless valid_positions.include?(position)
|
27
68
|
raise ArgumentError,
|
@@ -42,7 +83,28 @@ module Calabash
|
|
42
83
|
return orientation
|
43
84
|
end
|
44
85
|
|
45
|
-
|
86
|
+
family = device_family
|
87
|
+
|
88
|
+
if family == 'iPad'
|
89
|
+
form_factor = 'ipad'
|
90
|
+
else
|
91
|
+
form_factor = 'iphone'
|
92
|
+
end
|
93
|
+
|
94
|
+
ROTATION_CANDIDATES.each do |recording_name|
|
95
|
+
playback_route(recording_name, form_factor)
|
96
|
+
|
97
|
+
# Wait for rotation animation.
|
98
|
+
#
|
99
|
+
# Can't wait for animations because there might be animations other
|
100
|
+
# than rotation on the screen.
|
101
|
+
sleep(0.4)
|
102
|
+
|
103
|
+
orientation = status_bar_orientation.to_sym
|
104
|
+
if orientation == position
|
105
|
+
return orientation.to_s
|
106
|
+
end
|
107
|
+
end
|
46
108
|
|
47
109
|
orientation.to_s
|
48
110
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
# @!visibility private
|
4
|
+
module TextMixin
|
5
|
+
|
6
|
+
# @!visibility private
|
7
|
+
def enter_text(text)
|
8
|
+
wait_for_keyboard(Calabash::Wait.default_options[:timeout])
|
9
|
+
existing_text = text_from_keyboard_first_responder
|
10
|
+
options = { existing_text: existing_text }
|
11
|
+
uia_type_string(text, options)
|
12
|
+
end
|
13
|
+
|
14
|
+
# @!visibility private
|
15
|
+
def _enter_text_in(query, text)
|
16
|
+
_tap(query)
|
17
|
+
enter_text(text)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/calabash/ios/device.rb
CHANGED
@@ -16,6 +16,7 @@ module Calabash
|
|
16
16
|
require 'calabash/ios/device/rotation_mixin'
|
17
17
|
require 'calabash/ios/device/keyboard_mixin'
|
18
18
|
require 'calabash/ios/device/uia_keyboard_mixin'
|
19
|
+
require 'calabash/ios/device/text_mixin'
|
19
20
|
require 'calabash/ios/device/uia_mixin'
|
20
21
|
require 'calabash/ios/device/ipad_1x_2x_mixin'
|
21
22
|
require 'calabash/ios/device/device_implementation'
|