class Browsed::Client

Attributes

browser[RW]
browser_id[RW]
configuration[RW]
device[RW]
driver[RW]
environment[RW]
headless[RW]
manager[RW]
maximum_processes[RW]
proxy[RW]
proxy_chain_server[RW]
resolution[RW]
session[RW]
user_agent[RW]

Public Class Methods

new(configuration: ::Browsed.configuration, driver: :selenium_chrome, browser: :chrome, headless: false, device: :desktop, proxy: nil, user_agent: nil, resolution: nil, environment: :production, options: {}, maximum_processes: nil) click to toggle source
# File lib/browsed/client.rb, line 11
def initialize(configuration:     ::Browsed.configuration,
               driver:            :selenium_chrome,
               browser:           :chrome,
               headless:          false,
               device:            :desktop,
               proxy:             nil,
               user_agent:        nil,
               resolution:        nil,
               environment:       :production,
               options:           {},
               maximum_processes: nil)
  
  self.configuration        =   configuration
  self.headless             =   headless
  self.environment          =   environment || self.configuration.environment
  
  self.device               =   device
  
  self.proxy                =   proxy
  self.proxy_chain_server   =   nil
  
  self.manager              =   ::Browsed::Manager.new(browser: self.browser)
  self.maximum_processes    =   maximum_processes || self.configuration.maximum_processes
  
  set_browser(browser)
  set_driver
  set_user_agent(user_agent)
  set_resolution(resolution)
  
  options.merge!(browser_id: self.browser_id)
  setup_capybara(options: options)
end

Public Instance Methods

can_start_new_process?() click to toggle source
# File lib/browsed/client.rb, line 85
def can_start_new_process?
  self.maximum_processes.nil? || self.manager.can_start_more_processes?(max_count: self.maximum_processes)
end
display_screenshot!(path) click to toggle source
# File lib/browsed/client.rb, line 89
def display_screenshot!(path)
  Launchy.open path if development?
end
quit!(retries: 3) click to toggle source
# File lib/browsed/client.rb, line 97
def quit!(retries: 3)
  begin
    reset_session!
    self.session.driver.quit
  rescue Exception
    retries       -=    1
    retry if retries > 0
  end
  
  # If Selenium/Phantom somehow isn't able to shut down the browser, force a shutdown using kill -9
  self.manager.set_command(browser_id: self.browser_id)
  self.manager.kill_processes!
  
  if self.proxy_chain_server
    self.proxy_chain_server.stop
    self.proxy_chain_server   =   nil
  end
  
  self.session                =   nil
end
reset_session!() click to toggle source
# File lib/browsed/client.rb, line 93
def reset_session!
  self.session.reset_session! rescue nil
end
set_browser(browser) click to toggle source
# File lib/browsed/client.rb, line 61
def set_browser(browser)
  self.browser      =   (browser || self.configuration.browser)&.to_sym
  self.browser_id   =   generate_browser_id
  
  raise ::Browsed::InvalidBrowserError unless ::Browsed::Constants::BROWSERS.include?(self.browser)
end
set_driver() click to toggle source
# File lib/browsed/client.rb, line 50
def set_driver
  self.driver   =   case self.browser.to_sym
    when :chrome
      self.headless ? :selenium_chrome_headless : :selenium_chrome
    when :firefox
      :selenium
    when :phantomjs
      :poltergeist
  end
end
setup_capybara(options: {}, retries: 3) click to toggle source
# File lib/browsed/client.rb, line 68
def setup_capybara(options: {}, retries: 3)
  self.manager.kill_stale_processes!
  
  if can_start_new_process?
    register_driver!(options)
  
    Capybara.default_driver         =   self.driver
    Capybara.javascript_driver      =   self.driver
  
    Capybara.default_max_wait_time  =   options.fetch(:wait_time, 5) #seconds
  
    self.session                    =   Capybara::Session.new(self.driver)
  else
    raise Browsed::TooManyProcessesError, "Too many #{self.browser} processes running, reached maximum allowed number of #{self.maximum_processes} processes."
  end
end

Private Instance Methods

chrome?() click to toggle source
# File lib/browsed/client.rb, line 137
def chrome?
  self.browser.to_sym.eql?(:chrome)
end
development?() click to toggle source
# File lib/browsed/client.rb, line 141
def development?
  in_environment?(:development)
end
firefox?() click to toggle source
# File lib/browsed/client.rb, line 133
def firefox?
  self.browser.to_sym.eql?(:firefox)
end
headless?() click to toggle source
# File lib/browsed/client.rb, line 149
def headless?
  self.headless
end
in_environment?(env) click to toggle source
# File lib/browsed/client.rb, line 145
def in_environment?(env)
  self.environment.eql?(env)
end
log(message) click to toggle source
# File lib/browsed/client.rb, line 153
def log(message)
  puts "[Browsed::Client] - #{Time.now}: #{message}" if self.configuration.verbose?
end
phantomjs?() click to toggle source
# File lib/browsed/client.rb, line 129
def phantomjs?
  self.browser.to_sym.eql?(:phantomjs)
end
register_driver!(options = {}) click to toggle source
# File lib/browsed/client.rb, line 119
def register_driver!(options = {})
  if firefox?
    register_firefox_driver(options: options)
  elsif chrome?
    register_chrome_driver(options: options.merge(resolution: self.resolution))
  elsif phantomjs?
    register_phantomjs_driver(options: options)
  end
end