Class: Maze::Driver::Appium

Inherits:
Appium::Driver
  • Object
show all
Defined in:
lib/maze/driver/appium.rb

Overview

Provide a thin layer of abstraction above @see Appium::Driver

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(server_url, capabilities, locator = :id) ⇒ Appium

Creates the Appium driver

Parameters:

  • server_url (String)

    URL of the Appium server

  • capabilities (Hash)

    a hash of capabilities to be used in this test run

  • locator (Symbol) (defaults to: :id)

    the primary locator strategy Appium should use to find elements



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/maze/driver/appium.rb', line 31

def initialize(server_url, capabilities, locator = :id)
  # Sets up identifiers for ease of connecting jobs
  capabilities ||= {}

  @element_locator = locator
  @capabilities = capabilities

  # Timers
  @find_element_timer = Maze.timers.add 'Appium - find element'
  @click_element_timer = Maze.timers.add 'Appium - click element'
  @clear_element_timer = Maze.timers.add 'Appium - clear element'
  @send_keys_timer = Maze.timers.add 'Appium - send keys to element'

  super({
    'caps' => @capabilities,
    'appium_lib' => {
      server_url: server_url
    }
  }, true)
end

Instance Attribute Details

#app_idString

Returns The app_id derived from session_capabilities (appPackage on Android, bundleID on iOS).

Returns:

  • (String)

    The app_id derived from session_capabilities (appPackage on Android, bundleID on iOS)



16
17
18
# File 'lib/maze/driver/appium.rb', line 16

def app_id
  @app_id
end

#capabilitiesObject (readonly)

Returns the value of attribute capabilities.



24
25
26
# File 'lib/maze/driver/appium.rb', line 24

def capabilities
  @capabilities
end

#device_typeObject (readonly)

Returns the value of attribute device_type.



20
21
22
# File 'lib/maze/driver/appium.rb', line 20

def device_type
  @device_type
end

Instance Method Details

#clear_and_send_keys_to_element(element_id, text) ⇒ Object

Sends keys to a given element, clearing it first

Parameters:

  • element_id (String)

    the element to clear and send text to

  • text (String)

    the text to send



172
173
174
175
176
177
178
179
180
181
# File 'lib/maze/driver/appium.rb', line 172

def clear_and_send_keys_to_element(element_id, text)
  element = find_element_timed(element_id)
  @clear_element_timer.time do
    element.clear
  end

  @send_keys_timer.time do
    element.send_keys(text)
  end
end

#clear_element(element_id) ⇒ Object

Clears a given element

Parameters:

  • element_id (String)

    the element to clear



122
123
124
125
126
127
# File 'lib/maze/driver/appium.rb', line 122

def clear_element(element_id)
  element = find_element_timed(element_id)
  @clear_element_timer.time do
    element.clear
  end
end

#click_element(element_id) ⇒ Object

Clicks a given element

Parameters:

  • element_id (String)

    the element to click



98
99
100
101
102
103
# File 'lib/maze/driver/appium.rb', line 98

def click_element(element_id)
  element = find_element_timed(element_id)
  @click_element_timer.time do
    element.click
  end
end

#click_element_if_present(element_id) ⇒ Boolean

Clicks a given element, ignoring any NoSuchElementError

Parameters:

  • element_id (String)

    the element to click

Returns:

  • (Boolean)

    True is the element was clicked



109
110
111
112
113
114
115
116
117
# File 'lib/maze/driver/appium.rb', line 109

def click_element_if_present(element_id)
  element = find_element_timed(element_id)
  @click_element_timer.time do
    element.click
  end
  true
rescue Selenium::WebDriver::Error::NoSuchElementError
  false
end

#device_infoObject



191
192
193
# File 'lib/maze/driver/appium.rb', line 191

def device_info
  driver.execute_script('mobile:deviceInfo')
end

#find_element_timed(element_id) ⇒ Object

A wrapper around find_element adding timer functionality



89
90
91
92
93
# File 'lib/maze/driver/appium.rb', line 89

def find_element_timed(element_id)
  @find_element_timer.time do
    find_element(@element_locator, element_id)
  end
end

#page_sourceObject

Gets the application hierarchy XML



130
131
132
# File 'lib/maze/driver/appium.rb', line 130

def page_source
  @driver.page_source
end

#reset_with_timeout(timeout = 0.1) ⇒ Object

Reset the currently running application after a given timeout

Parameters:

  • timeout (Number) (defaults to: 0.1)

    the amount of time in seconds to wait before resetting



186
187
188
189
# File 'lib/maze/driver/appium.rb', line 186

def reset_with_timeout(timeout = 0.1)
  sleep(timeout)
  reset
end

#send_keys(text) ⇒ Object

Send keys to the device without a specific element

Parameters:

  • text (String)

    the text to send



164
165
166
# File 'lib/maze/driver/appium.rb', line 164

def send_keys(text)
  @driver.send_keys(text)
end

#send_keys_to_element(element_id, text) ⇒ Object

Sends keys to a given element

Parameters:

  • element_id (String)

    the element to send text to

  • text (String)

    the text to send



143
144
145
146
147
148
# File 'lib/maze/driver/appium.rb', line 143

def send_keys_to_element(element_id, text)
  element = find_element_timed(element_id)
  @send_keys_timer.time do
    element.send_keys(text)
  end
end

#session_capabilitiesObject



195
196
197
# File 'lib/maze/driver/appium.rb', line 195

def session_capabilities
  driver.session_capabilities
end

#set_rotation(orientation) ⇒ Object

Sets the rotation of the device

Parameters:

  • orientation (Symbol)

    :portrait or :landscape



153
154
155
# File 'lib/maze/driver/appium.rb', line 153

def set_rotation(orientation)
  @driver.rotation = orientation
end

#start_driverObject

Starts the Appium driver



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/maze/driver/appium.rb', line 53

def start_driver
  begin
    $logger.info 'Starting Appium driver...'
    time = Time.now
    super
    $logger.info "Appium driver started in #{(Time.now - time).to_i}s"
  rescue => error
    $logger.warn "Appium driver failed to start in #{(Time.now - time).to_i}s"
    $logger.warn "#{error.class} occurred with message: #{error.message}"
    # Do not Bugsnag.notify here as we re-raise the error
    raise error
  end
end

#unlockObject

Unlocks the device



135
136
137
# File 'lib/maze/driver/appium.rb', line 135

def unlock
  @driver.unlock
end

#wait_for_element(element_id, timeout = 15, retry_if_stale = true) ⇒ Object

Checks for an element, waiting until it is present or the method times out

Parameters:

  • element_id (String)

    the element to search for

  • timeout (Integer) (defaults to: 15)

    the maximum time to wait for an element to be present in seconds

  • retry_if_stale (Boolean) (defaults to: true)

    enables the method to retry acquiring the element if a StaleObjectException occurs



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/maze/driver/appium.rb', line 72

def wait_for_element(element_id, timeout = 15, retry_if_stale = true)
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
  wait.until { find_element(@element_locator, element_id).displayed? }
rescue Selenium::WebDriver::Error::TimeoutError
  false
rescue Selenium::WebDriver::Error::StaleElementReferenceError => e
  if retry_if_stale
    wait_for_element(element_id, timeout, false)
  else
    $logger.warn "StaleElementReferenceError occurred: #{e}"
    false
  end
else
  true
end

#window_sizeObject



157
158
159
# File 'lib/maze/driver/appium.rb', line 157

def window_size
  @driver.window_size
end