Module: Calabash::Cucumber::WaitHelpers
- Includes:
- Core, TestsHelpers
- Included in:
- Operations
- Defined in:
- lib/calabash-cucumber/wait_helpers.rb
Overview
A collection of methods that help you wait for things.
Defined Under Namespace
Classes: WaitError
Constant Summary collapse
- CALABASH_CONDITIONS =
Currently two conditions that can be waited for using
wait_for_condition::none_animatingno UIKit object is animating and:no_network_indicatorstatus bar network indicator not showing. {:none_animating => 'NONE_ANIMATING', :no_network_indicator => 'NO_NETWORK_INDICATOR'}
- DEFAULT_OPTS =
The default options used in the "wait*" methods
{ # default upper limit on how long to wait :timeout => 30, # default polling frequency for waiting :retry_frequency => 0.3, # default extra wait after the condition becomes true :post_timeout => 0, # default message if timeout occurs :timeout_message => 'Timed out waiting...', # Calabash will generate a screenshot by default if waiting times out :screenshot_on_error => true }
Instance Method Summary collapse
-
#touch_transition(touch_q, done_queries, check_options = {}, animation_options = {}) ⇒ Object
Combines touching an element and
wait_for_transition. -
#until_element_does_not_exist(uiquery, opts = {}) ⇒ Object
Performs a lambda action until the element (a query string) disappears.
-
#until_element_exists(uiquery, opts = {}) ⇒ Object
Performs a lambda action until the element (a query string) appears.
-
#wait_error(msg) ⇒ WaitError, Object
if
msgis a String, a new WaitError is returned. -
#wait_for(options_or_timeout = DEFAULT_OPTS, &block) ⇒ nil
Waits for a condition to be true.
-
#wait_for_element_does_not_exist(element_query, options = {}) ⇒ nil
(also: #wait_for_element_does_not_exists)
Waits for a Calabash query to return an empty result (typically a UI element to disappear).
-
#wait_for_element_exists(element_query, options = {}) ⇒ nil
Waits for a Calabash query to return a non-empty result (typically a UI element to be visible).
-
#wait_for_elements_do_not_exist(elements_arr, options = {}) ⇒ nil
Waits for one or more Calabash queries to all return empty results (typically a UI elements to disappear).
-
#wait_for_elements_exist(elements_arr, options = {}) ⇒ nil
Waits for one or more Calabash queries to all return non-empty results (typically a UI elements to be visible).
-
#wait_for_no_network_indicator(options = {}) ⇒ nil
Waits for the status-bar network indicator to stop animating (network activity done).
-
#wait_for_none_animating(options = {}) ⇒ nil
Waits for all elements to stop animating (EXPERIMENTAL).
-
#wait_for_transition(done_queries, check_options = {}, animation_options = {}) ⇒ Object
Combines waiting for elements and waiting for animations.
-
#wait_poll(opts, &block) ⇒ nil
Repeatedly runs an action (for side-effects) until a condition is satisfied.
-
#wait_tap(uiquery, options = {}) ⇒ Array<Hash>
Performs the
tapgesture on the (first) view that matches queryuiquery. -
#when_element_exists(uiquery, opts = {}) ⇒ Object
Performs a lambda action once the element exists.
Methods included from TestsHelpers
#check_element_does_not_exist, #check_element_exists, #check_view_with_mark_exists, #classes, #each_cell, #element_does_not_exist, #element_exists, #view_with_mark_exists
Methods included from FailureHelpers
#fail, #screenshot, #screenshot_and_raise, #screenshot_embed
Methods included from Core
#await_page, #backdoor, #calabash_exit, #calabash_info, #calabash_warn, #clear_text, #client_version, #console_attach, #deprecated, #device_agent, #dismiss_ipad_keyboard, #double_tap, #flash, #flick, #html, #identifier, #keyboard_enter_char, #keyboard_enter_text, #label, #location_for_place, #page, #pan, #pan_coordinates, #pinch, #query, #rotate, #rotate_home_button_to, #scroll, #scroll_to_cell, #scroll_to_collection_view_item, #scroll_to_collection_view_item_with_mark, #scroll_to_mark, #scroll_to_row, #scroll_to_row_with_mark, #send_app_to_background, #server_log_level, #server_version, #set_location, #set_server_log_level, #set_text, #set_user_pref, #shake, #slider_set_value, #start_test_server_in_background, #swipe, #tap_keyboard_action_key, #tap_keyboard_delete_key, #tap_mark, #tap_point, #touch, #touch_hold, #two_finger_tap, #user_pref
Methods included from KeyboardHelpers
#docked_keyboard_visible?, #keyboard_visible?, #lookup_key_name, #split_keyboard_visible?, #undocked_keyboard_visible?, #wait_for_keyboard, #wait_for_no_keyboard
Methods included from StatusBarHelpers
#device_orientation, #landscape?, #portrait?, #status_bar_details, #status_bar_orientation
Methods included from UIA
#uia, #uia_call, #uia_call_windows, #uia_keyboard_visible?, #uia_names, #uia_orientation, #uia_query, #uia_query_windows, #uia_rotate, #uia_rotate_home_button_to, #uia_set_responder_value, #uia_wait_for_keyboard
Methods included from QueryHelpers
#escape_backslashes, #escape_newlines, #escape_quotes, #escape_string
Methods included from EnvironmentHelpers
#default_device, #device_family_iphone?, #ios10?, #ios11?, #ios5?, #ios6?, #ios7?, #ios8?, #ios9?, #ios_gte_11?, #ios_version, #ipad?, #ipad_pro?, #iphone?, #iphone_35in?, #iphone_4in?, #iphone_6?, #iphone_6_plus?, #iphone_app_emulated_on_ipad?, #ipod?, #screen_dimensions, #simulator?, #uia_available?, #uia_not_available?, #xamarin_test_cloud?
Instance Method Details
#touch_transition(touch_q, done_queries, check_options = {}, animation_options = {}) ⇒ Object
Combines touching an element and wait_for_transition
364 365 366 367 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 364 def touch_transition(touch_q, done_queries,={},={}) touch(touch_q) wait_for_transition(done_queries,,) end |
#until_element_does_not_exist(uiquery, opts = {}) ⇒ Object
Performs a lambda action until the element (a query string) disappears. The default action is to do nothing.
Raises an error if no uiquery is specified.
400 401 402 403 404 405 406 407 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 400 def until_element_does_not_exist(uiquery, opts = {}) condition = lambda {element_does_not_exist(uiquery)} extra_opts = { :until => condition, :action => lambda {} } opts = DEFAULT_OPTS.merge(extra_opts).merge(opts) wait_poll(opts) do opts[:action].call end end |
#until_element_exists(uiquery, opts = {}) ⇒ Object
Performs a lambda action until the element (a query string) appears.
The default action is to do nothing. Similar to wait_poll.
Raises an error if no uiquery is specified.
381 382 383 384 385 386 387 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 381 def until_element_exists(uiquery, opts = {}) extra_opts = { :until_exists => uiquery, :action => lambda {} } opts = DEFAULT_OPTS.merge(extra_opts).merge(opts) wait_poll(opts) do opts[:action].call end end |
#wait_error(msg) ⇒ WaitError, Object
if msg is a String, a new WaitError is returned. Otherwise msg
itself is returned.
475 476 477 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 475 def wait_error(msg) (msg.is_a?(String) ? WaitError.new(msg) : msg) end |
#wait_for(options_or_timeout = DEFAULT_OPTS, &block) ⇒ nil
Waits for a condition to be true. The condition is specified by a given block that is called repeatedly.
If the block returns a 'trueish' value the condition is considered true and
wait_for immediately returns.
There is a :timeout option that specifies a maximum number of seconds to wait.
If the given block doesn't return a 'trueish' value before the :timeout seconds has elapsed,
the waiting fails and raises a WaitError error.
The options hash
controls the details of waiting (see options_or_timeout below).
DEFAULT_OPTS specifies the default waiting options.
wait_for is a low-level building-block for waiting and often there are higher-level
waiting methods what use wait_for in their implementation (e.g. wait_for_element_exists).
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 115 def wait_for(=DEFAULT_OPTS, &block) #note Hash is preferred, number acceptable for backwards compat default_timeout = 30 timeout = || default_timeout post_timeout=0 retry_frequency=0.3 = nil screenshot_on_error = true if .is_a?(Hash) timeout = [:timeout] || default_timeout retry_frequency = [:retry_frequency] || retry_frequency post_timeout = [:post_timeout] || post_timeout = [:timeout_message] if .key?(:screenshot_on_error) screenshot_on_error = [:screenshot_on_error] end end begin Timeout.timeout(timeout, WaitError) do sleep(retry_frequency) until yield end sleep(post_timeout) if post_timeout > 0 rescue WaitError => e msg = || e if screenshot_on_error sleep(retry_frequency) return screenshot_and_retry(msg, &block) else raise wait_error(msg) end rescue => e (e, nil, screenshot_on_error) end end |
#wait_for_element_does_not_exist(element_query, options = {}) ⇒ nil Also known as: wait_for_element_does_not_exists
Waits for a Calabash query to return an empty result (typically a UI element to disappear).
Uses wait_for.
247 248 249 250 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 247 def wait_for_element_does_not_exist(element_query, ={}) [:timeout_message] = [:timeout_message] || "Timeout waiting for element to not exist: #{element_query}" wait_for() { element_does_not_exist(element_query) } end |
#wait_for_element_exists(element_query, options = {}) ⇒ nil
Waits for a Calabash query to return a non-empty result (typically a UI element to be visible).
Uses wait_for.
210 211 212 213 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 210 def wait_for_element_exists(element_query, ={}) [:timeout_message] = [:timeout_message] || "Timeout waiting for element: #{element_query}" wait_for() { element_exists(element_query) } end |
#wait_for_elements_do_not_exist(elements_arr, options = {}) ⇒ nil
Waits for one or more Calabash queries to all return empty results (typically a UI elements to disappear).
Uses wait_for.
265 266 267 268 269 270 271 272 273 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 265 def wait_for_elements_do_not_exist(elements_arr, ={}) if elements_arr.is_a?(String) elements_arr = [elements_arr] end [:timeout_message] = [:timeout_message] || "Timeout waiting for no elements matching: #{elements_arr.join(",")}" wait_for() do elements_arr.none? { |q| element_exists(q) } end end |
#wait_for_elements_exist(elements_arr, options = {}) ⇒ nil
Waits for one or more Calabash queries to all return non-empty results (typically a UI elements to be visible).
Uses wait_for.
226 227 228 229 230 231 232 233 234 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 226 def wait_for_elements_exist(elements_arr, ={}) if elements_arr.is_a?(String) elements_arr = [elements_arr] end [:timeout_message] = [:timeout_message] || "Timeout waiting for elements: #{elements_arr.join(',')}" wait_for() do elements_arr.all? { |q| element_exists(q) } end end |
#wait_for_no_network_indicator(options = {}) ⇒ nil
Waits for the status-bar network indicator to stop animating (network activity done).
343 344 345 346 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 343 def wait_for_no_network_indicator( = {}) [:condition] = CALABASH_CONDITIONS[:no_network_indicator] wait_for_condition() end |
#wait_for_none_animating(options = {}) ⇒ nil
Waits for all elements to stop animating (EXPERIMENTAL).
333 334 335 336 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 333 def wait_for_none_animating( = {}) [:condition] = CALABASH_CONDITIONS[:none_animating] wait_for_condition() end |
#wait_for_transition(done_queries, check_options = {}, animation_options = {}) ⇒ Object
Combines waiting for elements and waiting for animations.
352 353 354 355 356 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 352 def wait_for_transition(done_queries, ={},={}) done_queries = [*done_queries] wait_for_elements_exist(done_queries,) wait_for_none_animating() end |
#wait_poll(opts, &block) ⇒ nil
Repeatedly runs an action (for side-effects) until a condition is satisfied.
Similar to wait_for but specifies both a condition to wait for and an action to repeatedly perform
to make the condition true (e.g. scrolling). The return value of the action is ignored.
The block represents the action and options :until or :until_exists specify the condition to wait for.
Same options as wait_for can be provided.
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 181 def wait_poll(opts, &block) test = opts[:until] if test.nil? cond = opts[:until_exists] raise 'Must provide :until or :until_exists' unless cond test = lambda { element_exists(cond) } end wait_for(opts) do if test.call() true else yield false end end end |
#wait_tap(uiquery, options = {}) ⇒ Array<Hash>
Performs the tap gesture on the (first) view that matches query uiquery.
As opposed to touch, wait_tap is a high-level method that combines:
- waiting for the view to appear,
- waiting for animations to complete on the view (and it's parents) and
- actually tapping the view.
This replaces the common pattern:
wait_for_none_animating
wait_for_element_exists("* marked:'log in'")
touch("* marked:'log in'")
By default, taps the center of the view.
77 78 79 80 81 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 77 def wait_tap(uiquery, ={}) wait_for_none_animating wait_for_element_exists(uiquery, ) touch(uiquery, ) end |
#when_element_exists(uiquery, opts = {}) ⇒ Object
Performs a lambda action once the element exists. The default behavior is to touch the specified element.
Raises an error if no uiquery is specified.
420 421 422 423 424 |
# File 'lib/calabash-cucumber/wait_helpers.rb', line 420 def when_element_exists(uiquery, opts = {}) action = opts[:action] || lambda { touch(uiquery) } wait_for_element_exists(uiquery, opts) action.call end |