Class: Browsed::Client

Inherits:
Object
  • Object
show all
Includes:
Browser, Chrome, Firefox, Phantomjs, Proxies, Capybara::DSL
Defined in:
lib/browsed/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Proxies

#generate_proxy_auth_url, #generate_selenium_webdriver_proxy, #proxy_using_auth?, #valid_proxy?

Methods included from Browser

#generate_browser_id, #is_ipad?, #is_iphone?, #randomize_ios_resolution, #randomize_resolution, #resizable_browser?, #resize!, #runs_ios?, #set_resolution, #set_user_agent

Constructor Details

#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) ⇒ Client

Returns a new instance of Client.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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

Instance Attribute Details

#browserObject

Returns the value of attribute browser.



4
5
6
# File 'lib/browsed/client.rb', line 4

def browser
  @browser
end

#browser_idObject

Returns the value of attribute browser_id.



4
5
6
# File 'lib/browsed/client.rb', line 4

def browser_id
  @browser_id
end

#configurationObject

Returns the value of attribute configuration.



3
4
5
# File 'lib/browsed/client.rb', line 3

def configuration
  @configuration
end

#deviceObject

Returns the value of attribute device.



6
7
8
# File 'lib/browsed/client.rb', line 6

def device
  @device
end

#driverObject

Returns the value of attribute driver.



4
5
6
# File 'lib/browsed/client.rb', line 4

def driver
  @driver
end

#environmentObject

Returns the value of attribute environment.



4
5
6
# File 'lib/browsed/client.rb', line 4

def environment
  @environment
end

#headlessObject

Returns the value of attribute headless.



4
5
6
# File 'lib/browsed/client.rb', line 4

def headless
  @headless
end

#managerObject

Returns the value of attribute manager.



7
8
9
# File 'lib/browsed/client.rb', line 7

def manager
  @manager
end

#maximum_processesObject

Returns the value of attribute maximum_processes.



7
8
9
# File 'lib/browsed/client.rb', line 7

def maximum_processes
  @maximum_processes
end

#proxyObject

Returns the value of attribute proxy.



5
6
7
# File 'lib/browsed/client.rb', line 5

def proxy
  @proxy
end

#proxy_chain_serverObject

Returns the value of attribute proxy_chain_server.



5
6
7
# File 'lib/browsed/client.rb', line 5

def proxy_chain_server
  @proxy_chain_server
end

#resolutionObject

Returns the value of attribute resolution.



6
7
8
# File 'lib/browsed/client.rb', line 6

def resolution
  @resolution
end

#sessionObject

Returns the value of attribute session.



5
6
7
# File 'lib/browsed/client.rb', line 5

def session
  @session
end

#user_agentObject

Returns the value of attribute user_agent.



6
7
8
# File 'lib/browsed/client.rb', line 6

def user_agent
  @user_agent
end

Instance Method Details

#can_start_new_process?Boolean

Returns:

  • (Boolean)


85
86
87
# 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) ⇒ Object



89
90
91
# File 'lib/browsed/client.rb', line 89

def display_screenshot!(path)
  Launchy.open path if development?
end

#quit!(retries: 3) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# 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!Object



93
94
95
# File 'lib/browsed/client.rb', line 93

def reset_session!
  self.session.reset_session! rescue nil
end

#set_browser(browser) ⇒ Object

Raises:

  • (::Browsed::Errors::InvalidBrowserError)


61
62
63
64
65
66
# 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::Errors::InvalidBrowserError unless ::Browsed::Constants::BROWSERS.include?(self.browser)
end

#set_driverObject



50
51
52
53
54
55
56
57
58
59
# 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) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 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