calabash-cucumber 0.13.0 → 0.14.0
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/dylibs/libCalabashDyn.dylib +0 -0
- data/dylibs/libCalabashDynSim.dylib +0 -0
- data/features-skeleton/support/01_launch.rb +1 -1
- data/features/step_definitions/calabash_steps.rb +114 -141
- data/lib/calabash-cucumber/device.rb +62 -19
- data/lib/calabash-cucumber/environment_helpers.rb +43 -23
- data/lib/calabash-cucumber/version.rb +3 -4
- data/scripts/launch.rb +1 -1
- data/staticlib/calabash.framework.zip +0 -0
- data/staticlib/libFrankCalabash.a +0 -0
- metadata +31 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffa8aea9b8e03a9601bed26f7a30ad9243dfb930
|
4
|
+
data.tar.gz: df96dc379a76662a9a2f1a2610e51a9027099b75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e981cc007418f8044f03ba925c79c3f71cc3c8dede0799c3b2629a0758ca5354d885b9ba82ce8152e62c10bf91fc13724d21fb943df84479238d32c442a3b46
|
7
|
+
data.tar.gz: 70e0f1c3188959ad2a45e34a4741fb6fed59f93544750bce3fb7c321da76f2513f6fe03a627a7ab07058fa08f190034070081c1bcea7b20f2b61ebab24b95d01
|
data/dylibs/libCalabashDyn.dylib
CHANGED
Binary file
|
Binary file
|
@@ -15,7 +15,7 @@
|
|
15
15
|
require 'calabash-cucumber/launcher'
|
16
16
|
|
17
17
|
|
18
|
-
# APP_BUNDLE_PATH = "
|
18
|
+
# APP_BUNDLE_PATH = "#{ENV['HOME']}/Library/Developer/Xcode/DerivedData/??/Build/Products/Calabash-iphonesimulator/??.app"
|
19
19
|
# You may uncomment the above to overwrite the APP_BUNDLE_PATH
|
20
20
|
# However the recommended approach is to let Calabash find the app itself
|
21
21
|
# or set the environment variable APP_BUNDLE_PATH
|
@@ -2,89 +2,85 @@ WAIT_TIMEOUT = (ENV['WAIT_TIMEOUT'] || 30).to_f
|
|
2
2
|
STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.5).to_f
|
3
3
|
|
4
4
|
Given /^(my|the) app is running$/ do |_|
|
5
|
-
#no-op exists for backwards compatibility
|
5
|
+
# no-op exists for backwards compatibility
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
# -- Touch --#
|
8
|
+
### Touch ###
|
10
9
|
Then /^I (?:press|touch) on screen (\d+) from the left and (\d+) from the top$/ do |x, y|
|
11
|
-
touch(nil, {:
|
10
|
+
touch(nil, { offset: { x: x.to_i, y: y.to_i } })
|
12
11
|
sleep(STEP_PAUSE)
|
13
12
|
end
|
14
13
|
|
15
14
|
Then /^I (?:press|touch) "([^\"]*)"$/ do |name|
|
16
|
-
touch("view marked:'#{name}'")
|
15
|
+
touch("view marked: '#{name}'")
|
17
16
|
sleep(STEP_PAUSE)
|
18
17
|
end
|
19
18
|
|
20
|
-
Then /^I (?:press|touch) (\d+)% right and (\d+)% down from "([^\"]*)"$/ do |x,y,name|
|
21
|
-
raise
|
19
|
+
Then /^I (?:press|touch) (\d+)% right and (\d+)% down from "([^\"]*)"$/ do |x, y, name|
|
20
|
+
raise 'This step is not yet implemented on iOS'
|
22
21
|
end
|
23
22
|
|
24
23
|
Then /^I (?:press|touch) button number (\d+)$/ do |index|
|
25
24
|
index = index.to_i
|
26
|
-
screenshot_and_raise
|
27
|
-
touch("button index
|
25
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
26
|
+
touch("button index: #{index - 1}")
|
28
27
|
sleep(STEP_PAUSE)
|
29
28
|
end
|
30
29
|
|
31
30
|
Then /^I (?:press|touch) the "([^\"]*)" button$/ do |name|
|
32
|
-
touch("button marked:'#{name}'")
|
31
|
+
touch("button marked: '#{name}'")
|
33
32
|
sleep(STEP_PAUSE)
|
34
33
|
end
|
35
34
|
|
36
35
|
Then /^I (?:press|touch) (?:input|text) field number (\d+)$/ do |index|
|
37
36
|
index = index.to_i
|
38
|
-
screenshot_and_raise
|
39
|
-
touch("textField index
|
40
|
-
sleep(STEP_PAUSE)
|
37
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
38
|
+
touch("textField index: #{index - 1}")
|
39
|
+
sleep(STEP_PAUSE)
|
41
40
|
end
|
42
41
|
|
43
|
-
|
44
42
|
Then /^I (?:press|touch) the "([^\"]*)" (?:input|text) field$/ do |name|
|
45
|
-
placeholder_query = "textField placeholder:'#{name}'"
|
46
|
-
marked_query = "textField marked:'#{name}'"
|
43
|
+
placeholder_query = "textField placeholder: '#{name}'"
|
44
|
+
marked_query = "textField marked: '#{name}'"
|
47
45
|
if !query(placeholder_query).empty?
|
48
46
|
touch(placeholder_query)
|
49
47
|
elsif !query(marked_query).empty?
|
50
48
|
touch(marked_query)
|
51
49
|
else
|
52
|
-
screenshot_and_raise "
|
50
|
+
screenshot_and_raise "Could not find text field with placeholder '#{name}' or marked as '#{name}'"
|
53
51
|
end
|
54
52
|
sleep(STEP_PAUSE)
|
55
53
|
end
|
56
54
|
|
57
|
-
#Note in tables views: this means visible cell index!
|
55
|
+
# Note in tables views: this means visible cell index!
|
58
56
|
Then /^I (?:press|touch) list item number (\d+)$/ do |index|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
index = index.to_i
|
58
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
59
|
+
touch("tableViewCell index: #{index - 1}")
|
60
|
+
sleep(STEP_PAUSE)
|
63
61
|
end
|
64
62
|
|
65
63
|
Then /^I (?:press|touch) list item "([^\"]*)"$/ do |cell_name|
|
66
|
-
if
|
67
|
-
|
68
|
-
then
|
69
|
-
touch("tableViewCell text:'#{cell_name}'")
|
64
|
+
if query("tableViewCell marked: '#{cell_name}'").empty?
|
65
|
+
touch("tableViewCell text:' #{cell_name}'")
|
70
66
|
else
|
71
|
-
touch("tableViewCell marked:'#{cell_name}'")
|
67
|
+
touch("tableViewCell marked: '#{cell_name}'")
|
72
68
|
end
|
73
69
|
sleep(STEP_PAUSE)
|
74
70
|
end
|
75
71
|
|
76
72
|
Then /^I toggle the switch$/ do
|
77
|
-
touch(
|
73
|
+
touch('switch')
|
78
74
|
sleep(STEP_PAUSE)
|
79
75
|
end
|
80
76
|
|
81
77
|
Then /^I toggle the "([^\"]*)" switch$/ do |name|
|
82
|
-
touch("switch marked:'#{name}'")
|
78
|
+
touch("switch marked: '#{name}'")
|
83
79
|
sleep(STEP_PAUSE)
|
84
80
|
end
|
85
81
|
|
86
82
|
Then /^I touch (?:the)? user location$/ do
|
87
|
-
touch("view:'MKUserLocationView'")
|
83
|
+
touch("view: 'MKUserLocationView'")
|
88
84
|
sleep(STEP_PAUSE)
|
89
85
|
end
|
90
86
|
|
@@ -93,54 +89,51 @@ Then /^I (?:touch|press) (?:done|search)$/ do
|
|
93
89
|
sleep(STEP_PAUSE)
|
94
90
|
end
|
95
91
|
|
96
|
-
|
97
|
-
## -- Entering text -- ##
|
98
|
-
|
92
|
+
### Entering text ###
|
99
93
|
Then /^I enter "([^\"]*)" into the "([^\"]*)" field$/ do |text_to_type, field_name|
|
100
|
-
touch("textField marked:'#{field_name}'")
|
101
|
-
wait_for_keyboard
|
94
|
+
touch("textField marked: '#{field_name}'")
|
95
|
+
wait_for_keyboard
|
102
96
|
keyboard_enter_text text_to_type
|
103
97
|
sleep(STEP_PAUSE)
|
104
98
|
end
|
105
99
|
|
106
100
|
Then /^I enter "([^\"]*)" into the "([^\"]*)" (?:text|input) field$/ do |text_to_type, field_name|
|
107
|
-
touch("textField marked:'#{field_name}'")
|
108
|
-
wait_for_keyboard
|
101
|
+
touch("textField marked: '#{field_name}'")
|
102
|
+
wait_for_keyboard
|
109
103
|
keyboard_enter_text text_to_type
|
110
104
|
sleep(STEP_PAUSE)
|
111
105
|
end
|
112
106
|
|
113
|
-
#
|
107
|
+
# Alias
|
114
108
|
Then /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |text_field, text_to_type|
|
115
|
-
macro %
|
109
|
+
macro %(I enter "#{text_to_type}" into the "#{text_field}" text field)
|
116
110
|
end
|
117
111
|
|
118
112
|
Then /^I use the native keyboard to enter "([^\"]*)" into the "([^\"]*)" (?:text|input) field$/ do |text_to_type, field_name|
|
119
|
-
macro %
|
120
|
-
wait_for_keyboard
|
113
|
+
macro %(I touch the "#{field_name}" text field)
|
114
|
+
wait_for_keyboard
|
121
115
|
keyboard_enter_text(text_to_type)
|
122
116
|
sleep(STEP_PAUSE)
|
123
117
|
end
|
124
118
|
|
125
119
|
Then /^I fill in text fields as follows:$/ do |table|
|
126
120
|
table.hashes.each do |row|
|
127
|
-
macro %
|
121
|
+
macro %(I enter "#{row['text']}" into the "#{row['field']}" text field)
|
128
122
|
end
|
129
123
|
end
|
130
124
|
|
131
125
|
Then /^I enter "([^\"]*)" into (?:input|text) field number (\d+)$/ do |text, index|
|
132
126
|
index = index.to_i
|
133
|
-
screenshot_and_raise
|
134
|
-
touch("textField index
|
135
|
-
wait_for_keyboard
|
127
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
128
|
+
touch("textField index: #{index - 1}")
|
129
|
+
wait_for_keyboard
|
136
130
|
keyboard_enter_text text
|
137
131
|
sleep(STEP_PAUSE)
|
138
132
|
end
|
139
133
|
|
140
134
|
Then /^I use the native keyboard to enter "([^\"]*)" into (?:input|text) field number (\d+)$/ do |text_to_type, index|
|
141
|
-
|
142
|
-
|
143
|
-
wait_for_keyboard()
|
135
|
+
macro %(I touch text field number #{index})
|
136
|
+
wait_for_keyboard
|
144
137
|
keyboard_enter_text(text_to_type)
|
145
138
|
sleep(STEP_PAUSE)
|
146
139
|
end
|
@@ -148,61 +141,58 @@ end
|
|
148
141
|
When /^I clear "([^\"]*)"$/ do |name|
|
149
142
|
msg = "When I clear <name>' will be deprecated because it is ambiguous - what should be cleared?"
|
150
143
|
_deprecated('0.9.151', msg, :warn)
|
151
|
-
clear_text("textField marked:'#{name}'")
|
144
|
+
clear_text("textField marked: '#{name}'")
|
152
145
|
end
|
153
146
|
|
154
147
|
Then /^I clear (?:input|text) field number (\d+)$/ do |index|
|
155
148
|
index = index.to_i
|
156
|
-
screenshot_and_raise
|
157
|
-
clear_text("textField index
|
149
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
150
|
+
clear_text("textField index: #{index - 1}")
|
158
151
|
end
|
159
152
|
|
160
|
-
|
153
|
+
### See ###
|
161
154
|
Then /^I wait to see "([^\"]*)"$/ do |expected_mark|
|
162
|
-
wait_for(WAIT_TIMEOUT) { view_with_mark_exists(
|
155
|
+
wait_for(WAIT_TIMEOUT) { view_with_mark_exists(expected_mark) }
|
163
156
|
end
|
164
157
|
|
165
158
|
Then /^I wait until I don't see "([^\"]*)"$/ do |expected_mark|
|
166
|
-
sleep 1
|
167
|
-
wait_for(WAIT_TIMEOUT) {
|
159
|
+
sleep 1 # wait for previous screen to disappear
|
160
|
+
wait_for(WAIT_TIMEOUT) { !element_exists("view marked: '#{expected_mark}'") }
|
168
161
|
end
|
169
162
|
|
170
163
|
Then /^I wait to not see "([^\"]*)"$/ do |expected_mark|
|
171
|
-
macro %
|
164
|
+
macro %(I wait until I don't see "#{expected_mark}")
|
172
165
|
end
|
173
166
|
|
174
167
|
Then /^I wait for "([^\"]*)" to appear$/ do |name|
|
175
|
-
macro %
|
168
|
+
macro %(I wait to see "#{name}")
|
176
169
|
end
|
177
170
|
|
178
171
|
Then /^I wait for the "([^\"]*)" button to appear$/ do |name|
|
179
|
-
wait_for(WAIT_TIMEOUT) { element_exists(
|
172
|
+
wait_for(WAIT_TIMEOUT) { element_exists("button marked: '#{name}'") }
|
180
173
|
end
|
181
174
|
|
182
175
|
Then /^I wait to see a navigation bar titled "([^\"]*)"$/ do |expected_mark|
|
183
|
-
msg = "
|
184
|
-
wait_for(:
|
185
|
-
|
186
|
-
|
187
|
-
button_items = query("navigationItemButtonView")
|
176
|
+
msg = "Waited for '#{WAIT_TIMEOUT}' seconds but did not see the navbar with title '#{expected_mark}'"
|
177
|
+
wait_for(timeout: WAIT_TIMEOUT, timeout_message: msg ) do
|
178
|
+
all_items = query("navigationItemView marked: '#{expected_mark}'")
|
179
|
+
button_items = query('navigationItemButtonView')
|
188
180
|
non_button_items = all_items.delete_if { |item| button_items.include?(item) }
|
189
181
|
!non_button_items.empty?
|
190
182
|
end
|
191
183
|
end
|
192
184
|
|
193
185
|
Then /^I wait for the "([^\"]*)" (?:input|text) field$/ do |placeholder_or_view_mark|
|
194
|
-
wait_for(WAIT_TIMEOUT)
|
195
|
-
element_exists(
|
196
|
-
|
197
|
-
|
186
|
+
wait_for(WAIT_TIMEOUT) do
|
187
|
+
element_exists("textField placeholder: '#{placeholder_or_view_mark}'") ||
|
188
|
+
element_exists("textField marked: '#{placeholder_or_view_mark}'")
|
189
|
+
end
|
198
190
|
end
|
199
191
|
|
200
192
|
Then /^I wait for (\d+) (?:input|text) field(?:s)?$/ do |count|
|
201
|
-
count
|
202
|
-
wait_for(WAIT_TIMEOUT) { query(:textField).count >= count }
|
193
|
+
wait_for(WAIT_TIMEOUT) { query(:textField).count >= count.to_i }
|
203
194
|
end
|
204
195
|
|
205
|
-
|
206
196
|
Then /^I wait$/ do
|
207
197
|
sleep 2
|
208
198
|
end
|
@@ -216,13 +206,11 @@ Then /^I wait and wait and wait...$/ do
|
|
216
206
|
end
|
217
207
|
|
218
208
|
When /^I wait for ([\d\.]+) second(?:s)?$/ do |num_seconds|
|
219
|
-
|
220
|
-
sleep num_seconds
|
209
|
+
sleep num_seconds.to_f
|
221
210
|
end
|
222
211
|
|
223
|
-
|
224
212
|
Then /^I go back$/ do
|
225
|
-
touch(
|
213
|
+
touch('navigationItemButtonView first')
|
226
214
|
sleep(STEP_PAUSE)
|
227
215
|
end
|
228
216
|
|
@@ -238,194 +226,179 @@ end
|
|
238
226
|
|
239
227
|
Then /^I swipe (left|right|up|down) on number (\d+)$/ do |dir, index|
|
240
228
|
index = index.to_i
|
241
|
-
screenshot_and_raise
|
242
|
-
swipe(dir, {:
|
229
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
230
|
+
swipe(dir, { query: "scrollView index: #{index - 1}" })
|
243
231
|
sleep(STEP_PAUSE)
|
244
232
|
end
|
245
233
|
|
246
234
|
Then /^I swipe (left|right|up|down) on number (\d+) at x (\d+) and y (\d+)$/ do |dir, index, x, y|
|
247
235
|
index = index.to_i
|
248
|
-
screenshot_and_raise
|
249
|
-
swipe(dir, {:
|
236
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
237
|
+
swipe(dir, { offset: { x: x.to_i, y: y.to_i }, query: "scrollView index: #{index - 1}" })
|
250
238
|
sleep(STEP_PAUSE)
|
251
239
|
end
|
252
240
|
|
253
241
|
Then /^I swipe (left|right|up|down) on "([^\"]*)"$/ do |dir, mark|
|
254
|
-
|
255
|
-
|
242
|
+
swipe(dir, { query: "view marked: '#{mark}'" })
|
243
|
+
sleep(STEP_PAUSE)
|
256
244
|
end
|
257
245
|
|
258
246
|
Then /^I swipe on cell number (\d+)$/ do |index|
|
259
247
|
index = index.to_i
|
260
|
-
screenshot_and_raise
|
261
|
-
cell_swipe({:
|
248
|
+
screenshot_and_raise("Index should be positive (was: #{index})") if index <= 0
|
249
|
+
cell_swipe({ query: "tableViewCell index: #{index - 1}" })
|
262
250
|
sleep(STEP_PAUSE)
|
263
251
|
end
|
264
252
|
|
265
|
-
|
266
|
-
##pinch##
|
253
|
+
### Pinch ###
|
267
254
|
Then /^I pinch to zoom (in|out)$/ do |in_out|
|
268
255
|
pinch(in_out)
|
269
256
|
sleep(STEP_PAUSE)
|
270
257
|
end
|
271
258
|
|
272
259
|
Then /^I pinch to zoom (in|out) on "([^\"]*)"$/ do |in_out, name|
|
273
|
-
pinch(in_out,{:
|
260
|
+
pinch(in_out, { query: "view marked: '#{name}'" })
|
274
261
|
sleep(STEP_PAUSE)
|
275
262
|
end
|
276
263
|
|
277
|
-
#
|
264
|
+
# Note "up/left/right" seems to be missing on the web base
|
278
265
|
Then /^I scroll (left|right|up|down)$/ do |dir|
|
279
|
-
scroll(
|
266
|
+
scroll('scrollView index: 0', dir)
|
280
267
|
sleep(STEP_PAUSE)
|
281
268
|
end
|
282
269
|
|
283
|
-
Then /^I scroll (left|right|up|down) on "([^\"]*)"$/ do |dir,name|
|
284
|
-
scroll("view marked:'#{name}'", dir)
|
270
|
+
Then /^I scroll (left|right|up|down) on "([^\"]*)"$/ do |dir, name|
|
271
|
+
scroll("view marked: '#{name}'", dir)
|
285
272
|
sleep(STEP_PAUSE)
|
286
273
|
end
|
287
274
|
|
288
|
-
|
289
|
-
|
290
275
|
### Playback ###
|
291
276
|
Then /^I playback recording "([^\"]*)"$/ do |filename|
|
292
|
-
|
293
|
-
|
277
|
+
playback(filename)
|
278
|
+
sleep(STEP_PAUSE)
|
294
279
|
end
|
295
280
|
|
296
281
|
Then /^I playback recording "([^\"]*)" on "([^\"]*)"$/ do |filename, name|
|
297
|
-
|
298
|
-
|
282
|
+
playback(filename, { query: "view marked: '#{name}'" })
|
283
|
+
sleep(STEP_PAUSE)
|
299
284
|
end
|
300
285
|
|
301
286
|
Then /^I playback recording "([^\"]*)" on "([^\"]*)" with offset (\d+),(\d+)$/ do |filename, name, x, y|
|
302
|
-
|
303
|
-
y = y.to_i
|
304
|
-
playback(filename, {:query => "view marked:'#{name}'", :offset => {:x => x, :y => y}})
|
287
|
+
playback(filename, { query: "view marked:'#{name}'", offset: { x: x.to_i, y: y.to_i } })
|
305
288
|
sleep(STEP_PAUSE)
|
306
289
|
end
|
307
290
|
|
308
291
|
Then /^I reverse playback recording "([^\"]*)"$/ do |filename|
|
309
|
-
playback(filename, {:
|
292
|
+
playback(filename, { reverse: true })
|
310
293
|
sleep(STEP_PAUSE)
|
311
294
|
end
|
312
295
|
|
313
296
|
Then /^I reverse playback recording "([^\"]*)" on "([^\"]*)"$/ do |filename, name|
|
314
|
-
playback(filename, {:
|
297
|
+
playback(filename, { query: "view marked: '#{name}'", reverse: true })
|
315
298
|
sleep(STEP_PAUSE)
|
316
299
|
end
|
317
300
|
|
318
301
|
Then /^I reverse playback recording "([^\"]*)" on "([^\"]*)" with offset (\d+),(\d+)$/ do |filename, name, x, y|
|
319
|
-
|
320
|
-
y = y.to_i
|
321
|
-
playback(filename, {:query => "view marked:'#{name}'", :offset => {:x => x, :y => y},:reverse => true})
|
302
|
+
playback(filename, { query: "view marked: '#{name}'", offset: { x: x.to_i, y: y.to_i }, reverse: true })
|
322
303
|
sleep(STEP_PAUSE)
|
323
304
|
end
|
324
305
|
|
325
|
-
|
326
306
|
### Device orientation ###
|
327
307
|
Then /^I rotate device (left|right)$/ do |dir|
|
328
|
-
dir
|
329
|
-
|
330
|
-
sleep(5)#SERVO wait
|
308
|
+
rotate(dir.to_sym)
|
309
|
+
sleep 5 # Servo wait
|
331
310
|
end
|
332
311
|
|
333
312
|
Then /^I send app to background for (\d+) seconds$/ do |secs|
|
334
313
|
secs = secs.to_f
|
335
314
|
send_app_to_background(secs)
|
336
|
-
sleep(secs+10)
|
315
|
+
sleep(secs + 10)
|
337
316
|
end
|
338
317
|
|
339
318
|
### Assertions ###
|
340
319
|
Then /^I should see "([^\"]*)"$/ do |expected_mark|
|
341
|
-
|
342
|
-
|
343
|
-
if not res
|
320
|
+
until element_exists("view marked:'#{expected_mark}'") ||
|
321
|
+
element_exists("view text:'#{expected_mark}'")
|
344
322
|
screenshot_and_raise "No element found with mark or text: #{expected_mark}"
|
345
323
|
end
|
346
324
|
end
|
347
325
|
|
348
326
|
Then /^I should not see "([^\"]*)"$/ do |expected_mark|
|
349
|
-
res = query("view marked:'#{expected_mark}'")
|
350
|
-
res.concat query("view text:'#{expected_mark}'")
|
327
|
+
res = query("view marked: '#{expected_mark}'")
|
328
|
+
res.concat query("view text: '#{expected_mark}'")
|
351
329
|
unless res.empty?
|
352
|
-
screenshot_and_raise "Expected no element with text nor accessibilityLabel: #{expected_mark}, found #{res.join(
|
330
|
+
screenshot_and_raise "Expected no element with text nor accessibilityLabel: #{expected_mark}, found #{res.join(', ')}"
|
353
331
|
end
|
354
332
|
end
|
355
333
|
|
356
334
|
Then /^I should see a "([^\"]*)" button$/ do |expected_mark|
|
357
|
-
check_element_exists("button marked:'#{expected_mark}'")
|
335
|
+
check_element_exists("button marked: '#{expected_mark}'")
|
358
336
|
end
|
359
337
|
Then /^I should not see a "([^\"]*)" button$/ do |expected_mark|
|
360
|
-
check_element_does_not_exist("button marked:'#{expected_mark}'")
|
338
|
+
check_element_does_not_exist("button marked: '#{expected_mark}'")
|
361
339
|
end
|
362
340
|
|
363
341
|
Then /^I don't see the text "([^\"]*)"$/ do |text|
|
364
|
-
macro %
|
342
|
+
macro %(I should not see "#{text}")
|
365
343
|
end
|
366
344
|
Then /^I don't see the "([^\"]*)"$/ do |text|
|
367
|
-
macro %
|
345
|
+
macro %(I should not see "#{text}")
|
368
346
|
end
|
369
347
|
|
370
348
|
Then /^I see the text "([^\"]*)"$/ do |text|
|
371
|
-
macro %
|
349
|
+
macro %(I should see "#{text}")
|
372
350
|
end
|
351
|
+
|
373
352
|
Then /^I see the "([^\"]*)"$/ do |text|
|
374
|
-
macro %
|
353
|
+
macro %(I should see "#{text}")
|
375
354
|
end
|
376
355
|
|
377
356
|
Then /^I (?:should)? see text starting with "([^\"]*)"$/ do |text|
|
378
|
-
|
379
|
-
if res
|
357
|
+
if query("view {text BEGINSWITH '#{text}'}").empty?
|
380
358
|
screenshot_and_raise "No text found starting with: #{text}"
|
381
359
|
end
|
382
360
|
end
|
383
361
|
|
384
362
|
Then /^I (?:should)? see text containing "([^\"]*)"$/ do |text|
|
385
|
-
|
386
|
-
if res
|
363
|
+
if query("view {text LIKE '*#{text}*'}").empty?
|
387
364
|
screenshot_and_raise "No text found containing: #{text}"
|
388
365
|
end
|
389
366
|
end
|
390
367
|
|
391
368
|
Then /^I (?:should)? see text ending with "([^\"]*)"$/ do |text|
|
392
|
-
|
393
|
-
if res
|
369
|
+
if query("view {text ENDSWITH '#{text}'}").empty?
|
394
370
|
screenshot_and_raise "No text found ending with: #{text}"
|
395
371
|
end
|
396
372
|
end
|
397
373
|
|
398
374
|
Then /^I see (\d+) (?:input|text) field(?:s)?$/ do |count|
|
399
|
-
count = count.to_i
|
400
375
|
cnt = query(:textField).count
|
401
|
-
if cnt < count
|
402
|
-
|
376
|
+
if cnt < count.to_i
|
377
|
+
screenshot_and_raise "Expected at least #{count} text/input fields, found #{cnt}"
|
403
378
|
end
|
404
379
|
end
|
405
380
|
|
406
381
|
Then /^I should see a "([^\"]*)" (?:input|text) field$/ do |expected_mark|
|
407
|
-
|
408
|
-
|
409
|
-
unless res
|
382
|
+
unless element_exists("textField placeholder: '#{expected_mark}'") ||
|
383
|
+
element_exists("textField marked: '#{expected_mark}'")
|
410
384
|
screenshot_and_raise "Expected textfield with placeholder or accessibilityLabel: #{expected_mark}"
|
411
385
|
end
|
412
386
|
end
|
413
387
|
|
414
388
|
Then /^I should not see a "([^\"]*)" (?:input|text) field$/ do |expected_mark|
|
415
|
-
res = query("textField placeholder:'#{expected_mark}'")
|
416
|
-
res.concat query("textField marked:'#{expected_mark}'")
|
389
|
+
res = query("textField placeholder: '#{expected_mark}'")
|
390
|
+
res.concat query("textField marked: '#{expected_mark}'")
|
417
391
|
unless res.empty?
|
418
392
|
screenshot_and_raise "Expected no textfield with placeholder nor accessibilityLabel: #{expected_mark}, found #{res}"
|
419
393
|
end
|
420
394
|
end
|
421
395
|
|
422
|
-
|
423
396
|
Then /^I should see a map$/ do
|
424
|
-
check_element_exists("view:'MKMapView'")
|
397
|
+
check_element_exists("view: 'MKMapView'")
|
425
398
|
end
|
426
399
|
|
427
400
|
Then /^I should see (?:the)? user location$/ do
|
428
|
-
check_element_exists("view:'MKUserLocationView'")
|
401
|
+
check_element_exists("view: 'MKUserLocationView'")
|
429
402
|
end
|
430
403
|
|
431
404
|
### Date Picker ###
|
@@ -433,7 +406,7 @@ end
|
|
433
406
|
# time_str can be in any format that Time can parse
|
434
407
|
Then(/^I change the date picker time to "([^"]*)"$/) do |time_str|
|
435
408
|
target_time = Time.parse(time_str)
|
436
|
-
current_date = date_time_from_picker
|
409
|
+
current_date = date_time_from_picker
|
437
410
|
current_date = DateTime.new(current_date.year,
|
438
411
|
current_date.mon,
|
439
412
|
current_date.day,
|
@@ -448,7 +421,7 @@ end
|
|
448
421
|
# date_str can be in any format that Date can parse
|
449
422
|
Then(/^I change the date picker date to "([^"]*)"$/) do |date_str|
|
450
423
|
target_date = Date.parse(date_str)
|
451
|
-
current_time = date_time_from_picker
|
424
|
+
current_time = date_time_from_picker
|
452
425
|
date_time = DateTime.new(target_date.year,
|
453
426
|
target_date.mon,
|
454
427
|
target_date.day,
|
@@ -463,6 +436,6 @@ end
|
|
463
436
|
|
464
437
|
# date_str can be in any format that Date can parse
|
465
438
|
Then(/^I change the date picker date to "([^"]*)" at "([^"]*)"$/) do |date_str, time_str|
|
466
|
-
macro %
|
467
|
-
macro %
|
439
|
+
macro %(I change the date picker time to "#{time_str}")
|
440
|
+
macro %(I change the date picker date to "#{date_str}")
|
468
441
|
end
|
@@ -108,15 +108,17 @@ module Calabash
|
|
108
108
|
# @return [Boolean] `true` if the app under test is emulated
|
109
109
|
attr_reader :iphone_app_emulated_on_ipad
|
110
110
|
|
111
|
-
#
|
112
|
-
# @attribute [r]
|
113
|
-
#
|
114
|
-
|
115
|
-
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
119
|
-
|
111
|
+
# The form factor of this device.
|
112
|
+
# @attribute [r] form_factor
|
113
|
+
#
|
114
|
+
# Will be one of:
|
115
|
+
# * ipad
|
116
|
+
# * iphone 4in
|
117
|
+
# * iphone 3.5in
|
118
|
+
# * iphone 6
|
119
|
+
# * iphone 6+
|
120
|
+
# * "" # if no information can be found.
|
121
|
+
attr_reader :form_factor
|
120
122
|
|
121
123
|
# For Calabash server version > 0.10.2 provides
|
122
124
|
# device specific screen information.
|
@@ -134,6 +136,17 @@ module Calabash
|
|
134
136
|
# @return [Hash] screen dimensions, scale and down/up sampling fraction.
|
135
137
|
attr_reader :screen_dimensions
|
136
138
|
|
139
|
+
# @deprecated 0.13.1 no replacement
|
140
|
+
# Indicates whether or not this device has a 4in screen.
|
141
|
+
# @attribute [r] iphone_4in
|
142
|
+
# @return [Boolean] `true` if this device has a 4in screen.
|
143
|
+
attr_reader :iphone_4in
|
144
|
+
|
145
|
+
# @deprecated 0.10.0 no replacement
|
146
|
+
# @!attribute [rw] udid
|
147
|
+
# @return [String] The udid of this device.
|
148
|
+
attr_accessor :udid
|
149
|
+
|
137
150
|
# Creates a new instance of Device.
|
138
151
|
#
|
139
152
|
# @see Calabash::Cucumber::Core#server_version
|
@@ -150,7 +163,6 @@ module Calabash
|
|
150
163
|
@ios_version = version_data['iOS_version']
|
151
164
|
@server_version = version_data['version']
|
152
165
|
@iphone_app_emulated_on_ipad = version_data['iphone_app_emulated_on_ipad']
|
153
|
-
@iphone_4in = version_data['4inch']
|
154
166
|
screen_dimensions = version_data['screen_dimensions']
|
155
167
|
if screen_dimensions
|
156
168
|
@screen_dimensions = {}
|
@@ -158,6 +170,10 @@ module Calabash
|
|
158
170
|
@screen_dimensions[key.to_sym] = val
|
159
171
|
end
|
160
172
|
end
|
173
|
+
@form_factor = version_data['form_factor']
|
174
|
+
|
175
|
+
# Deprecated 0.13.0
|
176
|
+
@iphone_4in = version_data['4inch']
|
161
177
|
end
|
162
178
|
|
163
179
|
# Is this device a simulator or physical device?
|
@@ -193,17 +209,25 @@ module Calabash
|
|
193
209
|
# Is this device a 4in iPhone?
|
194
210
|
# @return [Boolean] true if this device is a 4in iphone
|
195
211
|
def iphone_4in?
|
196
|
-
|
212
|
+
form_factor == 'iphone 4in'
|
197
213
|
end
|
198
214
|
|
199
|
-
#
|
200
|
-
# @
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
215
|
+
# Is this device an iPhone 6?
|
216
|
+
# @return [Boolean] true if this device is an iPhone 6
|
217
|
+
def iphone_6?
|
218
|
+
form_factor == 'iphone 6'
|
219
|
+
end
|
220
|
+
|
221
|
+
# Is this device an iPhone 6+?
|
222
|
+
# @return [Boolean] true if this device is an iPhone 6+
|
223
|
+
def iphone_6_plus?
|
224
|
+
form_factor == 'iphone 6+'
|
225
|
+
end
|
226
|
+
|
227
|
+
# Is this device an iPhone 3.5in?
|
228
|
+
# @return [Boolean] true if this device is an iPhone 3.5in?
|
229
|
+
def iphone_35in?
|
230
|
+
form_factor == 'iphone 3.5in'
|
207
231
|
end
|
208
232
|
|
209
233
|
# @!visibility private
|
@@ -289,6 +313,25 @@ module Calabash
|
|
289
313
|
_deprecated('0.10.0', 'no replacement', :warn)
|
290
314
|
@udid = value
|
291
315
|
end
|
316
|
+
|
317
|
+
# @deprecated 0.9.168 replaced with iphone_4in?
|
318
|
+
# @see #iphone_4in?
|
319
|
+
# Is this device an iPhone 5?
|
320
|
+
# @note Deprecated because the iPhone 5S reports as an iPhone6,*.
|
321
|
+
# @return [Boolean] true if this device is an iPhone 5
|
322
|
+
def iphone_5?
|
323
|
+
_deprecated('0.9.168', "use 'iphone_4in?' instead", :warn)
|
324
|
+
iphone_4in?
|
325
|
+
end
|
326
|
+
|
327
|
+
# @deprecated 0.13.1 - Call `iphone_4in?` instead.
|
328
|
+
# @see #iphone_4in?
|
329
|
+
# @note Deprecated after introducing new `form_factor` behavior.
|
330
|
+
# @return [Boolean] true if this device is an iPhone 5 or 5s
|
331
|
+
def iphone_4in
|
332
|
+
_deprecated('0.13.1', "use 'iphone_4in?' instead", :warn)
|
333
|
+
@iphone_4in
|
334
|
+
end
|
292
335
|
end
|
293
336
|
end
|
294
337
|
end
|
@@ -56,57 +56,71 @@ module Calabash
|
|
56
56
|
|
57
57
|
# Is the device under test an iPad?
|
58
58
|
#
|
59
|
-
# @raise [RuntimeError]
|
59
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
60
60
|
# @return [Boolean] true if device under test is an iPad.
|
61
61
|
def ipad?
|
62
|
-
_default_device_or_create
|
62
|
+
_default_device_or_create.ipad?
|
63
63
|
end
|
64
64
|
|
65
65
|
# Is the device under test an iPhone?
|
66
66
|
#
|
67
|
-
# @raise [RuntimeError]
|
67
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
68
68
|
# @return [Boolean] true if device under test is an iPhone.
|
69
69
|
def iphone?
|
70
|
-
_default_device_or_create
|
70
|
+
_default_device_or_create.iphone?
|
71
71
|
end
|
72
72
|
|
73
73
|
# Is the device under test an iPod?
|
74
74
|
#
|
75
|
-
# @raise [RuntimeError]
|
75
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
76
76
|
# @return [Boolean] true if device under test is an iPod.
|
77
77
|
def ipod?
|
78
|
-
_default_device_or_create
|
78
|
+
_default_device_or_create.ipod?
|
79
79
|
end
|
80
80
|
|
81
81
|
# Is the device under test an iPhone or iPod?
|
82
82
|
#
|
83
|
-
# @raise [RuntimeError]
|
84
|
-
# @return [Boolean] true
|
83
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
84
|
+
# @return [Boolean] true If device under test is an iPhone or iPod.
|
85
85
|
def device_family_iphone?
|
86
86
|
iphone? or ipod?
|
87
87
|
end
|
88
88
|
|
89
89
|
# Is the device under test a simulator?
|
90
90
|
#
|
91
|
-
# @raise [RuntimeError]
|
91
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
92
92
|
# @return [Boolean] true if device under test is a simulator.
|
93
93
|
def simulator?
|
94
|
-
_default_device_or_create
|
95
|
-
end
|
96
|
-
|
97
|
-
# @deprecated 0.9.168 replaced with `iphone_4in?`
|
98
|
-
# @see #iphone_4in?
|
99
|
-
def iphone_5?
|
100
|
-
_deprecated('0.9.168', "use 'iphone_4in?' instead", :warn)
|
101
|
-
iphone_4in?
|
94
|
+
_default_device_or_create.simulator?
|
102
95
|
end
|
103
96
|
|
104
|
-
#
|
97
|
+
# Is the device under test have a 4 inch screen?
|
105
98
|
#
|
106
|
-
# @raise [RuntimeError]
|
99
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
107
100
|
# @return [Boolean] true if device under test has a 4in screen.
|
108
101
|
def iphone_4in?
|
109
|
-
_default_device_or_create
|
102
|
+
_default_device_or_create.iphone_4in?
|
103
|
+
end
|
104
|
+
|
105
|
+
# Is the device under test an iPhone 6.
|
106
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
107
|
+
# @return [Boolean] true if this device is an iPhone 6
|
108
|
+
def iphone_6?
|
109
|
+
_default_device_or_create.iphone_6?
|
110
|
+
end
|
111
|
+
|
112
|
+
# Is the device under test an iPhone 6+?
|
113
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
114
|
+
# @return [Boolean] true if this device is an iPhone 6+
|
115
|
+
def iphone_6_plus?
|
116
|
+
_default_device_or_create.iphone_6_plus?
|
117
|
+
end
|
118
|
+
|
119
|
+
# Is the device under test an iPhone 3.5in?
|
120
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
121
|
+
# @return [Boolean] true if this device is an iPhone 3.5in?
|
122
|
+
def iphone_35in?
|
123
|
+
_default_device_or_create.iphone_35in?
|
110
124
|
end
|
111
125
|
|
112
126
|
# Is the device under test running iOS 5?
|
@@ -139,7 +153,6 @@ module Calabash
|
|
139
153
|
_OS_ENV.eql?(_canonical_os_version(:ios6)) || _default_device_or_create().ios6?
|
140
154
|
end
|
141
155
|
|
142
|
-
|
143
156
|
# Is the device under test running iOS 7?
|
144
157
|
#
|
145
158
|
# @note
|
@@ -171,10 +184,17 @@ module Calabash
|
|
171
184
|
#
|
172
185
|
# @see Calabash::Cucumber::IPad
|
173
186
|
#
|
174
|
-
# @raise [RuntimeError]
|
187
|
+
# @raise [RuntimeError] If the server cannot be reached.
|
175
188
|
# @return [Boolean] true if app is being emulated on an iPad.
|
176
189
|
def iphone_app_emulated_on_ipad?
|
177
|
-
_default_device_or_create
|
190
|
+
_default_device_or_create.iphone_app_emulated_on_ipad?
|
191
|
+
end
|
192
|
+
|
193
|
+
# @deprecated 0.9.168 replaced with `iphone_4in?`
|
194
|
+
# @see #iphone_4in?
|
195
|
+
def iphone_5?
|
196
|
+
_deprecated('0.9.168', "use 'iphone_4in?' instead", :warn)
|
197
|
+
iphone_4in?
|
178
198
|
end
|
179
199
|
|
180
200
|
private
|
@@ -3,11 +3,10 @@ module Calabash
|
|
3
3
|
|
4
4
|
# @!visibility public
|
5
5
|
# The Calabash iOS gem version.
|
6
|
-
VERSION = '0.
|
6
|
+
VERSION = '0.14.0'
|
7
7
|
|
8
8
|
# @!visibility public
|
9
|
-
# The minimum required version of the
|
10
|
-
|
11
|
-
MIN_SERVER_VERSION = '0.13.0'
|
9
|
+
# The minimum required version of the Calabash embedded server.
|
10
|
+
MIN_SERVER_VERSION = '0.14.0'
|
12
11
|
end
|
13
12
|
end
|
data/scripts/launch.rb
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
require 'calabash-cucumber/launcher'
|
18
18
|
|
19
19
|
|
20
|
-
# APP_BUNDLE_PATH = "
|
20
|
+
# APP_BUNDLE_PATH = "#{ENV['HOME']}/Library/Developer/Xcode/DerivedData/??/Build/Products/Calabash-iphonesimulator/??.app"
|
21
21
|
# You may uncomment the above to overwrite the APP_BUNDLE_PATH
|
22
22
|
# However the recommended approach is to let Calabash find the app itself
|
23
23
|
# or set the environment variable APP_BUNDLE_PATH
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Krukow
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -144,16 +144,22 @@ dependencies:
|
|
144
144
|
name: run_loop
|
145
145
|
requirement: !ruby/object:Gem::Requirement
|
146
146
|
requirements:
|
147
|
-
- - "
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '1.3'
|
150
|
+
- - "<"
|
148
151
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
152
|
+
version: '2.0'
|
150
153
|
type: :runtime
|
151
154
|
prerelease: false
|
152
155
|
version_requirements: !ruby/object:Gem::Requirement
|
153
156
|
requirements:
|
154
|
-
- - "
|
157
|
+
- - ">="
|
155
158
|
- !ruby/object:Gem::Version
|
156
|
-
version: 1.
|
159
|
+
version: '1.3'
|
160
|
+
- - "<"
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '2.0'
|
157
163
|
- !ruby/object:Gem::Dependency
|
158
164
|
name: json
|
159
165
|
requirement: !ruby/object:Gem::Requirement
|
@@ -224,6 +230,20 @@ dependencies:
|
|
224
230
|
- - '='
|
225
231
|
- !ruby/object:Gem::Version
|
226
232
|
version: 3.2.0
|
233
|
+
- !ruby/object:Gem::Dependency
|
234
|
+
name: luffa
|
235
|
+
requirement: !ruby/object:Gem::Requirement
|
236
|
+
requirements:
|
237
|
+
- - ">="
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: '0'
|
240
|
+
type: :development
|
241
|
+
prerelease: false
|
242
|
+
version_requirements: !ruby/object:Gem::Requirement
|
243
|
+
requirements:
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: '0'
|
227
247
|
- !ruby/object:Gem::Dependency
|
228
248
|
name: rake
|
229
249
|
requirement: !ruby/object:Gem::Requirement
|
@@ -326,16 +346,16 @@ dependencies:
|
|
326
346
|
name: stub_env
|
327
347
|
requirement: !ruby/object:Gem::Requirement
|
328
348
|
requirements:
|
329
|
-
- -
|
349
|
+
- - ">="
|
330
350
|
- !ruby/object:Gem::Version
|
331
|
-
version: 0
|
351
|
+
version: '0'
|
332
352
|
type: :development
|
333
353
|
prerelease: false
|
334
354
|
version_requirements: !ruby/object:Gem::Requirement
|
335
355
|
requirements:
|
336
|
-
- -
|
356
|
+
- - ">="
|
337
357
|
- !ruby/object:Gem::Version
|
338
|
-
version: 0
|
358
|
+
version: '0'
|
339
359
|
description: calabash-cucumber drives tests for native iOS apps. You must link your
|
340
360
|
app with calabash-ios-server framework to execute tests.
|
341
361
|
email:
|
@@ -531,7 +551,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
531
551
|
version: '0'
|
532
552
|
requirements: []
|
533
553
|
rubyforge_project:
|
534
|
-
rubygems_version: 2.
|
554
|
+
rubygems_version: 2.4.5
|
535
555
|
signing_key:
|
536
556
|
specification_version: 4
|
537
557
|
summary: Client for calabash-ios-server for automated functional testing on iOS
|