class Selenium::WebDriver::Remote::Bridge

Low level bridge to the remote server, through which the rest of the API works.

@api private

Licensed to the Software Freedom Conservancy (SFC) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The SFC licenses this file to you under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Constants

COMMANDS
QUIT_ERRORS

Attributes

capabilities[R]
context[RW]
file_detector[RW]
http[RW]

Public Class Methods

command(name, verb, url) click to toggle source

Defines a wrapper method for a command, which ultimately calls execute.

@param name [Symbol]

name of the resulting method

@param url [String]

a URL template, which can include some arguments, much like the definitions on the server.
the :session_id parameter is implicitly handled, but the remainder will become required method arguments.

@param verb [Symbol]

the appropriate http verb, such as :get, :post, or :delete
# File lib/selenium/webdriver/remote/bridge.rb, line 46
def self.command(name, verb, url)
  COMMANDS[name] = [verb, url.freeze]
end
new(opts = {}) click to toggle source

Initializes the bridge with the given server URL.

@param url [String] url for the remote server @param http_client [Object] an HTTP client instance that implements the same protocol as Http::Default @param desired_capabilities [Capabilities] an instance of Remote::Capabilities describing the capabilities you want

# File lib/selenium/webdriver/remote/bridge.rb, line 61
def initialize(opts = {})
  opts = opts.dup

  http_client          = opts.delete(:http_client) { Http::Default.new }
  desired_capabilities = opts.delete(:desired_capabilities) { Capabilities.firefox }
  url                  = opts.delete(:url) { "http://#{Platform.localhost}:4444/wd/hub" }

  unless opts.empty?
    raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
  end

  if desired_capabilities.kind_of?(Symbol)
    unless Capabilities.respond_to?(desired_capabilities)
      raise Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}"
    end

    desired_capabilities = Capabilities.send(desired_capabilities)
  end

  uri = url.kind_of?(URI) ? url : URI.parse(url)
  uri.path += "/" unless uri.path =~ /\/$/

  http_client.server_url = uri

  @http          = http_client
  @capabilities  = create_session(desired_capabilities)

  @file_detector = nil
end

Public Instance Methods

acceptAlert() click to toggle source

alerts

# File lib/selenium/webdriver/remote/bridge.rb, line 156
def acceptAlert
  execute :acceptAlert
end
addCookie(cookie) click to toggle source

cookies

# File lib/selenium/webdriver/remote/bridge.rb, line 363
def addCookie(cookie)
  execute :addCookie, {}, :cookie => cookie
end
browser() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 91
def browser
  @browser ||= (
    name = @capabilities.browser_name
    name ? name.gsub(" ", "_").to_sym : 'unknown'
  )
end
clearElement(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 437
def clearElement(element)
  execute :clearElement, :id => element
end
clearLocalStorage() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 291
def clearLocalStorage
  execute :clearLocalStorage
end
clearSessionStorage() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 315
def clearSessionStorage
  execute :clearSessionStorage
end
click() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 387
def click
  execute :click, {}, :button => 0
end
clickElement(element) click to toggle source

actions

# File lib/selenium/webdriver/remote/bridge.rb, line 383
def clickElement(element)
  execute :clickElement, :id => element
end
close() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 220
def close
  execute :close
end
contextClick() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 395
def contextClick
  execute :click, {}, :button => 2
end
create_session(desired_capabilities) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 121
def create_session(desired_capabilities)
  resp = raw_execute :newSession, {}, :desiredCapabilities => desired_capabilities
  @session_id = resp['sessionId'] or raise Error::WebDriverError, 'no sessionId in returned payload'

  Capabilities.json_create resp['value']
end
deleteAllCookies() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 375
def deleteAllCookies
  execute :deleteAllCookies
end
deleteCookie(name) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 367
def deleteCookie(name)
  execute :deleteCookie, :name => name
end
dismissAlert() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 160
def dismissAlert
  execute :dismissAlert
end
doubleClick() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 391
def doubleClick
  execute :doubleClick
end
dragElement(element, right_by, down_by) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 445
def dragElement(element, right_by, down_by)
  execute :dragElement, {:id => element}, :x => right_by, :y => down_by
end
driver_extensions() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 98
def driver_extensions
  [
    DriverExtensions::HasInputDevices,
    DriverExtensions::UploadsFiles,
    DriverExtensions::TakesScreenshot,
    DriverExtensions::HasSessionId,
    DriverExtensions::Rotatable,
    DriverExtensions::HasTouchScreen,
    DriverExtensions::HasLocation,
    DriverExtensions::HasNetworkConnection,
    DriverExtensions::HasRemoteStatus,
    DriverExtensions::HasWebStorage
  ]
end
executeAsyncScript(script, *args) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 352
def executeAsyncScript(script, *args)
  assert_javascript_enabled

  result = execute :executeAsyncScript, {}, :script => script, :args => args
  unwrap_script_result result
end
executeScript(script, *args) click to toggle source

javascript execution

# File lib/selenium/webdriver/remote/bridge.rb, line 345
def executeScript(script, *args)
  assert_javascript_enabled

  result = execute :executeScript, {}, :script => script, :args => args
  unwrap_script_result result
end
find_element_by(how, what, parent = nil) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 587
def find_element_by(how, what, parent = nil)
  if parent
    id = execute :findChildElement, {:id => parent}, {:using => how, :value => what}
  else
    id = execute :findElement, {}, {:using => how, :value => what}
  end

  Element.new self, element_id_from(id)
end
find_elements_by(how, what, parent = nil) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 597
def find_elements_by(how, what, parent = nil)
  if parent
    ids = execute :findChildElements, {:id => parent}, {:using => how, :value => what}
  else
    ids = execute :findElements, {}, {:using => how, :value => what}
  end

  ids.map { |id| Element.new self, element_id_from(id) }
end
get(url) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 132
def get(url)
  execute :get, {}, :url => url
end
getActiveElement() click to toggle source

finding elements

# File lib/selenium/webdriver/remote/bridge.rb, line 582
def getActiveElement
  Element.new self, element_id_from(execute(:getActiveElement))
end
Also aliased as: switchToActiveElement
getAlertText() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 168
def getAlertText
  execute :getAlertText
end
getAllCookies() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 371
def getAllCookies
  execute :getCookies
end
getAvailableLogTypes() click to toggle source

logs

# File lib/selenium/webdriver/remote/bridge.rb, line 507
def getAvailableLogTypes
  types = execute :getAvailableLogTypes
  Array(types).map { |e| e.to_sym }
end
getCapabilities() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 136
def getCapabilities
  Capabilities.json_create execute(:getCapabilities)
end
getCurrentUrl() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 184
def getCurrentUrl
  execute :getCurrentUrl
end
getCurrentWindowHandle() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 236
def getCurrentWindowHandle
  execute :getCurrentWindowHandle
end
getElementAttribute(element, name) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 532
def getElementAttribute(element, name)
  execute :getElementAttribute, :id => element, :name => name
end
getElementLocation(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 544
def getElementLocation(element)
  data = execute :getElementLocation, :id => element

  Point.new data['x'], data['y']
end
getElementLocationOnceScrolledIntoView(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 550
def getElementLocationOnceScrolledIntoView(element)
  data = execute :getElementLocationOnceScrolledIntoView, :id => element

  Point.new data['x'], data['y']
end
getElementSize(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 556
def getElementSize(element)
  data = execute :getElementSize, :id => element

  Dimension.new data['width'], data['height']
end
getElementTagName(element) click to toggle source

element properties

# File lib/selenium/webdriver/remote/bridge.rb, line 528
def getElementTagName(element)
  execute :getElementTagName, :id => element
end
getElementText(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 540
def getElementText(element)
  execute :getElementText, :id => element
end
getElementValue(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 536
def getElementValue(element)
  execute :getElementValue, :id => element
end
getElementValueOfCssProperty(element, prop) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 574
def getElementValueOfCssProperty(element, prop)
  execute :getElementValueOfCssProperty, :id => element, :property_name => prop
end
getLocalStorageItem(key) click to toggle source

HTML 5

# File lib/selenium/webdriver/remote/bridge.rb, line 275
def getLocalStorageItem(key)
  execute :getLocalStorageItem, :key => key
end
getLocalStorageKeys() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 283
def getLocalStorageKeys
  execute :getLocalStorageKeys
end
getLocalStorageSize() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 295
def getLocalStorageSize
  execute :getLocalStorageSize
end
getLocation() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 323
def getLocation
  obj = execute(:getLocation) || {} # android returns null
  Location.new obj['latitude'], obj['longitude'], obj['altitude']
end
getLog(type) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 512
def getLog(type)
  data = execute :getLog, {}, :type => type.to_s

  Array(data).map do |l|
    begin
      LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
    rescue KeyError
      next
    end
  end
end
getNetworkConnection() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 333
def getNetworkConnection
  execute :getNetworkConnection
end
getPageSource() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 192
def getPageSource
  execute :getPageSource
end
getScreenOrientation() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 499
def getScreenOrientation
  execute :getScreenOrientation
end
getScreenshot() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 267
def getScreenshot
  execute :screenshot
end
getSessionStorageItem(key) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 299
def getSessionStorageItem(key)
  execute :getSessionStorageItem, :key => key
end
getSessionStorageKeys() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 307
def getSessionStorageKeys
  execute :getSessionStorageKeys
end
getSessionStorageSize() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 319
def getSessionStorageSize
  execute :getSessionStorageSize
end
getTitle() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 188
def getTitle
  execute :getTitle
end
getWindowHandles() click to toggle source

window handling

# File lib/selenium/webdriver/remote/bridge.rb, line 232
def getWindowHandles
  execute :getWindowHandles
end
getWindowPosition(handle = :current) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 261
def getWindowPosition(handle = :current)
  data = execute :getWindowPosition, :window_handle => handle

  Point.new data['x'], data['y']
end
getWindowSize(handle = :current) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 250
def getWindowSize(handle = :current)
  data = execute :getWindowSize, :window_handle => handle

  Dimension.new data['width'], data['height']
end
goBack() click to toggle source

navigation

# File lib/selenium/webdriver/remote/bridge.rb, line 176
def goBack
  execute :goBack
end
goForward() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 180
def goForward
  execute :goForward
end
isElementDisplayed(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 570
def isElementDisplayed(element)
  execute :isElementDisplayed, :id => element
end
isElementEnabled(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 562
def isElementEnabled(element)
  execute :isElementEnabled, :id => element
end
isElementSelected(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 566
def isElementSelected(element)
  execute :isElementSelected, :id => element
end
maximizeWindow(handle = :current) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 246
def maximizeWindow(handle = :current)
  execute :maximizeWindow, :window_handle => handle
end
mouseDown() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 399
def mouseDown
  execute :mouseDown
end
mouseMoveTo(element, x = nil, y = nil) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 407
def mouseMoveTo(element, x = nil, y = nil)
  params = { :element => element }

  if x && y
    params.merge! :xoffset => x, :yoffset => y
  end

  execute :mouseMoveTo, {}, params
end
mouseUp() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 403
def mouseUp
  execute :mouseUp
end
quit() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 214
def quit
  execute :quit
  http.close
rescue *QUIT_ERRORS
end
refresh() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 224
def refresh
  execute :refresh
end
removeLocalStorageItem(key) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 279
def removeLocalStorageItem(key)
  execute :removeLocalStorageItem, :key => key
end
removeSessionStorageItem(key) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 303
def removeSessionStorageItem(key)
  execute :removeSessionStorageItem, :key => key
end
sendKeysToActiveElement(key) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 417
def sendKeysToActiveElement(key)
  execute :sendKeysToActiveElement, {}, :value => key
end
sendKeysToElement(element, keys) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 421
def sendKeysToElement(element, keys)
  if @file_detector && local_file = @file_detector.call(keys)
    keys = upload(local_file)
  end

  execute :sendKeysToElement, {:id => element}, {:value => Array(keys)}
end
session_id() click to toggle source

Returns the current session ID.

# File lib/selenium/webdriver/remote/bridge.rb, line 117
def session_id
  @session_id || raise(Error::WebDriverError, "no current session exists")
end
setAlertValue(keys) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 164
def setAlertValue(keys)
  execute :setAlertValue, {}, :text => keys.to_s
end
setImplicitWaitTimeout(milliseconds) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 140
def setImplicitWaitTimeout(milliseconds)
  execute :implicitlyWait, {}, :ms => milliseconds
end
setLocalStorageItem(key, value) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 287
def setLocalStorageItem(key, value)
  execute :setLocalStorageItem, {}, :key => key, :value => value
end
setLocation(lat, lon, alt) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 328
def setLocation(lat, lon, alt)
  loc = {:latitude => lat, :longitude => lon, :altitude => alt}
  execute :setLocation, {}, :location => loc
end
setNetworkConnection(type) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 337
def setNetworkConnection(type)
  execute :setNetworkConnection, {}, :parameters => {:type => type}
end
setScreenOrientation(orientation) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 495
def setScreenOrientation(orientation)
  execute :setScreenOrientation, {}, :orientation => orientation
end
setScriptTimeout(milliseconds) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 144
def setScriptTimeout(milliseconds)
  execute :setScriptTimeout, {}, :ms => milliseconds
end
setSessionStorageItem(key, value) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 311
def setSessionStorageItem(key, value)
  execute :setSessionStorageItem, {}, :key => key, :value => value
end
setTimeout(type, milliseconds) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 148
def setTimeout(type, milliseconds)
  execute :setTimeout, {}, :type => type, :ms => milliseconds
end
setWindowPosition(x, y, handle = :current) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 256
def setWindowPosition(x, y, handle = :current)
  execute :setWindowPosition, {:window_handle => handle},
                               :x => x, :y => y
end
setWindowSize(width, height, handle = :current) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 240
def setWindowSize(width, height, handle = :current)
  execute :setWindowSize, {:window_handle => handle},
                           :width  => width,
                           :height => height
end
status() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 128
def status
  execute :status
end
submitElement(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 441
def submitElement(element)
  execute :submitElement, :id => element
end
switchToActiveElement()
Alias for: getActiveElement
switchToDefaultContent() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 208
def switchToDefaultContent
  execute :switchToFrame, {}, :id => nil
end
switchToFrame(id) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 200
def switchToFrame(id)
  execute :switchToFrame, {}, :id => id
end
switchToParentFrame() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 204
def switchToParentFrame
  execute :switchToParentFrame
end
switchToWindow(name) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 196
def switchToWindow(name)
  execute :switchToWindow, {}, :name => name
end
touchDoubleTap(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 453
def touchDoubleTap(element)
  execute :touchDoubleTap, {}, :element => element
end
touchDown(x, y) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 461
def touchDown(x, y)
  execute :touchDown, {}, :x => x, :y => y
end
touchElementFlick(element, right_by, down_by, speed) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 487
def touchElementFlick(element, right_by, down_by, speed)
  execute :touchFlick, {}, :element => element,
                           :xoffset => right_by,
                           :yoffset => down_by,
                           :speed   => speed

end
touchFlick(xspeed, yspeed) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 483
def touchFlick(xspeed, yspeed)
  execute :touchFlick, {}, :xspeed => xspeed, :yspeed => yspeed
end
touchLongPress(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 457
def touchLongPress(element)
  execute :touchLongPress, {}, :element => element
end
touchMove(x, y) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 469
def touchMove(x, y)
  execute :touchMove, {}, :x => x, :y => y
end
touchScroll(element, x, y) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 473
def touchScroll(element, x, y)
  if element
    execute :touchScroll, {}, :element => element,
                              :xoffset => x,
                              :yoffset => y
  else
    execute :touchScroll, {}, :xoffset => x, :yoffset => y
  end
end
touchSingleTap(element) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 449
def touchSingleTap(element)
  execute :touchSingleTap, {}, :element => element
end
touchUp(x, y) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 465
def touchUp(x, y)
  execute :touchUp, {}, :x => x, :y => y
end
upload(local_file) click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 429
def upload(local_file)
  unless File.file?(local_file)
    raise Error::WebDriverError, "you may only upload files: #{local_file.inspect}"
  end

  execute :uploadFile, {}, :file => Zipper.zip_file(local_file)
end

Private Instance Methods

assert_javascript_enabled() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 609
def assert_javascript_enabled
  return if capabilities.javascript_enabled?
  raise Error::UnsupportedOperationError, "underlying webdriver instance does not support javascript"
end
escaper() click to toggle source
# File lib/selenium/webdriver/remote/bridge.rb, line 647
def escaper
  @escaper ||= defined?(URI::Parser) ? URI::Parser.new : URI
end
execute(*args) click to toggle source

executes a command on the remote server.

Returns the 'value' of the returned payload

# File lib/selenium/webdriver/remote/bridge.rb, line 621
def execute(*args)
  raw_execute(*args)['value']
end
raw_execute(command, opts = {}, command_hash = nil) click to toggle source

executes a command on the remote server.

@return [WebDriver::Remote::Response]

# File lib/selenium/webdriver/remote/bridge.rb, line 631
def raw_execute(command, opts = {}, command_hash = nil)
  verb, path = COMMANDS[command] || raise(ArgumentError, "unknown command: #{command.inspect}")
  path       = path.dup

  path[':session_id'] = @session_id if path.include?(":session_id")

  begin
    opts.each { |key, value| path[key.inspect] = escaper.escape(value.to_s) }
  rescue IndexError
    raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}"
  end

  puts "-> #{verb.to_s.upcase} #{path}" if $DEBUG
  http.call verb, path, command_hash
end