calabash 1.9.9.pre3 → 2.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -0
- data/bin/calabash +45 -36
- data/lib/calabash/android/build/builder.rb +1 -1
- data/lib/calabash/android/build/resigner.rb +19 -1
- data/lib/calabash/android/device.rb +13 -2
- data/lib/calabash/android/interactions.rb +104 -3
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +5 -4
- data/lib/calabash/android/physical_buttons.rb +4 -1
- data/lib/calabash/android/scroll.rb +5 -0
- data/lib/calabash/android/text.rb +10 -25
- data/lib/calabash/android.rb +3 -0
- data/lib/calabash/cli/generate.rb +2 -0
- data/lib/calabash/console_helpers.rb +4 -2
- data/lib/calabash/device.rb +1 -9
- data/lib/calabash/environment.rb +4 -0
- data/lib/calabash/gestures.rb +159 -66
- data/lib/calabash/http/retriable_client.rb +1 -1
- data/lib/calabash/interactions.rb +67 -5
- data/lib/calabash/ios/conditions.rb +0 -1
- data/lib/calabash/ios/device/device_implementation.rb +17 -5
- data/lib/calabash/ios/device/gestures_mixin.rb +202 -48
- data/lib/calabash/ios/device/rotation_mixin.rb +10 -8
- data/lib/calabash/ios/device/routes/handle_route_mixin.rb +5 -1
- data/lib/calabash/ios/device/runtime_attributes.rb +4 -5
- data/lib/calabash/ios/gestures.rb +82 -8
- data/lib/calabash/ios/orientation.rb +21 -21
- data/lib/calabash/ios/runtime.rb +146 -2
- data/lib/calabash/ios/slider.rb +70 -0
- data/lib/calabash/ios/text.rb +6 -2
- data/lib/calabash/ios/uia.rb +24 -2
- data/lib/calabash/ios.rb +2 -0
- data/lib/calabash/lib/skeleton/features/support/dry_run.rb +8 -0
- data/lib/calabash/life_cycle.rb +59 -30
- data/lib/calabash/location.rb +0 -1
- data/lib/calabash/orientation.rb +0 -1
- data/lib/calabash/page.rb +38 -5
- data/lib/calabash/patch/array.rb +7 -7
- data/lib/calabash/query.rb +17 -2
- data/lib/calabash/query_result.rb +10 -0
- data/lib/calabash/screenshot.rb +28 -8
- data/lib/calabash/text.rb +52 -8
- data/lib/calabash/utility.rb +3 -3
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +33 -11
- data/lib/calabash.rb +124 -13
- metadata +114 -111
data/lib/calabash/gestures.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
module Calabash
|
2
|
-
# Methods for performing gestures. Gestures are taps, flicks,
|
3
|
-
# and pans.
|
2
|
+
# Methods for performing gestures. Gestures are taps, flicks, and pans.
|
4
3
|
#
|
5
4
|
# Many gestures take an optional :duration. On iOS, the duration must be
|
6
5
|
# between 0.5 and 60 (seconds). This is a limitation of the UIAutomation API.
|
6
|
+
#
|
7
|
+
# @note All gestures have _undefined return values._ This is intentional.
|
8
|
+
# Please do not rely on return values of gestures in your tests. For
|
9
|
+
# convenience when working in the console, some gestures return sensible
|
10
|
+
# values. However, these values are subject to change.
|
7
11
|
module Gestures
|
8
12
|
|
9
13
|
# How long do we wait for a view to appear by default when performing a
|
10
14
|
# gesture.
|
11
15
|
DEFAULT_GESTURE_WAIT_TIMEOUT = 3
|
12
16
|
|
13
|
-
# Performs a
|
17
|
+
# Performs a **tap** on the first view that matches `query`.
|
14
18
|
#
|
15
19
|
# Taps the center of the view by default.
|
16
20
|
#
|
@@ -19,33 +23,25 @@ module Calabash
|
|
19
23
|
#
|
20
24
|
# ┬ ┌─────────────────────────────────────┐
|
21
25
|
# | │2 3│
|
22
|
-
# | │
|
26
|
+
# | │ │
|
23
27
|
# | │ │
|
24
28
|
# 200 px │ 1 │
|
25
29
|
# | │ │
|
26
|
-
# | │ 7 5 │ 6
|
27
30
|
# | │ │
|
31
|
+
# | │ 4 │
|
28
32
|
# ┴ └─────────────────────────────────────┘
|
29
33
|
#
|
30
34
|
# 1. tap("* marked:'email'")
|
31
35
|
# 2. tap("* marked:'email'", at: {x: 0, y: 0})
|
32
36
|
# 3. tap("* marked:'email'", at: {x: 100, y: 0})
|
33
|
-
# 4. tap("* marked:'email'",
|
34
|
-
# 5. tap("* marked:'email'", offset: {x: 20, y: 40})
|
35
|
-
# 6. tap("* marked:'email'", at: {x: 100, y: 75}, offset: {x: 80})
|
36
|
-
# 7. tap("* marked:'email'", at: {x: 50, y: 100},
|
37
|
-
# offset: {x: -80, y: -40})
|
37
|
+
# 4. tap("* marked:'email'", at: {x: 50, y: 100})
|
38
38
|
#
|
39
|
-
# @param [String] query A query describing the view
|
39
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
40
|
+
# to tap.
|
40
41
|
# @param [Hash] options Options for modifying the details of the touch.
|
41
42
|
# @option options [Hash] :at ({x: 50, y: 50}) The point at which the
|
42
43
|
# gesture originates from. It is a percentage-based translation using
|
43
|
-
# top-left `(0,0)` as the reference point.
|
44
|
-
# applied before any `:offset`.
|
45
|
-
# @option options [Hash] :offset ({x: 0, y: 0}) Offset to touch point.
|
46
|
-
# Offset supports an `:x` and `:y` key and causes the touch to be
|
47
|
-
# offset with `(x,y)`. This offset is always applied _after_ any
|
48
|
-
# translation performed by `:at`.
|
44
|
+
# top-left `(0,0)` as the reference point.
|
49
45
|
# @raise [ViewNotFoundError] If the `query` returns no results.
|
50
46
|
# @raise [ArgumentError] If `query` is invalid.
|
51
47
|
def tap(query, options={})
|
@@ -54,8 +50,17 @@ module Calabash
|
|
54
50
|
Device.default.tap(Query.new(query), options)
|
55
51
|
end
|
56
52
|
|
57
|
-
# Performs a
|
58
|
-
#
|
53
|
+
# Performs a **double_tap** on the first view that matches `query`.
|
54
|
+
#
|
55
|
+
# @see #tap
|
56
|
+
#
|
57
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
58
|
+
# to tap.
|
59
|
+
# @param [Hash] options Options for modifying the details of the touch.
|
60
|
+
# @option options [Hash] :at ({x: 50, y: 50}) The point at which the
|
61
|
+
# gesture originates from. It is a percentage-based translation using
|
62
|
+
# top-left `(0,0)` as the reference point.
|
63
|
+
#
|
59
64
|
# @raise [ViewNotFoundError] If the `query` returns no results.
|
60
65
|
# @raise [ArgumentError] If `query` is invalid.
|
61
66
|
def double_tap(query, options={})
|
@@ -64,12 +69,14 @@ module Calabash
|
|
64
69
|
Device.default.double_tap(Query.new(query), options)
|
65
70
|
end
|
66
71
|
|
67
|
-
# Performs a
|
72
|
+
# Performs a **long_press** on the first view that matches `query`.
|
73
|
+
#
|
68
74
|
# On iOS this is often referred to as _touch-and-hold_. On Android this
|
69
75
|
# is known variously as _press_, _long-push_, _press-and-hold_, or _hold_.
|
70
76
|
#
|
71
|
-
# @see tap
|
77
|
+
# @see #tap
|
72
78
|
#
|
79
|
+
# @param [String] query A query describing the view to tap.
|
73
80
|
# @param [Hash] options Options for modifying the details of the touch.
|
74
81
|
# @option options [Number] :duration (1.0) The amount of time in seconds to
|
75
82
|
# press. On iOS, the duration must be between 0.5 and 60.
|
@@ -82,11 +89,14 @@ module Calabash
|
|
82
89
|
Device.default.long_press(Query.new(query), options)
|
83
90
|
end
|
84
91
|
|
85
|
-
# Performs a
|
92
|
+
# Performs a **pan** on the first view that matches `query`.
|
93
|
+
#
|
86
94
|
# A pan is a straight line swipe that pauses at the final point
|
87
95
|
# before releasing the gesture. This is the general purpose pan method. For
|
88
96
|
# standardized pans see `pan_left`, `pan_right`, `pan_up`, and `pan_down`.
|
89
97
|
#
|
98
|
+
# Also known as **scroll** and **swipe**.
|
99
|
+
#
|
90
100
|
# @example
|
91
101
|
# Consider a pan on a scrollable view. When the finger is is released,
|
92
102
|
# the velocity of the view is zero.
|
@@ -112,7 +122,8 @@ module Calabash
|
|
112
122
|
# @see Calabash::IOS::Scroll#scroll_to_item
|
113
123
|
# @see Calabash::IOS::Scroll#scroll_to_item_with_mark
|
114
124
|
#
|
115
|
-
# @param [String] query A query describing the view
|
125
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
126
|
+
# to pan inside.
|
116
127
|
# @param [Hash] from `({:x, :y})` The point at which the gesture
|
117
128
|
# originates from.
|
118
129
|
# @param [Hash] to `({:x, :y})` The point at which the gesture
|
@@ -132,9 +143,11 @@ module Calabash
|
|
132
143
|
Device.default.pan(Query.new(query), from, to, options)
|
133
144
|
end
|
134
145
|
|
135
|
-
# Performs a
|
146
|
+
# Performs a **pan** from the center of the first view that matches
|
136
147
|
# `query_from` to the center of the first view that matches `query_to`.
|
137
148
|
#
|
149
|
+
# Also known as **drag and drop**.
|
150
|
+
#
|
138
151
|
# @example
|
139
152
|
# Panning between two elements.
|
140
153
|
# `pan_between("* id:'first'", "* id:'second'")`
|
@@ -171,56 +184,64 @@ module Calabash
|
|
171
184
|
Device.default.pan_between(Query.new(query_from), Query.new(query_to), options)
|
172
185
|
end
|
173
186
|
|
174
|
-
# Performs a
|
175
|
-
#
|
187
|
+
# Performs a **pan** heading _left_ on the first view that matches `query`.
|
188
|
+
#
|
189
|
+
# @see #pan
|
176
190
|
def pan_left(query, options={})
|
177
191
|
pan(query, {x: 90, y: 50}, {x: 10, y: 50}, options)
|
178
192
|
end
|
179
193
|
|
180
|
-
# Performs a
|
181
|
-
#
|
182
|
-
# @see pan
|
194
|
+
# Performs a **pan** heading _right_ on the first view that matches `query`.
|
195
|
+
#
|
196
|
+
# @see #pan
|
183
197
|
def pan_right(query, options={})
|
184
198
|
pan(query, {x: 10, y: 50}, {x: 90, y: 50}, options)
|
185
199
|
end
|
186
200
|
|
187
|
-
# Performs a
|
188
|
-
#
|
201
|
+
# Performs a **pan** heading _up_ on the first view that matches `query`.
|
202
|
+
#
|
203
|
+
# @see #pan
|
189
204
|
def pan_up(query, options={})
|
190
205
|
pan(query, {x: 50, y: 90}, {x: 50, y: 10}, options)
|
191
206
|
end
|
192
207
|
|
193
|
-
# Performs a
|
194
|
-
#
|
208
|
+
# Performs a **pan** heading _down_ on the first view that matches `query`.
|
209
|
+
#
|
210
|
+
# @see #pan
|
195
211
|
def pan_down(query, options={})
|
196
212
|
pan(query, {x: 50, y: 10}, {x: 50, y: 90}, options)
|
197
213
|
end
|
198
214
|
|
199
|
-
# Performs a
|
200
|
-
#
|
215
|
+
# Performs a **pan** heading _left_ on the screen.
|
216
|
+
#
|
217
|
+
# @see #pan
|
201
218
|
def pan_screen_left(options={})
|
202
219
|
pan_left('*', options)
|
203
220
|
end
|
204
221
|
|
205
|
-
# Performs a
|
206
|
-
#
|
222
|
+
# Performs a **pan** heading _right_ on the screen.
|
223
|
+
#
|
224
|
+
# @see #pan
|
207
225
|
def pan_screen_right(options={})
|
208
226
|
pan_right('*', options)
|
209
227
|
end
|
210
228
|
|
211
|
-
# Performs a
|
212
|
-
#
|
229
|
+
# Performs a **pan** heading _up_ on the screen.
|
230
|
+
#
|
231
|
+
# @see #pan
|
213
232
|
def pan_screen_up(options={})
|
214
233
|
_pan_screen_up(options)
|
215
234
|
end
|
216
235
|
|
217
|
-
# Performs a
|
218
|
-
#
|
236
|
+
# Performs a **pan** heading _down_ on the screen.
|
237
|
+
#
|
238
|
+
# @see #pan
|
219
239
|
def pan_screen_down(options={})
|
220
240
|
_pan_screen_down(options)
|
221
241
|
end
|
222
242
|
|
223
|
-
# Performs a
|
243
|
+
# Performs a **flick** on the first view that matches `query`.
|
244
|
+
#
|
224
245
|
# A flick is a straight line swipe that **lifts the finger while
|
225
246
|
# the gesture is still in motion**. This will often cause scrollable
|
226
247
|
# views to continue moving for some time after the gesture is released.
|
@@ -257,91 +278,163 @@ module Calabash
|
|
257
278
|
Device.default.flick(Query.new(query), from, to, options)
|
258
279
|
end
|
259
280
|
|
260
|
-
# Performs a
|
261
|
-
# @see flick
|
281
|
+
# Performs a **flick** heading _left_ on the first view that matches `query`.
|
282
|
+
# @see #flick
|
262
283
|
def flick_left(query, options={})
|
263
284
|
flick(query, {x: 90, y: 50}, {x: 10, y: 50}, options)
|
264
285
|
end
|
265
286
|
|
266
|
-
# Performs a
|
287
|
+
# Performs a **flick** heading _right_ on the first view that matches
|
267
288
|
# `query`.
|
268
|
-
# @see flick
|
289
|
+
# @see #flick
|
269
290
|
def flick_right(query, options={})
|
270
291
|
flick(query, {x: 10, y: 50}, {x: 90, y: 50}, options)
|
271
292
|
end
|
272
293
|
|
273
|
-
# Performs a
|
274
|
-
# @see flick
|
294
|
+
# Performs a **flick** heading _up_ on the first view that matches `query`.
|
295
|
+
# @see #flick
|
275
296
|
def flick_up(query, options={})
|
276
297
|
flick(query, {x: 50, y: 90}, {x: 50, y: 10}, options)
|
277
298
|
end
|
278
299
|
|
279
|
-
# Performs a
|
280
|
-
# @see flick
|
300
|
+
# Performs a **flick** heading _down_ on the first view that matches `query`.
|
301
|
+
# @see #flick
|
281
302
|
def flick_down(query, options={})
|
282
303
|
flick(query, {x: 50, y: 10}, {x: 50, y: 90}, options)
|
283
304
|
end
|
284
305
|
|
285
|
-
# Performs a
|
286
|
-
# @see
|
306
|
+
# Performs a **flick** heading _left_ on the screen.
|
307
|
+
# @see #flick
|
287
308
|
def flick_screen_left(options={})
|
288
309
|
flick_left('*', options)
|
289
310
|
end
|
290
311
|
|
291
|
-
# Performs a
|
292
|
-
# @see
|
312
|
+
# Performs a **flick** heading _right_ on the screen.
|
313
|
+
# @see #flick
|
293
314
|
def flick_screen_right(options={})
|
294
315
|
flick_right('*', options)
|
295
316
|
end
|
296
317
|
|
297
|
-
# Performs a
|
298
|
-
# @see
|
318
|
+
# Performs a **flick** heading _up_ on the screen.
|
319
|
+
# @see #flick
|
299
320
|
def flick_screen_up(options={})
|
300
321
|
_flick_screen_up(options)
|
301
322
|
end
|
302
323
|
|
303
|
-
# Performs a
|
304
|
-
# @see
|
324
|
+
# Performs a **flick** heading _down_ on the screen.
|
325
|
+
# @see #flick
|
305
326
|
def flick_screen_down(options={})
|
306
327
|
_flick_screen_down(options)
|
307
328
|
end
|
308
329
|
|
309
|
-
# Performs a
|
330
|
+
# Performs a **pinch** outwards on the first view match by `query`.
|
331
|
+
#
|
332
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
333
|
+
# to pinch.
|
334
|
+
# @param [Hash] options Options for controlling the pinch.
|
335
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
336
|
+
# the duration must be between 0.5 and 60.
|
337
|
+
#
|
338
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
339
|
+
# @raise [ArgumentError] If `query` is invalid.
|
340
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
310
341
|
def pinch_out(query, options={})
|
311
342
|
Device.default.pinch(:out, query, options)
|
312
343
|
end
|
313
344
|
|
314
|
-
# Performs a
|
345
|
+
# Performs a **pinch** inwards on the first view match by `query`.
|
346
|
+
#
|
347
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
348
|
+
# to pinch.
|
349
|
+
# @param [Hash] options Options for controlling the pinch.
|
350
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
351
|
+
# the duration must be between 0.5 and 60.
|
352
|
+
#
|
353
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
354
|
+
# @raise [ArgumentError] If `query` is invalid.
|
355
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
315
356
|
def pinch_in(query, options={})
|
316
357
|
Device.default.pinch(:in, query, options)
|
317
358
|
end
|
318
359
|
|
319
|
-
# Performs a
|
360
|
+
# Performs a **pinch** outwards on the screen.
|
361
|
+
#
|
362
|
+
# @param [Hash] options Options for controlling the pinch.
|
363
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
364
|
+
# the duration must be between 0.5 and 60.
|
365
|
+
#
|
366
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
367
|
+
# @raise [ArgumentError] If `query` is invalid.
|
368
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
320
369
|
def pinch_screen_out(options={})
|
321
370
|
_pinch_screen(:out, options)
|
322
371
|
end
|
323
372
|
|
324
|
-
# Performs a
|
373
|
+
# Performs a **pinch** inwards on the screen.
|
374
|
+
#
|
375
|
+
# @param [Hash] options Options for controlling the pinch.
|
376
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
377
|
+
# the duration must be between 0.5 and 60.
|
378
|
+
#
|
379
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
380
|
+
# @raise [ArgumentError] If `query` is invalid.
|
381
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
325
382
|
def pinch_screen_in(options={})
|
326
383
|
_pinch_screen(:in, options)
|
327
384
|
end
|
328
385
|
|
329
|
-
# Performs a
|
386
|
+
# Performs a **pinch** to zoom out.
|
387
|
+
#
|
388
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
389
|
+
# to pinch.
|
390
|
+
# @param [Hash] options Options for controlling the pinch.
|
391
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
392
|
+
# the duration must be between 0.5 and 60.
|
393
|
+
#
|
394
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
395
|
+
# @raise [ArgumentError] If `query` is invalid.
|
396
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
330
397
|
def pinch_to_zoom_out(query, options={})
|
331
398
|
_pinch_to_zoom(:out, query, options)
|
332
399
|
end
|
333
400
|
|
334
|
-
# Performs a
|
401
|
+
# Performs a **pinch** to zoom in.
|
402
|
+
#
|
403
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
404
|
+
# to pinch.
|
405
|
+
# @param [Hash] options Options for controlling the pinch.
|
406
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
407
|
+
# the duration must be between 0.5 and 60.
|
408
|
+
#
|
409
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
410
|
+
# @raise [ArgumentError] If `query` is invalid.
|
411
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
335
412
|
def pinch_to_zoom_in(query, options={})
|
336
413
|
_pinch_to_zoom(:in, query, options)
|
337
414
|
end
|
338
415
|
|
339
|
-
# Performs a
|
416
|
+
# Performs a **pinch** on the screen to zoom in.
|
417
|
+
#
|
418
|
+
# @param [Hash] options Options for controlling the pinch.
|
419
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
420
|
+
# the duration must be between 0.5 and 60.
|
421
|
+
#
|
422
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
423
|
+
# @raise [ArgumentError] If `query` is invalid.
|
424
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
340
425
|
def pinch_screen_to_zoom_in(options={})
|
341
426
|
_pinch_screen_to_zoom(:in, options)
|
342
427
|
end
|
343
428
|
|
344
|
-
# Performs a
|
429
|
+
# Performs a **pinch** on the screen to zoom out.
|
430
|
+
#
|
431
|
+
# @param [Hash] options Options for controlling the pinch.
|
432
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
433
|
+
# the duration must be between 0.5 and 60.
|
434
|
+
#
|
435
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
436
|
+
# @raise [ArgumentError] If `query` is invalid.
|
437
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
345
438
|
def pinch_screen_to_zoom_out(options={})
|
346
439
|
_pinch_screen_to_zoom(:out, options)
|
347
440
|
end
|
@@ -107,7 +107,7 @@ module Calabash
|
|
107
107
|
interval = options.fetch(:interval, @interval)
|
108
108
|
header = options.fetch(:header, HEADER)
|
109
109
|
|
110
|
-
@logger.log "Getting: #{@server.endpoint + request.route}"
|
110
|
+
@logger.log "Getting: #{@server.endpoint + request.route} #{options}"
|
111
111
|
|
112
112
|
start_time = Time.now
|
113
113
|
last_error = nil
|
@@ -1,12 +1,74 @@
|
|
1
1
|
module Calabash
|
2
|
-
# @!visibility private
|
3
2
|
module Interactions
|
4
|
-
#
|
3
|
+
# Queries the view hierarchy to find all views matching `query`.
|
4
|
+
# Optionally query takes a variable number of “invocation” arguments
|
5
|
+
# (args below).
|
6
|
+
# If called with an empty list of *args, query will find the views
|
7
|
+
# specified by `query` and return a QueryResult of serialized views.
|
8
|
+
#
|
9
|
+
# @note If this method is called with invocation arguments, it might allow
|
10
|
+
# the author of the test to do an interaction with app that a user would
|
11
|
+
# not be able to (for example changing the text of a view).
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# query("* marked:'my view'")
|
15
|
+
# query("* id:'foo' descendant UIButton")
|
16
|
+
# query("android.widget.ProgressBar")
|
17
|
+
# query("* {text CONTAINS 'something'}")
|
18
|
+
# query("* {y > 200}")
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# # Find all the elements, visible as well as invisible
|
22
|
+
# query("all *")
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# query("editText", :setText => 'my text')
|
26
|
+
# query("scrollView", :scrollBy => [50, 10])
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# irb(main):009:0> query("UITabBarButton index:0")
|
30
|
+
# [
|
31
|
+
# [0] {
|
32
|
+
# "class" => "UITabBarButton",
|
33
|
+
# "id" => nil,
|
34
|
+
# "rect" => {
|
35
|
+
# "center_x" => 40,
|
36
|
+
# "y" => 520,
|
37
|
+
# "width" => 76,
|
38
|
+
# "x" => 2,
|
39
|
+
# "center_y" => 544,
|
40
|
+
# "height" => 48
|
41
|
+
# },
|
42
|
+
# "frame" => {
|
43
|
+
# "y" => 1,
|
44
|
+
# "width" => 76,
|
45
|
+
# "x" => 2,
|
46
|
+
# "height" => 48
|
47
|
+
# },
|
48
|
+
# "label" => "Reader",
|
49
|
+
# "description" => "<UITabBarButton: 0xdabb510; frame = (2 1; 76 48); opaque = NO; layer = <CALayer: 0xdabd8e0>>"
|
50
|
+
# }
|
51
|
+
# ]
|
52
|
+
#
|
53
|
+
# @note Even if the query matches only one view, the QueryResult returned
|
54
|
+
# is still a list of elements.
|
55
|
+
#
|
56
|
+
# @param [String, Hash, Calabash::Query] query The query to match the
|
57
|
+
# view(s)
|
58
|
+
#
|
59
|
+
# @param args Optional var-args list describing a chain of method
|
60
|
+
# names (selectors).
|
61
|
+
#
|
62
|
+
# @return [Calabash::QueryResult] A result of the query
|
5
63
|
def query(query, *args)
|
6
64
|
Calabash::Device.default.map_route(Query.new(query), :query, *args)
|
7
65
|
end
|
8
66
|
|
9
|
-
#
|
67
|
+
# Flashes any views matching `query`. Only one view is flashed at a time,
|
68
|
+
# in the order they are returned.
|
69
|
+
#
|
70
|
+
# @param [String, Hash, Calabash::Query] query The query to match the
|
71
|
+
# view(s)
|
10
72
|
def flash(query)
|
11
73
|
Calabash::Device.default.map_route(Query.new(query), :flash)
|
12
74
|
end
|
@@ -18,7 +80,7 @@ module Calabash
|
|
18
80
|
# # iOS
|
19
81
|
# evaluate_javascript_in("UIWebView", "2+2")
|
20
82
|
# # Android
|
21
|
-
# evaluate_javascript_in("WebView", "return 2+2"
|
83
|
+
# evaluate_javascript_in("WebView", "return 2+2")
|
22
84
|
#
|
23
85
|
# @example
|
24
86
|
# # iOS
|
@@ -79,7 +141,7 @@ module Calabash
|
|
79
141
|
#
|
80
142
|
# @example
|
81
143
|
# # iOS
|
82
|
-
# backdoor('calabashBackdoor:'
|
144
|
+
# backdoor('calabashBackdoor:', '')
|
83
145
|
#
|
84
146
|
# @example
|
85
147
|
# # iOS
|
@@ -22,8 +22,6 @@ module Calabash
|
|
22
22
|
|
23
23
|
include Calabash::IOS::GesturesMixin
|
24
24
|
|
25
|
-
# @todo Should these be public?
|
26
|
-
# @todo If public, document!
|
27
25
|
attr_reader :run_loop
|
28
26
|
attr_reader :uia_strategy
|
29
27
|
attr_reader :start_options
|
@@ -292,6 +290,13 @@ module Calabash
|
|
292
290
|
runtime_attributes.server_version
|
293
291
|
end
|
294
292
|
|
293
|
+
# @!visibility private
|
294
|
+
# A dump of runtime details.
|
295
|
+
def runtime_details
|
296
|
+
expect_runtime_attributes_available(__method__)
|
297
|
+
@runtime_attributes.runtime_info
|
298
|
+
end
|
299
|
+
|
295
300
|
# Is this device a simulator?
|
296
301
|
# @return [Boolean] Returns true if this device is a simulator.
|
297
302
|
def simulator?
|
@@ -729,11 +734,18 @@ module Calabash
|
|
729
734
|
|
730
735
|
# @!visibility private
|
731
736
|
def expect_runtime_attributes_available(method_name)
|
737
|
+
|
732
738
|
if runtime_attributes.nil?
|
733
|
-
|
734
|
-
|
735
|
-
|
739
|
+
begin
|
740
|
+
# Populates the @runtime_attributes
|
741
|
+
wait_for_server_to_start({:timeout => 1.0})
|
742
|
+
rescue Calabash::Device::EnsureTestServerReadyTimeoutError => _
|
743
|
+
logger.log("The method '#{method_name}' is not available to IOS::Device until", :info)
|
744
|
+
logger.log('the app has been launched with Calabash start_app.', :info)
|
745
|
+
raise "The method '#{method_name}' can only be called after the app has been launched"
|
746
|
+
end
|
736
747
|
end
|
748
|
+
|
737
749
|
true
|
738
750
|
end
|
739
751
|
|