class Pincers::Webdriver::Backend

Constants

DOM_PROPERTIES

Attributes

document[R]
driver[R]

Public Class Methods

new(_driver) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 16
def initialize(_driver)
  @driver = _driver
end

Public Instance Methods

as_http_client() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 157
def as_http_client
  session = Pincers::Http::Session.new
  session.headers['User-Agent'] = user_agent
  session.proxy = proxy_address
  load_cookies_in_session session

  Pincers::Http::Client.new session, HttpDocument.new(self)
end
click_on_element(_element, _modifiers) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 115
def click_on_element(_element, _modifiers)
  _element = ensure_ready_for_input _element
  if _modifiers.length == 0
    _element.click
  else
    click_with_modifiers(_element, _modifiers)
  end
end
close_document() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 56
def close_document
  driver.quit rescue nil
end
document_root() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 24
def document_root
  [driver]
end
document_title() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 32
def document_title
  driver.title
end
document_url() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 28
def document_url
  driver.current_url
end
double_click_on_element(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 129
def double_click_on_element(_element)
  _element = ensure_ready_for_input _element
  actions.double_click(_element).perform
end
drag_and_drop(_element, _on) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 139
def drag_and_drop(_element, _on)
  _element = ensure_input_element _element
  actions.drag_and_drop(_element, _on).perform
end
element_is_actionable?(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 103
def element_is_actionable?(_element)
  # this is the base requisite in webdriver for actionable elements:
  # non displayed items will always error on action
  _element.displayed?
end
extract_element_attribute(_element, _name) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 83
def extract_element_attribute(_element, _name)
  _element = ensure_element _element
  if DOM_PROPERTIES.include? _name.to_sym
    driver.execute_script("return arguments[0]['#{_name}'];", _element)
  else
    _element[_name]
  end
end
extract_element_html(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 78
def extract_element_html(_element)
  return driver.page_source if _element == driver
  _element.attribute 'outerHTML'
end
extract_element_tag(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 68
def extract_element_tag(_element)
  _element = ensure_element _element
  _element.tag_name
end
extract_element_text(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 73
def extract_element_text(_element)
  _element = ensure_element _element
  _element.text
end
fetch_cookies() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 36
def fetch_cookies
  driver.manage.all_cookies
end
hover_over_element(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 134
def hover_over_element(_element)
  _element = ensure_ready_for_input _element
  actions.move_to(_element).perform
end
javascript_enabled?() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 20
def javascript_enabled?
  true
end
navigate_back(_steps) click to toggle source
navigate_forward(_steps) click to toggle source
navigate_to(_url) click to toggle source
refresh_document() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 52
def refresh_document
  driver.navigate.refresh
end
right_click_on_element(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 124
def right_click_on_element(_element)
  _element = ensure_ready_for_input _element
  actions.context_click(_element).perform
end
search_by_css(_element, _selector, _limit) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 60
def search_by_css(_element, _selector, _limit)
  search _element, { css: _selector }, _limit
end
search_by_xpath(_element, _selector, _limit) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 64
def search_by_xpath(_element, _selector, _limit)
  search _element, { xpath: _selector }, _limit
end
set_element_attribute(_element, _name, _value) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 92
def set_element_attribute(_element, _name, _value)
  _element = ensure_element _element
  if DOM_PROPERTIES.include? _name.to_sym
    driver.execute_script("arguments[0]['#{_name}'] = #{_value.to_json};", _element)
  elsif _value == ''
    driver.execute_script("arguments[0].removeAttribute('#{_name}')", _element)
  else
    driver.execute_script("arguments[0].setAttribute('#{_name}', #{_value.to_json})", _element)
  end
end
set_element_text(_element, _value) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 109
def set_element_text(_element, _value)
  _element = ensure_ready_for_input _element
  _element.clear
  _element.send_keys _value
end
submit_form(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 144
def submit_form(_element)
  _element = ensure_element _element
  _element.submit
end
switch_to_frame(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 149
def switch_to_frame(_element)
  driver.switch_to.frame _element
end
switch_to_top_frame() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 153
def switch_to_top_frame
  driver.switch_to.default_content
end

Private Instance Methods

actions() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 180
def actions
  driver.action
end
click_with_modifiers(_element, _modifiers) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 184
def click_with_modifiers(_element, _modifiers)
  _modifiers.each { |m| actions.key_down m }
  actions.click _element
  _modifiers.each { |m| actions.key_up m }
  actions.perform
end
ensure_element(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 191
def ensure_element(_element)
  return driver.find_element tag_name: 'html' if _element == driver
  _element
end
ensure_ready_for_input(_element) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 196
def ensure_ready_for_input(_element)
  _element = ensure_element _element
  Selenium::WebDriver::Wait.new.until { _element.displayed? }
  _element
end
load_cookies_in_session(_session) click to toggle source
# File lib/pincers/webdriver/backend.rb, line 211
def load_cookies_in_session(_session)
  driver.manage.all_cookies.each do |wd_cookie|
    if wd_cookie[:domain] and wd_cookie[:name] and wd_cookie[:value]
      _session.cookie_jar.set Pincers::Http::Cookie.new(
        wd_cookie[:name],
        wd_cookie[:value],
        wd_cookie[:domain],
        wd_cookie[:path],
        wd_cookie[:expires],
        wd_cookie[:secure]
      )
    end
  end
end
proxy_address() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 206
def proxy_address
  proxy = driver.capabilities.proxy
  proxy.nil? ? nil : (proxy.http || proxy.ssl)
end
user_agent() click to toggle source
# File lib/pincers/webdriver/backend.rb, line 202
def user_agent
  driver.execute_script("return navigator.userAgent;")
end