Module: Appium::Core::Wait

Defined in:
lib/appium_lib_core/common/wait.rb,
lib/appium_lib_core/common/wait/timer.rb

Defined Under Namespace

Classes: TimeoutError, Timer

Constant Summary collapse

DEFAULT_TIMEOUT =
30
DEFAULT_INTERVAL =
0.5

Class Method Summary collapse

Class Method Details

.until(timeout: DEFAULT_TIMEOUT, interval: DEFAULT_INTERVAL, message: nil, ignored: nil, object: nil) ⇒ Object

Check every interval seconds to see if yield doesn’t raise an exception. Give up after timeout seconds.

If only a number is provided then it’s treated as the timeout value.

Examples:


result = Appium::Core::Wait.until { @driver.find_element(:id, 'something') }

result = Appium::Core::Wait.until(object: 'some object') { |object|
   @driver.find_element(:id, object)
}

Parameters:

  • timeout: (Integer) (defaults to: DEFAULT_TIMEOUT)

    Seconds to wait before timing out. Set default by ‘appium_wait_timeout` (30).

  • interval: (Integer) (defaults to: DEFAULT_INTERVAL)

    Seconds to sleep between polls. Set default by ‘appium_wait_interval` (0.5).

  • message: (String) (defaults to: nil)

    Exception message if timed out.

  • ignored: (Array, Exception) (defaults to: nil)

    Exceptions to ignore while polling (default: Exception)

  • object: (Object, NilClass) (defaults to: nil)

    Object to evaluate block against

Raises:



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/appium_lib_core/common/wait.rb', line 31

def until(timeout: DEFAULT_TIMEOUT, interval: DEFAULT_INTERVAL, message: nil, ignored: nil, object: nil)
  ignored = Array(ignored || ::Exception)

  last_error = nil
  timer = Wait::Timer.new(timeout)

  until timer.timeout?
    begin
      return yield(object)
    rescue ::Errno::ECONNREFUSED => e
      raise e
    rescue *ignored => last_error # rubocop:disable Lint/HandleExceptions
      # swallowed
    end
    sleep interval
  end

  msg = message_for timeout, message
  msg << " (#{last_error.message})" if last_error

  raise TimeoutError, msg
end

.until_true(timeout: DEFAULT_TIMEOUT, interval: DEFAULT_INTERVAL, message: nil, ignored: nil, object: nil) ⇒ Object

Check every interval seconds to see if yield returns a truthy value. Note this isn’t a strict boolean true, any truthy value is accepted. false and nil are considered failures. Give up after timeout seconds.

If only a number is provided then it’s treated as the timeout value.

Examples:


Appium::Core::Wait.until_true { @driver.find_element(:id, 'something') }

Appium::Core::Wait.until_true(object: 'some object') { |object|
   @driver.find_element(:id, object)
}

Parameters:

  • timeout: (Integer) (defaults to: DEFAULT_TIMEOUT)

    Seconds to wait before timing out. Set default by ‘appium_wait_timeout` (30).

  • interval: (Integer) (defaults to: DEFAULT_INTERVAL)

    Seconds to sleep between polls. Set default by ‘appium_wait_interval` (0.5).

  • message: (String) (defaults to: nil)

    Exception message if timed out.

  • ignored: (Array, Exception) (defaults to: nil)

    Exceptions to ignore while polling (default: Exception)

  • object: (Object, NilClass) (defaults to: nil)

    Object to evaluate block against

Raises:



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/appium_lib_core/common/wait.rb', line 75

def until_true(timeout: DEFAULT_TIMEOUT, interval: DEFAULT_INTERVAL, message: nil, ignored: nil, object: nil)
  ignored = Array(ignored || ::Exception)

  last_error = nil
  timer = Wait::Timer.new(timeout)

  until timer.timeout?
    begin
      result = yield(object)
      return result if result
    rescue ::Errno::ECONNREFUSED => e
      raise e
    rescue *ignored => last_error # rubocop:disable Lint/HandleExceptions
      # swallowed
    end
    sleep interval
  end

  msg = message_for timeout, message
  msg << " (#{last_error.message})" if last_error

  raise TimeoutError, msg
end