briar 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +8 -8
  2. data/Rakefile +6 -11
  3. data/bin/briar +58 -0
  4. data/bin/briar_helpers.rb +28 -2
  5. data/briar.gemspec +3 -2
  6. data/features/step_definitions/alerts_and_sheets/action_sheet_steps.rb +10 -4
  7. data/features/step_definitions/alerts_and_sheets/alert_view_steps.rb +3 -10
  8. data/features/step_definitions/bars/navbar_steps.rb +1 -9
  9. data/features/step_definitions/bars/tabbar_steps.rb +2 -4
  10. data/features/step_definitions/bars/toolbar_steps.rb +2 -11
  11. data/features/step_definitions/control/button_steps.rb +3 -8
  12. data/features/step_definitions/control/segmented_control_steps.rb +20 -58
  13. data/features/step_definitions/email_steps.rb +10 -7
  14. data/features/step_definitions/keyboard_steps.rb +7 -2
  15. data/features/step_definitions/picker/date_picker_steps.rb +21 -177
  16. data/features/step_definitions/table_steps.rb +35 -71
  17. data/features/step_definitions/text_field_steps.rb +1 -5
  18. data/features/step_definitions/text_view_steps.rb +2 -2
  19. data/install-calabash-framework.sh.example +10 -0
  20. data/lib/briar.rb +31 -5
  21. data/lib/briar/alerts_and_sheets/action_sheet.rb +99 -0
  22. data/lib/briar/alerts_and_sheets/alert_view.rb +25 -4
  23. data/lib/briar/bars/navbar.rb +30 -19
  24. data/lib/briar/bars/tabbar.rb +7 -4
  25. data/lib/briar/bars/toolbar.rb +14 -1
  26. data/lib/briar/briar_core.rb +46 -15
  27. data/lib/briar/control/button.rb +35 -1
  28. data/lib/briar/control/segmented_control.rb +69 -8
  29. data/lib/briar/control/slider.rb +2 -2
  30. data/lib/briar/cucumber.rb +3 -1
  31. data/lib/briar/email.rb +19 -13
  32. data/lib/briar/keyboard.rb +50 -10
  33. data/lib/briar/label.rb +20 -0
  34. data/lib/briar/picker/date_picker.rb +88 -584
  35. data/lib/briar/picker/date_picker_core.rb +293 -0
  36. data/lib/briar/picker/date_picker_manipulation.rb +255 -0
  37. data/lib/briar/picker/picker.rb +10 -0
  38. data/lib/briar/table.rb +261 -93
  39. data/lib/briar/version.rb +1 -1
  40. data/spec/spec_helper.rb +0 -2
  41. metadata +14 -13
  42. data/lib/briar/gestalt.rb +0 -87
  43. data/spec/briar/gestalt_spec.rb +0 -66
@@ -21,11 +21,7 @@ Then /^I should see a clear button in the text field in the "([^"]*)" row$/ do |
21
21
  end
22
22
 
23
23
  Then /^I touch the clear button in the text field in the "([^"]*)" row$/ do |row_id|
24
- query_str = "tableViewCell marked:'#{row_id}' child tableViewCellContentView child textField"
25
- res = query(query_str)
26
- screenshot_and_raise "expected to see text field in '#{row_id}' row" if res.empty?
27
- touch("#{query_str} child button")
28
- step_pause
24
+ touch_text_field_clear_button_in_row row_id
29
25
  end
30
26
 
31
27
  Then(/^I should see "(.*?)" text field with text "(.*?)"$/) do |text_field_id, text|
@@ -1,7 +1,7 @@
1
1
  Then /^I clear text view named "([^\"]*)"$/ do |name|
2
2
  res = query("textView marked:'#{name}'")
3
3
  if res
4
- set_text("textView marked:'#{name}'", '')
4
+ clear_text("textView marked:'#{name}'")
5
5
  end
6
6
  end
7
7
 
@@ -34,5 +34,5 @@ end
34
34
 
35
35
  Then /^I touch text view "([^"]*)"$/ do |text_view|
36
36
  touch("textView marked:'#{text_view}'")
37
- sleep(STEP_PAUSE)
37
+ step_pause
38
38
  end
@@ -0,0 +1,10 @@
1
+ #!/bin/sh
2
+ current_dir=`pwd`
3
+ cd ~/git/calabash-ios/calabash-cucumber
4
+ rake build_server
5
+ cd "$current_dir"
6
+ briar rm-cal-targets
7
+ cp ~/git/calabash-ios/calabash-cucumber/staticlib/calabash.framework.zip ./
8
+ rm -rf calabash.framework
9
+ unzip calabash.framework.zip
10
+ rm -rf calabash.framework.zip
data/lib/briar.rb CHANGED
@@ -1,15 +1,18 @@
1
1
  #$:.unshift File.dirname(__FILE__)
2
2
 
3
3
  DEVICE_ENDPOINT = (ENV['DEVICE_ENDPOINT'] || 'http://localhost:37265')
4
- AI = :accessibilityIdentifier
5
4
  TOUCH_TRANSITION_TIMEOUT = 30.0
6
5
  TOUCH_TRANSITION_RETRY_FREQ = 0.5
6
+ BRIAR_STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.4).to_f
7
+ ANIMATION_PAUSE = (ENV['ANIMATION_PAUSE'] || 0.6).to_f
8
+ AI = :accessibilityIdentifier
9
+ AL = :accessibilityLabel
7
10
 
8
11
  require 'briar/version'
9
- require 'briar/gestalt'
10
12
  require 'briar/briar_core'
11
13
 
12
14
  require 'briar/alerts_and_sheets/alert_view'
15
+ require 'briar/alerts_and_sheets/action_sheet'
13
16
 
14
17
  require 'briar/bars/tabbar'
15
18
  require 'briar/bars/navbar'
@@ -21,6 +24,8 @@ require 'briar/control/slider'
21
24
 
22
25
  require 'briar/picker/picker_shared'
23
26
  require 'briar/picker/picker'
27
+ require 'briar/picker/date_picker_core'
28
+ require 'briar/picker/date_picker_manipulation'
24
29
  require 'briar/picker/date_picker'
25
30
 
26
31
  require 'briar/email'
@@ -33,10 +38,31 @@ require 'briar/table'
33
38
  require 'briar/text_field'
34
39
  require 'briar/text_view'
35
40
 
41
+ #noinspection RubyDefParenthesesInspection
42
+ def device ()
43
+ url = URI.parse(ENV['DEVICE_ENDPOINT']|| 'http://localhost:37265/')
44
+ http = Net::HTTP.new(url.host, url.port)
45
+ res = http.start do |sess|
46
+ sess.request Net::HTTP::Get.new(ENV['CALABASH_VERSION_PATH'] || 'version')
47
+ end
48
+ status = res.code
49
+
50
+ #noinspection RubyUnusedLocalVariable
51
+ begin
52
+ http.finish if http and http.started?
53
+ rescue Exception => e
54
+ # ignored
55
+ end
56
+
57
+ if status=='200'
58
+ version_body = JSON.parse(res.body)
59
+ Calabash::Cucumber::Device.new(url, version_body)
60
+ end
61
+ end
62
+
63
+ #noinspection RubyDefParenthesesInspection
36
64
  def gestalt ()
37
- uri = URI("#{DEVICE_ENDPOINT}/version")
38
- res = Net::HTTP.get(uri)
39
- Briar::Gestalt.new(res)
65
+ pending("deprecated 0.0.8: replaced with Calabash::Cucumber::Device implementation - from now on use use 'device.*'")
40
66
  end
41
67
 
42
68
 
@@ -0,0 +1,99 @@
1
+ module Briar
2
+ module Alerts_and_Sheets
3
+
4
+ def query_str_for_sheet(sheet_id)
5
+ if sheet_id
6
+ "actionSheet marked:'#{sheet_id}'"
7
+ else
8
+ 'actionSheet'
9
+ end
10
+ end
11
+
12
+ def sheet_exists? (sheet_id)
13
+ !query(query_str_for_sheet sheet_id).empty?
14
+ end
15
+
16
+ def should_see_sheet (sheet_id, button_titles=nil, sheet_title=nil)
17
+ unless sheet_exists? (sheet_id)
18
+ screenshot_and_raise "should see sheet marked '#{sheet_id}'"
19
+ end
20
+
21
+ if button_titles
22
+ button_titles.each { |title| should_see_button_on_sheet title, sheet_id }
23
+ end
24
+
25
+ if sheet_title
26
+ should_see_sheet_title sheet_title, sheet_id
27
+ end
28
+ end
29
+
30
+ def should_not_see_sheet(sheet_id)
31
+ if sheet_exists? (sheet_id)
32
+ screenshot_and_raise "should not see sheet marked '#{sheet_id}'"
33
+ end
34
+ end
35
+
36
+ def wait_for_sheet (sheet_id, timeout=1.0)
37
+ msg = "waited for '#{timeout}' seconds but did not see '#{sheet_id}'"
38
+ wait_for(:timeout => timeout,
39
+ :retry_frequency => 0.2,
40
+ :post_timeout => 0.1,
41
+ :timeout_message => msg ) do
42
+ sheet_exists? sheet_id
43
+ end
44
+ end
45
+
46
+ def wait_for_sheet_to_disappear(sheet_id, timeout=1.0)
47
+ msg = "waited for '#{timeout}' seconds for '#{sheet_id}' to disappear but it is still visible"
48
+ options = {:timeout => timeout,
49
+ :retry_frequency => 0.2,
50
+ :post_timeout => 0.1,
51
+ :timeout_message => msg}
52
+ wait_for(options) do
53
+ not sheet_exists? sheet_id
54
+ end
55
+ end
56
+
57
+ def error_msg_for_sheet_button(button_title, visible, sheet_id=nil)
58
+ vis_str = visible ? 'see' : 'not see'
59
+ sheet_str = sheet_id ? sheet_id : ''
60
+ "should #{vis_str} button with title '#{button_title}' on sheet '#{sheet_str}'"
61
+ end
62
+
63
+ def sheet_button_exists? (button_title, sheet_id=nil)
64
+ sheet_query = query_str_for_sheet sheet_id
65
+ query("#{sheet_query} child button child label", :text).include?(button_title)
66
+ end
67
+
68
+ def should_see_button_on_sheet(button_title, sheet_id=nil)
69
+ unless sheet_button_exists? button_title, sheet_id
70
+ screenshot_and_raise error_msg_for_sheet_button button_title, true, sheet_id
71
+ end
72
+ end
73
+
74
+ def should_not_see_button_on_sheet(button_title, sheet_id=nil)
75
+ if sheet_button_exists? button_title, sheet_id
76
+ screenshot_and_raise error_msg_for_sheet_button button_title, false, sheet_id
77
+ end
78
+ end
79
+
80
+ def should_see_sheet_title(label_title, sheet_id=nil)
81
+ sheet_query = query_str_for_sheet sheet_id
82
+ res = query("#{sheet_query} child label", :text).include?(label_title)
83
+ unless res
84
+ "should see sheet #{sheet_id ? "'#{sheet_id}'" : ''} with title '#{label_title}'"
85
+ end
86
+ end
87
+
88
+ def touch_sheet_button (button_title, sheet_id=nil)
89
+ sheet_query = query_str_for_sheet sheet_id
90
+ should_see_button_on_sheet button_title, sheet_id
91
+ touch("#{sheet_query} child button child label marked:'#{button_title}'")
92
+ end
93
+
94
+ def touch_sheet_button_and_wait_for_view(button_title, view_id, sheet_id=nil)
95
+ touch_sheet_button button_title, sheet_id
96
+ wait_for_view view_id
97
+ end
98
+ end
99
+ end
@@ -1,16 +1,20 @@
1
1
  module Briar
2
2
  module Alerts_and_Sheets
3
- def alert_exists? (alert_id)
4
- !query("alertView marked:'#{alert_id}'").empty?
3
+ def alert_exists? (alert_id=nil)
4
+ if alert_id.nil?
5
+ !query('alertView').empty?
6
+ else
7
+ !query("alertView marked:'#{alert_id}'").empty?
8
+ end
5
9
  end
6
10
 
7
- def should_see_alert (alert_id)
11
+ def should_see_alert (alert_id=nil)
8
12
  unless alert_exists? alert_id
9
13
  screenshot_and_raise "should see alert view marked '#{alert_id}'"
10
14
  end
11
15
  end
12
16
 
13
- def should_not_see_alert (alert_id)
17
+ def should_not_see_alert (alert_id=nil)
14
18
  if alert_exists? alert_id
15
19
  screenshot_and_raise "should not see alert view marked '#{alert_id}'"
16
20
  end
@@ -28,7 +32,24 @@ module Briar
28
32
 
29
33
  def dismiss_alert_with_button (button_label)
30
34
  touch("alertView child button marked:'#{button_label}'")
35
+ wait_for_view_to_disappear 'alertView'
36
+ end
37
+
38
+ def should_see_alert_with_title (title)
39
+ unless query('alertView child label', :text).include?(title)
40
+ screenshot_and_raise "i do not see an alert view with title '#{title}'"
41
+ end
31
42
  end
32
43
 
44
+ def should_see_alert_with_message (message)
45
+ unless query('alertView descendant label', :text).include?(message)
46
+ screenshot_and_raise "i do not see an alert view with message '#{message}'"
47
+ end
48
+ end
49
+
50
+ def touch_alert_button(button_title)
51
+ touch("alertView child button marked:'#{button_title}'")
52
+ step_pause
53
+ end
33
54
  end
34
55
  end
@@ -19,7 +19,7 @@ module Briar
19
19
  end
20
20
 
21
21
  def navbar_has_back_button?
22
- !query('navigationItemButtonView').empty?
22
+ !query('navigationItemButtonView').empty?
23
23
  end
24
24
 
25
25
  def should_see_navbar_back_button
@@ -37,7 +37,7 @@ module Briar
37
37
 
38
38
  # will not work to detect left/right buttons
39
39
  def index_of_navbar_button (name)
40
- titles = query('navigationButton', :accessibilityLabel)
40
+ titles = query('navigationButton', AL)
41
41
  titles.index(name)
42
42
  end
43
43
 
@@ -58,54 +58,65 @@ module Briar
58
58
  def date_is_in_navbar (date)
59
59
  with_leading = date.strftime('%a %b %d')
60
60
  without_leading = date.strftime("%a %b #{date.day}")
61
- items = query('navigationItemView', :accessibilityLabel)
61
+ items = query('navigationItemView', AL)
62
62
  items.include?(with_leading) || items.include?(without_leading)
63
63
  end
64
64
 
65
65
 
66
66
  def go_back_after_waiting
67
- wait_for_animation
67
+ sleep(0.2)
68
+ wait_for(:timeout => 1.0,
69
+ :retry_frequency => 0.2) do
70
+ not query('navigationItemButtonView first').empty?
71
+ end
68
72
  touch('navigationItemButtonView first')
69
73
  step_pause
70
74
  end
71
75
 
72
76
  def go_back_and_wait_for_view (view)
73
- wait_for_animation
77
+ sleep(0.2)
78
+ wait_for(:timeout => 1.0,
79
+ :retry_frequency => 0.2) do
80
+ not query('navigationItemButtonView first').empty?
81
+ end
82
+
74
83
  touch_transition('navigationItemButtonView first',
75
84
  "view marked:'#{view}'",
76
85
  {:timeout=>TOUCH_TRANSITION_TIMEOUT,
77
86
  :retry_frequency=>TOUCH_TRANSITION_RETRY_FREQ})
87
+ step_pause
78
88
  end
79
89
 
80
- def touch_navbar_item(name)
90
+ def touch_navbar_item(item_name, wait_for_view_id=nil)
81
91
  wait_for(:timeout => 1.0,
82
92
  :retry_frequency => 0.4) do
83
- index_of_navbar_button(name) != nil
93
+ (index_of_navbar_button(item_name) != nil) || button_exists?(item_name)
84
94
  end
85
- wait_for_animation
86
- idx = index_of_navbar_button name
95
+ sleep(0.2)
96
+ idx = index_of_navbar_button item_name
97
+
87
98
  if idx
88
99
  touch("navigationButton index:#{idx}")
100
+ unless wait_for_view_id.nil?
101
+ wait_for_view wait_for_view_id
102
+ end
89
103
  step_pause
104
+ elsif button_exists? item_name
105
+ touch_button_and_wait_for_view item_name, wait_for_view_id
90
106
  else
91
- screenshot_and_raise "could not find navbar item '#{name}'"
107
+ screenshot_and_raise "could not find navbar item '#{item_name}'"
92
108
  end
93
109
  end
94
110
 
95
111
 
96
- def touch_navbar_item_and_wait_for_view(item, view)
97
- wait_for_animation
98
- idx = index_of_navbar_button item
99
- touch_transition("navigationButton index:#{idx}",
100
- "view marked:'#{view}'",
101
- {:timeout=>TOUCH_TRANSITION_TIMEOUT,
102
- :retry_frequency=>TOUCH_TRANSITION_RETRY_FREQ})
112
+ def touch_navbar_item_and_wait_for_view(item_name, view_id)
113
+ touch_navbar_item item_name, view_id
103
114
  end
104
115
 
105
116
 
106
117
  def navbar_has_title? (title)
107
- wait_for_animation
108
- query('navigationItemView', :accessibilityLabel).include?(title)
118
+ sleep(0.2)
119
+ query('navigationItemView', AL).include?(title)
109
120
  end
110
121
 
111
122
  def should_see_navbar_with_title(title)
@@ -19,20 +19,23 @@ module Briar
19
19
  end
20
20
 
21
21
  def index_of_tabbar_item(name)
22
- tabs = query('tabBarButton', :accessibilityLabel)
22
+ tabs = query('tabBarButton', AL)
23
23
  tabs.index(name)
24
24
  end
25
25
 
26
- def touch_tabbar_item(name)
26
+ def touch_tabbar_item(name, wait_for_view_id=nil)
27
+ sleep(0.2)
27
28
  wait_for(:timeout => 1.0,
28
29
  :retry_frequency => 0.4) do
29
30
  index_of_tabbar_item(name) != nil
30
31
  end
31
- wait_for_animation
32
32
  should_see_tabbar
33
33
  idx = index_of_tabbar_item name
34
34
  if idx
35
35
  touch "tabBarButton index:#{idx}"
36
+ unless wait_for_view_id.nil?
37
+ wait_for_view wait_for_view_id
38
+ end
36
39
  step_pause
37
40
  else
38
41
  screenshot_and_raise "tabbar button with name #{name} does not exist"
@@ -41,7 +44,7 @@ module Briar
41
44
 
42
45
  def should_see_tab_at_index(name, index)
43
46
  should_see_tabbar
44
- tabs = query('tabBarButton', :accessibilityLabel)
47
+ tabs = query('tabBarButton', AL)
45
48
  unless tabs.index(name) == index.to_i
46
49
  screenshot_and_raise "should have seen tab named '#{name}' at index '#{index}' but found these: '#{tabs}'"
47
50
  end
@@ -20,7 +20,7 @@ module Briar
20
20
  #text_button_arr = query("toolbar child toolbarTextButton child button child buttonLabel", :text)
21
21
  #has_text_button = text_button_arr.index(name_or_id) != nil
22
22
  ## look for non_text button
23
- #toolbar_button_arr = query("toolbar child toolbarButton", :accessibilityLabel)
23
+ #toolbar_button_arr = query("toolbar child toolbarButton", AL)
24
24
  #has_toolbar_button = toolbar_button_arr.index(name_or_id) != nil
25
25
  #
26
26
  #has_text_button or has_toolbar_button
@@ -32,5 +32,18 @@ module Briar
32
32
  screenshot_and_raise "could not see toolbar button with name '#{name_or_id}'"
33
33
  end
34
34
  end
35
+
36
+ def touch_toolbar_button(button_name, and_wait_for_view_id=nil)
37
+ should_see_toolbar_button button_name
38
+ if and_wait_for_view_id.nil?
39
+ touch("toolbar descendant view marked:'#{button_name}'")
40
+ else
41
+ touch_transition("toolbar descendant view marked:'#{button_name}'",
42
+ "view marked:'#{and_wait_for_view_id}'",
43
+ {:timeout=>TOUCH_TRANSITION_TIMEOUT,
44
+ :retry_frequency=>TOUCH_TRANSITION_RETRY_FREQ})
45
+ end
46
+ step_pause
47
+ end
35
48
  end
36
49
  end
@@ -1,12 +1,11 @@
1
1
  require 'calabash-cucumber'
2
2
 
3
+
3
4
  module Briar
4
5
  module Core
5
- STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.4).to_f
6
- ANIMATION_PAUSE = (ENV['ANIMATION_PAUSE'] || 0.6).to_f
7
6
 
8
7
  def step_pause
9
- sleep(STEP_PAUSE)
8
+ sleep(BRIAR_STEP_PAUSE)
10
9
  end
11
10
 
12
11
  def wait_for_animation
@@ -36,15 +35,12 @@ module Briar
36
35
 
37
36
 
38
37
  def should_see_view_after_animation (view_id)
39
- wait_for_animation
40
- should_see_view view_id
38
+ pending "WARN: deprecated 0.0.8 - use 'wait_for_view #{view_id}' instead"
39
+
41
40
  end
42
41
 
43
42
  def should_not_see_view_after_animation (view_id)
44
- wait_for_animation
45
- if view_exists? view_id
46
- screenshot_and_raise "should not see view with id '#{view_id}'"
47
- end
43
+ pending "WARN: deprecated 0.0.8 - use 'wait_for_view_to_disappear #{view_id}' instead"
48
44
  end
49
45
 
50
46
  def should_see_view_with_text (text)
@@ -58,6 +54,10 @@ module Briar
58
54
  touch("view marked:'#{view_id}'")
59
55
  end
60
56
 
57
+ def touch_and_wait_for_view(view_id, view_to_wait_for, timeout=1.0)
58
+ touch_view_named(view_id)
59
+ wait_for_view(view_to_wait_for, timeout)
60
+ end
61
61
 
62
62
  def wait_for_view (view_id, timeout=1.0)
63
63
  msg = "waited for '#{timeout}' seconds but did not see '#{view_id}'"
@@ -69,18 +69,49 @@ module Briar
69
69
  end
70
70
  end
71
71
 
72
+ def wait_for_views(views, timeout=1.0)
73
+ msg = "waited for '#{timeout}' seconds but did not see '#{views}'"
74
+ options = {:timeout => timeout,
75
+ :retry_frequency => 0.2,
76
+ :post_timeout => 0.1,
77
+ :timeout_message => msg}
78
+ wait_for(options) do
79
+ views.all? { |view_id| view_exists?(view_id) }
80
+ end
81
+ end
82
+
72
83
  def wait_for_view_to_disappear(view_id, timeout=1.0)
73
- views = [view_id]
74
84
  msg = "waited for '#{timeout}' seconds for '#{view_id}' to disappear but it is still visible"
75
- wait_for_elements_do_not_exist(views, {:timeout => timeout,
76
- :retry_frequency => 0.2,
77
- :post_timeout => 0.1,
78
- :timeout_message => msg})
85
+ options = {:timeout => timeout,
86
+ :retry_frequency => 0.2,
87
+ :post_timeout => 0.1,
88
+ :timeout_message => msg}
89
+ wait_for(options) do
90
+ not view_exists? view_id
91
+ end
79
92
  end
80
93
 
94
+
81
95
  def touch_and_wait_to_disappear(view_id, timeout=1.0)
82
- touch("view marked:'#{view_id}'")
96
+ touch_view_named(view_id)
83
97
  wait_for_view_to_disappear view_id, timeout
84
98
  end
99
+
100
+ # backdoor helpers
101
+ # canonical backdoor command: 'calabash_backdoor_handle_command'
102
+ # selector key = :selector
103
+ # args key = :args
104
+ def send_backdoor_command(command, args=[])
105
+ if args.empty?
106
+ json = "{\":selector\" : \"#{command}\"}"
107
+ return backdoor('calabash_backdoor_handle_command:', json)
108
+ end
109
+
110
+ array = args.kind_of?(Array) ? args : [args]
111
+ json = "{\":selector\" : \"#{command}\", \":args\" : #{array}}"
112
+ backdoor('calabash_backdoor_handle_command:', json)
113
+ end
85
114
  end
86
115
  end
116
+
117
+