calabash-cucumber 0.9.151 → 0.9.152

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,7 +10,7 @@ module Calabash
10
10
 
11
11
  GESTALT_IPHONE = 'iPhone'
12
12
  GESTALT_IPAD = 'iPad'
13
- GESTALT_IPHONE5 = 'Retina 4-inch'
13
+ GESTALT_IPHONE5 = '4-inch'
14
14
  GESTALT_SIM_SYS = 'x86_64'
15
15
  GESTALT_IPOD = 'iPod'
16
16
 
@@ -55,7 +55,7 @@ module Calabash
55
55
 
56
56
  def iphone_5?
57
57
  if simulator?
58
- simulator_details.split(/[(),]/)[3].eql? GESTALT_IPHONE5
58
+ !simulator_details.scan(GESTALT_IPHONE5).empty?
59
59
  else
60
60
  system.split(/[\D]/).delete_if { |x| x.eql?('') }.first.eql?('5')
61
61
  end
@@ -72,6 +72,10 @@ module Calabash
72
72
  version_hash(ios_version)[:major_version]
73
73
  end
74
74
 
75
+ def ios7?
76
+ ios_major_version.eql?('7')
77
+ end
78
+
75
79
  def ios6?
76
80
  ios_major_version.eql?('6')
77
81
  end
@@ -0,0 +1,76 @@
1
+ require 'calabash-cucumber/launcher'
2
+ require 'calabash-cucumber/uia'
3
+
4
+
5
+ module Calabash
6
+ module Cucumber
7
+ module IOS7Operations
8
+ include Calabash::Cucumber::UIA
9
+
10
+ def ios7?
11
+ launcher = @calabash_launcher || Calabash::Cucumber::Launcher.launcher_if_used
12
+ ENV['OS']=='ios7' || (launcher && launcher.device.ios7?)
13
+ end
14
+
15
+ def touch_ios7(options)
16
+ ui_query = options[:query]
17
+ offset = options[:offset]
18
+ if ui_query.nil?
19
+ uia_tap_offset(offset)
20
+ else
21
+ el_to_touch = find_or_raise(ui_query)
22
+ touch(el_to_touch, options)
23
+ [el_to_touch]
24
+ end
25
+ end
26
+
27
+ def swipe_ios7(options)
28
+ ui_query = options[:query]
29
+ offset = options[:offset]
30
+ if ui_query.nil?
31
+ uia_swipe_offset(offset, options)
32
+ else
33
+ el_to_swipe = find_or_raise(ui_query)
34
+ offset = point_from(el_to_swipe, options)
35
+ uia_swipe_offset(offset, options)
36
+ [el_to_swipe]
37
+ end
38
+ end
39
+
40
+ def pinch_ios7(in_or_out, options)
41
+ ui_query = options[:query]
42
+ offset = options[:offset]
43
+ duration = options[:duration] || 0.5
44
+ if ui_query.nil?
45
+ uia_pinch_offset(in_or_out, offset, {:duration => options[:duration]})
46
+ else
47
+ el_to_pinch = find_or_raise(ui_query)
48
+ offset = point_from(el_to_pinch, options)
49
+ uia_pinch_offset(in_or_out, offset, duration)
50
+ [el_to_pinch]
51
+ end
52
+ end
53
+
54
+ def pan_ios7(from, to, options={})
55
+ from_result = find_or_raise from
56
+ to_result = find_or_raise to
57
+ uia_pan_offset(point_from(from_result, options), point_from(to_result, options), options)
58
+ [to_result]
59
+ end
60
+
61
+ def rotate_ios7(dir)
62
+ throw NotImplementedError
63
+ end
64
+
65
+ def find_or_raise(ui_query)
66
+ results = query(ui_query)
67
+ if results.empty?
68
+ screenshot_and_raise "Unable to find element matching query #{ui_query}"
69
+ else
70
+ results.first
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
@@ -14,6 +14,15 @@ module Calabash
14
14
  :numbers_and_punctuation_alternate => "numbers-and-punctuation-alternate"
15
15
  }
16
16
 
17
+
18
+ IOS7_SUPPORTED_CHARS = {
19
+ 'Dictation' => nil,
20
+ 'Shift' => nil,
21
+ 'Delete' => '\b',
22
+ 'International' => nil,
23
+ 'More' => nil,
24
+ 'Return' => '\n'
25
+ }
17
26
  #Possible values
18
27
  # 'Dictation'
19
28
  # 'Shift'
@@ -23,17 +32,31 @@ module Calabash
23
32
  # 'Return'
24
33
  def keyboard_enter_char(chr, should_screenshot=true)
25
34
  #map(nil, :keyboard, load_playback_data("touch_done"), chr)
26
- res = http({:method => :post, :path => 'keyboard'},
27
- {:key => chr, :events => load_playback_data("touch_done")})
28
- res = JSON.parse(res)
29
- if res['outcome'] != 'SUCCESS'
30
- msg = "Keyboard enter failed failed because: #{res['reason']}\n#{res['details']}"
31
- if should_screenshot
32
- screenshot_and_raise msg
35
+ if ios7?
36
+ if chr.length == 1
37
+ uia_type_string chr
33
38
  else
34
- raise msg
39
+ code = IOS7_SUPPORTED_CHARS[chr]
40
+ if code
41
+ uia_type_string code
42
+ else
43
+ raise "Char #{chr} is not yet supported in iOS7"
44
+ end
45
+ end
46
+ else
47
+ res = http({:method => :post, :path => 'keyboard'},
48
+ {:key => chr, :events => load_playback_data("touch_done")})
49
+ res = JSON.parse(res)
50
+ if res['outcome'] != 'SUCCESS'
51
+ msg = "Keyboard enter failed failed because: #{res['reason']}\n#{res['details']}"
52
+ if should_screenshot
53
+ screenshot_and_raise msg
54
+ else
55
+ raise msg
56
+ end
35
57
  end
36
58
  end
59
+
37
60
  if ENV['POST_ENTER_KEYBOARD']
38
61
  w = ENV['POST_ENTER_KEYBOARD'].to_f
39
62
  if w > 0
@@ -44,7 +67,12 @@ module Calabash
44
67
  end
45
68
 
46
69
  def done
47
- keyboard_enter_char "Return"
70
+ if ios7?
71
+ uia_type_string '\n'
72
+ else
73
+ keyboard_enter_char "Return"
74
+ end
75
+
48
76
  end
49
77
 
50
78
 
@@ -94,14 +122,19 @@ module Calabash
94
122
 
95
123
  def keyboard_enter_text(text)
96
124
  fail("No visible keyboard") if element_does_not_exist("view:'UIKBKeyplaneView'")
97
-
98
- text.each_char do |ch|
99
- begin
100
- keyboard_enter_char(ch, false)
101
- rescue
102
- search_keyplanes_and_enter_char(ch)
125
+ if ios7?
126
+ uia_type_string(text)
127
+ else
128
+ text.each_char do |ch|
129
+ begin
130
+ keyboard_enter_char(ch, false)
131
+ rescue
132
+ search_keyplanes_and_enter_char(ch)
133
+ end
103
134
  end
104
135
  end
136
+
137
+
105
138
  end
106
139
 
107
140
 
@@ -9,8 +9,28 @@ class Calabash::Cucumber::Launcher
9
9
  attr_accessor :device_target
10
10
  attr_accessor :device
11
11
 
12
+ class StartError < RuntimeError
13
+ attr_accessor :error
14
+ def initialize(err)
15
+ self.error= err
16
+ end
17
+
18
+ def to_s
19
+ "#{super.to_s}: #{error}"
20
+ end
21
+ end
22
+
23
+ def self.launcher(device_target=:simulator)
24
+ @@launcher ||= Launcher.new(device_target)
25
+ end
26
+
27
+ def self.launcher_if_used
28
+ @@launcher
29
+ end
30
+
12
31
  def initialize(device_target=:simulator)
13
32
  self.device_target = device_target
33
+ @@launcher = self
14
34
  end
15
35
 
16
36
  class CalabashLauncherTimeoutErr < Timeout::Error
@@ -32,6 +52,18 @@ class Calabash::Cucumber::Launcher
32
52
  ENV['DEVICE_TARGET'] == 'simulator'
33
53
  end
34
54
 
55
+ def sdk_version
56
+ ENV['SDK_VERSION']
57
+ end
58
+
59
+ def reset_between_scenarios?
60
+ ENV['RESET_BETWEEN_SCENARIOS']=="1"
61
+ end
62
+
63
+ def device_env
64
+ ENV['DEVICE'] || 'iphone'
65
+ end
66
+
35
67
  def active?
36
68
  (simulator_target? || device_target?) && (not run_loop.nil?)
37
69
  end
@@ -73,28 +105,40 @@ class Calabash::Cucumber::Launcher
73
105
  default_args[:udid] = target
74
106
  end
75
107
  default_args
76
- self.run_loop = RunLoop.run(default_args.merge(args))
108
+ self.run_loop = new_run_loop(default_args.merge(args))
77
109
  else
78
110
 
79
- sdk = ENV['SDK_VERSION'] || SimLauncher::SdkDetector.new().latest_sdk_version
111
+ sdk = sdk_version || SimLauncher::SdkDetector.new().latest_sdk_version
80
112
  path = Calabash::Cucumber::SimulatorHelper.app_bundle_or_raise(app_path)
81
- if ENV['RESET_BETWEEN_SCENARIOS']=="1"
113
+ if reset_between_scenarios?
82
114
  reset_app_jail(sdk, path)
83
115
  end
84
116
 
85
117
  if simulator_target?
86
- device = (ENV['DEVICE'] || 'iphone').to_sym
87
- default_args = {:app => path, :device => device}
88
- self.run_loop = RunLoop.run(default_args.merge(args))
118
+ default_args = {:app => path, :device => device_env.to_sym}
119
+ self.run_loop = new_run_loop(default_args.merge(args))
89
120
  else
90
121
  ## sim launcher
91
- Calabash::Cucumber::SimulatorHelper.relaunch(path, sdk, ENV['DEVICE'] || 'iphone', args)
122
+ Calabash::Cucumber::SimulatorHelper.relaunch(path, sdk, device_env, args)
92
123
  end
93
124
 
94
125
  end
95
126
  ensure_connectivity
96
127
  end
97
128
 
129
+ def new_run_loop(args)
130
+ last_err = nil
131
+ 3.times do
132
+ begin
133
+ return RunLoop.run(args)
134
+ rescue RunLoop::TimeoutError => e
135
+ if ENV['CALABASH_FULL_CONSOLE_OUTPUT'] == '1'
136
+ puts "retrying run loop..."
137
+ end
138
+ end
139
+ end
140
+ raise StartError.new(last_err)
141
+ end
98
142
 
99
143
  def ensure_connectivity
100
144
  begin
@@ -38,7 +38,7 @@ module Calabash
38
38
  end
39
39
 
40
40
  def home_direction
41
- @current_rotation = @current_rotation || :down
41
+ device_orientation().to_sym
42
42
  end
43
43
 
44
44
  def assert_home_direction(expected)
@@ -74,14 +74,20 @@ module Calabash
74
74
 
75
75
  def set_text(uiquery, txt)
76
76
  unless ENV['CALABASH_NO_DEPRECATION'] == '1'
77
- puts 'set_text is deprecated, please use keyboard_enter_text'
78
- puts 'https://github.com/calabash/calabash-ios/wiki/03.5-Calabash-iOS-Ruby-API'
77
+ warn "WARNING: set_text will be deprecated.\n * to enter text using the native keyboard use 'keyboard_enter_text'\n * to clear a text field or text view use 'clear_text'"
78
+ warn 'https://github.com/calabash/calabash-ios/wiki/03.5-Calabash-iOS-Ruby-API'
79
79
  end
80
80
  text_fields_modified = map(uiquery, :setText, txt)
81
81
  screenshot_and_raise "could not find text field #{uiquery}" if text_fields_modified.empty?
82
82
  text_fields_modified
83
83
  end
84
84
 
85
+ def clear_text(uiquery)
86
+ views_modified = map(uiquery, :setText, '')
87
+ screenshot_and_raise "could not find text field #{uiquery}" if views_modified.empty?
88
+ views_modified
89
+ end
90
+
85
91
 
86
92
  def set_user_pref(key, val)
87
93
  res = http({:method => :post, :path => 'userprefs'},
@@ -105,7 +111,7 @@ module Calabash
105
111
  res['results'].first
106
112
  end
107
113
 
108
-
114
+ # ha! i recognize this code - jjm
109
115
  #not officially supported yet
110
116
  #def change_slider_value_to(q, value)
111
117
  # target = value.to_f
@@ -0,0 +1,199 @@
1
+ YnBsaXN0MDCvEDcAAQASABwAJQAuADcAQABJAFIAWwBkAG0AdgB/AIgAkQCaAKMA
2
+ rAC1AL4AxwDQANkA4gDrAPQA/QEGAQ8BGAEhASoBMwE8AUUBTgFXAWABaQFyAXsB
3
+ hAGNAZYBnwGoAbEBugHDAcwB1QHeAecB8NUAAgADAAQABQAGAAcACAAJAA4AEVRU
4
+ aW1lVERhdGFeV2luZG93TG9jYXRpb25YTG9jYXRpb25UVHlwZRMAAAkNWGTduU8Q
5
+ QAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAICAgAAAIA/AACA
6
+ PwCAlUMAAAFDAAB3QAAAAADSAAoACwAMAA1RWFFZI0BysAAAAAAAI0BgIAAAAAAA
7
+ 0gAKAAsADwAQI0BysAAAAAAAI0BgIAAAAAAAEQu51QACABMABAAFAAYAFAAVABYA
8
+ GQARVERhdGETAAAJDWtP7RNPEEACAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAAAAAQACAgIAAACAPwAAgD8AAJVDAAABQwAAAADpfHiW0gAKAAsAFwAYI0By
10
+ oAAAAAAAI0BgIAAAAAAA0gAKAAsAGgAbI0ByoAAAAAAAI0BgIAAAAAAA1QACABMA
11
+ BAAFAAYAHQAeAB8AIgAREwAACQ1sTWGbTxBAAgAAAAEAAQAAAAAAAAAAAAAAAAAA
12
+ AAAAAAAAAAAAAAAAAAEAAgICAAAAgD8AAIA/AICUQwAAAUMAAAAAcCh8ttIACgAL
13
+ ACAAISNAcpAAAAAAACNAYCAAAAAAANIACgALACMAJCNAcpAAAAAAACNAYCAAAAAA
14
+ ANUAAgATAAQABQAGACYAJwAoACsAERMAAAkNbUnNLU8QQAIAAAABAAEAAAAAAAAA
15
+ AAAAAAAAAAAAAAAAAAAAAAAAAAABAAICAgAAAIA/AACAPwAAk0MAAANDAAAAAFqA
16
+ ttXSAAoACwApACojQHJgAAAAAAAjQGBgAAAAAADSAAoACwAsAC0jQHJgAAAAAAAj
17
+ QGBgAAAAAADVAAIAEwAEAAUABgAvADAAMQA0ABETAAAJDW5NWDNPEEACAAAAAQAB
18
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACAgIAAACAPwAAgD8AAJJDAAAG
19
+ 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
177
+ AADSAAoACwH3AfgjQHLAAAAAAAAjQHCQAAAAAAAACAB5AI4AkwCYAKcAsAC1AL4B
178
+ AQEKAQwBDgEXASABKQEyATsBPgFTAVgBYQGkAa0BtgG/AcgB0QHaAe8B+AI7AkQC
179
+ TQJWAl8CaAJxAoYCjwLSAtsC5ALtAvYC/wMIAx0DJgNpA3IDewOEA40DlgOfA7QD
180
+ vQQABAkEEgQbBCQELQQ2BEsEVASXBKAEqQSyBLsExATNBOIE6wUuBTcFQAVJBVIF
181
+ WwVkBXkFggXFBc4F1wXgBekF8gX7BhAGGQZcBmUGbgZ3BoAGiQaSBqcGsAbzBvwH
182
+ BQcOBxcHIAcpBz4HRweKB5MHnAelB64HtwfAB9UH3gghCCoIMwg8CEUITghXCGwI
183
+ dQi4CMEIygjTCNwI5QjuCQMJDAlPCVgJYQlqCXMJfAmFCZoJownmCe8J+AoBCgoK
184
+ EwocCjEKOgp9CoYKjwqYCqEKqgqzCsgK0QsUCx0LJgsvCzgLQQtKC18LaAurC7QL
185
+ vQvGC88L2AvhC/YL/wxCDEsMVAxdDGYMbwx4DI0MlgzZDOIM6wz0DP0NBg0PDSQN
186
+ LQ1wDXkNgg2LDZQNnQ2mDbsNxA4HDhAOGQ4iDisONA49DlIOWw6eDqcOsA65DsIO
187
+ yw7UDukO8g81Dz4PRw9QD1kPYg9rD4APiQ/MD9UP3g/nD/AP+RACEBcQIBBjEGwQ
188
+ dRB+EIcQkBCZEK4QtxD6EQMRDBEVER4RJxEwEUURThGREZoRoxGsEbURvhHHEdwR
189
+ 5RIoEjESOhJDEkwSVRJeEnMSfBK/EsgS0RLaEuMS7BL1EwoTExNWE18TaBNxE3oT
190
+ gxOME6ETqhPtE/YT/xQIFBEUGhQjFDgUQRSEFI0UlhSfFKgUsRS6FM8U2BUbFSQV
191
+ LRU2FT8VSBVRFWYVbxWyFbsVxBXNFdYV3xXoFf0WBhZJFlIWWxZkFm0WdhZ/FpQW
192
+ nRbgFukW8hb7FwQXDRcWFysXNBd3F4AXiReSF5sXpBetF8IXyxgOGBcYIBgpGDIY
193
+ OxhEGFkYYhilGK4YtxjAGMkY0hjbGPAY+Rk8GUUZThlXGWAZaRlyGYcZkBnTGdwZ
194
+ 5RnuGfcaABoJGh4aJxpqGnMafBqFGo4alxqgGrUavhsBGwobExscGyUbLhs3G0wb
195
+ VRuYG6EbqhuzG7wbxRvOG+Mb7BwvHDgcQRxKHFMcXBxlHHocgxzGHM8c2BzhHOoc
196
+ 8xz8HREdGh1dHWYdbx14HYEdih2THagdsR30Hf0eBh4PHhgeIR4qHj8eSB6LHpQe
197
+ nR6mHq8euB7BHtYe3x8iHysfNB89H0YfTx9YH20fdh+5H8Ifyx/UH90f5h/vIAQg
198
+ DSBQIFkgYiBrIHQgfSCGIJsgpCDnIPAg+SECIQshFAAAAAAAAAICAAAAAAAAAfkA
199
+ AAAAAAAAAAAAAAAAACEd