Class: Appium::Core::Base::Bridge

Inherits:
Selenium::WebDriver::Remote::Bridge
  • Object
show all
Includes:
Device::AppManagement, Device::AppState, Device::Context, Device::Device, Device::DeviceLock, Device::ExecuteDriver, Device::FileManagement, Device::ImageComparison, Device::ImeActions, Device::KeyEvent, Device::Keyboard, Device::Orientation, Device::ScreenRecord::Command, Device::Setting
Defined in:
lib/appium_lib_core/common/base/bridge.rb

Overview

LocatorConverter

Direct Known Subclasses

BiDiBridge

Constant Summary collapse

APPIUM_PREFIX =

Prefix for extra capability defined by W3C

'appium:'
APPIUM_NATIVE_BROWSER_NAME =

No ‘browserName’ means the session is native appium connection

'appium'

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#available_commandsObject (readonly)

Returns the value of attribute available_commands.



50
51
52
# File 'lib/appium_lib_core/common/base/bridge.rb', line 50

def available_commands
  @available_commands
end

Instance Method Details

#action(_deprecated_async = nil, async: false, devices: nil) ⇒ Object

Perform ‘touch’ actions for W3C module. Generate touch pointer action here and users can use this via driver.action

The pointer type is ‘touch’ by default in the Appium Ruby client.

Examples:


element = @driver.find_element(:id, "some id")
@driver.action.click(element).perform # The 'click' is a part of 'PointerActions'


208
209
210
211
212
213
214
215
216
217
# File 'lib/appium_lib_core/common/base/bridge.rb', line 208

def action(_deprecated_async = nil, async: false, devices: nil)
  # steep:ignore:start
  ::Selenium::WebDriver::ActionBuilder.new(
    self,
    devices: devices || [::Selenium::WebDriver::Interactions.pointer(:touch, name: 'touch')],
    async: async,
    duration: 50 # milliseconds
  )
  # steep:ignore:end
end

#add_appium_prefix(capabilities) ⇒ ::Appium::Core::Base::Capabilities

Append appium: prefix for Appium following W3C spec www.w3.org/TR/webdriver/#dfn-validate-capabilities



128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/appium_lib_core/common/base/bridge.rb', line 128

def add_appium_prefix(capabilities)
  w3c_capabilities = ::Appium::Core::Base::Capabilities.new

  capabilities = capabilities.send(:capabilities) unless capabilities.is_a?(Hash)

  capabilities.each do |name, value|
    capability_name = name.to_s
    w3c_name = extension_prefix?(capability_name) ? name : "#{APPIUM_PREFIX}#{capability_name}"

    w3c_capabilities[w3c_name] = value
  end

  w3c_capabilities
end

#add_command(method:, url:, name:, &block) ⇒ Object

def add_command(method:, url:, name:, &block)

Bridge.add_command name, method, url, &block

end



178
179
180
181
182
183
184
# File 'lib/appium_lib_core/common/base/bridge.rb', line 178

def add_command(method:, url:, name:, &block)
  ::Appium::Logger.info "Overriding the method '#{name}' for '#{url}'" if @available_commands.key? name

  @available_commands[name] = [method, url]

  ::Appium::Core::Device.add_endpoint_method name, &block
end

#attach_to(session_id, platform_name, automation_name) ⇒ ::Appium::Core::Base::Capabilities

Appium only. Attach to an existing session.

Examples:


new_driver = ::Appium::Core::Driver.attach_to(
  driver.session_id,
  url: 'http://127.0.0.1:4723', automation_name: 'UiAutomator2', platform_name: 'Android'
)


76
77
78
79
80
81
82
83
84
85
# File 'lib/appium_lib_core/common/base/bridge.rb', line 76

def attach_to(session_id, platform_name, automation_name)
  @available_commands = ::Appium::Core::Commands::COMMANDS.dup
  @session_id = session_id

  # generate a dummy capabilities instance which only has the given platformName and automationName
  @capabilities = ::Appium::Core::Base::Capabilities.new(
    'platformName' => platform_name,
    'automationName' => automation_name
  )
end

#available_log_typesObject

logs

For Appium No implementation for W3C webdriver module



274
275
276
277
# File 'lib/appium_lib_core/common/base/bridge.rb', line 274

def available_log_types
  types = execute :get_available_log_types
  Array(types).map(&:to_sym)
end

#browserObject



52
53
54
55
56
57
58
59
# File 'lib/appium_lib_core/common/base/bridge.rb', line 52

def browser
  @browser ||= begin
    name = @capabilities&.browser_name
    name ? name.tr(' ', '_').downcase.to_sym : 'unknown'
  rescue KeyError
    APPIUM_NATIVE_BROWSER_NAME
  end
end

#commands(command) ⇒ Object



186
187
188
# File 'lib/appium_lib_core/common/base/bridge.rb', line 186

def commands(command)
  @available_commands[command] || Bridge.extra_commands[command]
end

#convert_to_element(id) ⇒ ::Appium::Core::Element

For Appium



248
249
250
# File 'lib/appium_lib_core/common/base/bridge.rb', line 248

def convert_to_element(id)
  ::Appium::Core::Element.new self, element_id_from(id)
end

#create_session(capabilities) ⇒ ::Appium::Core::Base::Capabilities

Override Creates session handling.

Examples:


opts = {
  caps: {
    platformName: :ios,
    automationName: 'XCUITest',
    app: 'test/functional/app/UICatalog.app.zip',
    platformVersion: '11.4',
    deviceName: 'iPhone Simulator',
    useNewWDA: true,
  },
  appium_lib: {
    wait: 30
  }
}
core = ::Appium::Core.for(caps)
driver = core.start_driver

Raises:

  • (::Selenium::WebDriver::Error::WebDriverError)


111
112
113
114
115
116
117
118
119
120
121
# File 'lib/appium_lib_core/common/base/bridge.rb', line 111

def create_session(capabilities)
  @available_commands = ::Appium::Core::Commands::COMMANDS.dup

  always_match = add_appium_prefix(capabilities)
  response = execute(:new_session, {}, { capabilities: { alwaysMatch: always_match, firstMatch: [{}] } })

  @session_id = response['sessionId']
  raise ::Selenium::WebDriver::Error::WebDriverError, 'no sessionId in returned payload' unless @session_id

  @capabilities = json_create(response['capabilities'])
end

#element_attribute(element, name) ⇒ Object

For Appium override



235
236
237
238
239
240
# File 'lib/appium_lib_core/common/base/bridge.rb', line 235

def element_attribute(element, name)
  # For W3C in Selenium Client
  # execute_atom :getAttribute, element, name.
  # 'dom_attribute' in the WebDriver Selenium.
  execute :get_element_attribute, id: element.id, name: name
end

#element_displayed?(element) ⇒ Boolean

For Appium override



226
227
228
229
230
231
# File 'lib/appium_lib_core/common/base/bridge.rb', line 226

def element_displayed?(element)
  # For W3C
  # https://github.com/SeleniumHQ/selenium/commit/b618499adcc3a9f667590652c5757c0caa703289
  # execute_atom :isDisplayed, element
  execute :is_element_displayed, id: element.id
end

#element_screenshot(element_id) ⇒ Object



310
311
312
# File 'lib/appium_lib_core/common/base/bridge.rb', line 310

def element_screenshot(element_id)
  execute :take_element_screenshot, id: element_id
end

#get_timeoutsObject

Port from MJSONWP



220
221
222
# File 'lib/appium_lib_core/common/base/bridge.rb', line 220

def get_timeouts
  execute :get_timeouts
end

#locationObject

For Appium No implementation for W3C webdriver module called in ‘extend DriverExtensions::HasLocation’



255
256
257
258
# File 'lib/appium_lib_core/common/base/bridge.rb', line 255

def location
  obj = execute(:get_location) || {}
  ::Appium::Location.new obj['latitude'], obj['longitude'], obj['altitude']
end

#log(type) ⇒ Object

For Appium No implementation for W3C webdriver module



281
282
283
284
285
286
287
288
289
290
291
# File 'lib/appium_lib_core/common/base/bridge.rb', line 281

def log(type)
  data = execute :get_log, {}, { type: type.to_s }

  Array(data).map do |l|
    # steep:ignore:start
    ::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
    # steep:ignore:end
  rescue KeyError
    next
  end
end

#log_event(vendor, event) ⇒ Object

For Appium



294
295
296
# File 'lib/appium_lib_core/common/base/bridge.rb', line 294

def log_event(vendor, event)
  execute :post_log_event, {}, { vendor: vendor, event: event }
end

#log_events(type = nil) ⇒ Object

For Appium



299
300
301
302
303
304
# File 'lib/appium_lib_core/common/base/bridge.rb', line 299

def log_events(type = nil)
  args = {}
  args['type'] = type unless type.nil?

  execute :get_log_events, {}, args
end

#send_command(command_params) ⇒ Object

for selenium-webdriver compatibility in chrome browser session. This may be needed in selenium-webdriver 4.8 or over? (around the version) when a session starts browserName: ‘chrome’ for bridge. This method is not only for Android, but also chrome desktop browser as well. So this bridge itself does not restrict the target module.



319
320
321
# File 'lib/appium_lib_core/common/base/bridge.rb', line 319

def send_command(command_params)
  execute :chrome_send_command, {}, command_params
end

#set_location(lat, lon, alt = 0.0, speed: nil, satellites: nil) ⇒ Object

For Appium No implementation for W3C webdriver module



262
263
264
265
266
267
# File 'lib/appium_lib_core/common/base/bridge.rb', line 262

def set_location(lat, lon, alt = 0.0, speed: nil, satellites: nil)
  loc = { latitude: lat, longitude: lon, altitude: alt }
  loc[:speed] = speed unless speed.nil?
  loc[:satellites] = satellites unless satellites.nil?
  execute :set_location, {}, { location: loc }
end

#statusObject



190
191
192
# File 'lib/appium_lib_core/common/base/bridge.rb', line 190

def status
  execute :status
end

#viewport_screenshotObject



306
307
308
# File 'lib/appium_lib_core/common/base/bridge.rb', line 306

def viewport_screenshot
  execute_script('mobile: viewportScreenshot')
end