class BlackStack::PampaBrowser

Custom Selenium browser to track all browser activity, and stream the browser window.

Attributes

agent_name[RW]
TODO: enable this when you move to the "frequency-based-streaming" model

PAMPA_BROWSER_CHANNEL_LOCK_FILENAME = './browserfactory.channel.%PROFILE_NAME%.lock' # manejo de concurrencia en la creación de browsers attr_accessor :lockfile

lnuser[RW]
TODO: enable this when you move to the "frequency-based-streaming" model

PAMPA_BROWSER_CHANNEL_LOCK_FILENAME = './browserfactory.channel.%PROFILE_NAME%.lock' # manejo de concurrencia en la creación de browsers attr_accessor :lockfile

profile_name[RW]
TODO: enable this when you move to the "frequency-based-streaming" model

PAMPA_BROWSER_CHANNEL_LOCK_FILENAME = './browserfactory.channel.%PROFILE_NAME%.lock' # manejo de concurrencia en la creación de browsers attr_accessor :lockfile

proxy[RW]
TODO: enable this when you move to the "frequency-based-streaming" model

PAMPA_BROWSER_CHANNEL_LOCK_FILENAME = './browserfactory.channel.%PROFILE_NAME%.lock' # manejo de concurrencia en la creación de browsers attr_accessor :lockfile

Public Class Methods

new(driver) click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 88
    def initialize(driver)
      # TODO: enable this when you move to the "frequency-based-streaming" model
      #fname = PAMPA_BROWSER_CHANNEL_LOCK_FILENAME.gsub('%PROFILE_NAME%', self.profile_name.to_s)
      #self.lockfile = File.open(fname,"w")
      
      #
      super(driver)

      # TODO: enable this when you move to the "frequency-based-streaming" model
=begin
      # Can't operate the same browser from more than 1 thread.
      # More information here:
      # https://stackoverflow.com/questions/28093347/is-selenium-webdriver-thread-safe  
      #
      # https://bibwild.wordpress.com/2015/01/15/ruby-threads-gotcha-with-local-vars-and-shared-state/
      # https://stackoverflow.com/questions/55895952/ruby-how-do-i-share-a-global-variable-amongst-threads-that-are-running-an-objec
      #
      t0 = Thread.new {
        minimum_enlapsed_seconds = 5.to_f
        while true 
          start_time = Time.now
          t1 = Thread.new(self) do |t_browser|
            #while true
              begin
                self.lock_channel
                sleep(1) # para esperar a que se ejecute la sentencia t1.join debajo
                t_browser.push_screenshot
                self.release_channel
              rescue => e
                # Communication with the chrome driver errors may occur.
                # If an exception happens here and it is not catched, then
                # then the thread will stop workng and the streaming will
                # stop.
              end
            #end # while true
          end # Thread.new
          t1.join
          end_time = Time.now
          elapsed_seconds = (end_time - start_time).to_f
          if (elapsed_seconds < minimum_enlapsed_seconds)
            sleep_seconds = minimum_enlapsed_seconds - elapsed_seconds 
            sleep(sleep_seconds.to_i + 1)
          end # if
        end # while true            
      } # Thread.new
=end
    end

Public Instance Methods

back() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 193
def back
  self.notify("back")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
execute_script(script, *args) click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 205
def execute_script(script, *args)
  self.notify("execute_script")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
forward() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 199
def forward
  self.notify("forward")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
goto(url) click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 211
    def goto(url)
#      self.notify("goto")
#      BlackStack::BrowserFactory.browser.push_screenshot
      super
    end
inspect() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 235
def inspect
  self.notify("inspect")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
lock_channel() click to toggle source
# File lib/browserfactory.rb, line 80
def lock_channel()
  self.lockfile.flock(File::LOCK_EX)
end
notify(method) click to toggle source
# File lib/browserfactory.rb, line 136
def notify(method)
  url = "#{BlackStack::Pampa::api_protocol}://#{PROCESS.ws_url}:#{PROCESS.ws_port}/api1.3/pampa/browser/notify.json"
  res = BlackStack::Netting::call_post(url, {
    :api_key => BlackStack::Pampa::api_key,
    :filename => $0,
    :method => method,
    :worker_name => PROCESS.fullWorkerName,
    :id_proxy => self.proxy.nil? ? nil : self.proxy.id,
    :id_lnuser => self.lnuser.nil? ? nil : self.lnuser.id,
    :worker_assigned_process => PROCESS.worker.assigned_process,
    :profile_name => self.profile_name,
    :agent_name => self.agent_name,
  })        
  parsed = JSON.parse(res.body)
  if parsed['status'] != "success"
    raise "Error Tracing BrowserActivity: #{parsed['status']}"
  end
end
push_screenshot(filename=nil) click to toggle source
# File lib/browserfactory.rb, line 155
    def push_screenshot(filename=nil)
=begin
      filename = "#{PROCESS.fullWorkerName}.png" if filename.nil?
      BrowserFactory::screenshot(filename)

      image = MiniMagick::Image.open(filename)
      w = (image[:width].to_f * 0.25).to_i
      h = (image[:height].to_f * 0.25).to_i
      image.resize "#{w.to_s}x#{h.to_s}"
      image.format "png"
      image.write filename

      url = "#{BlackStack::Pampa::api_protocol}://#{PROCESS.ws_url}:#{PROCESS.ws_port}/api1.3/pampa/browser/screenshot.json"
      res = RestClient::Request.execute(
        :api_key => BlackStack::Pampa::api_key,
        :id_client => PROCESS.id_client,
        :verify_ssl => false,
        :url => url, 
        :method => :post, 
        :headers => {
          :accept => 'application/json',
          :params => {
            :api_key => BlackStack::Pampa.api_key,
            :filename => filename,          
          },
        },
        :payload => {
          :file => File.new(filename, "r"),
          :multipart => false,     
        }
      )        
      parsed = JSON.parse(res.body)
      if parsed['status'] != "success"
        raise "Error Uploading Screenshot: #{parsed['status']}"
      end
=end
    end
refresh() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 229
def refresh
  self.notify("refresh")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
release_channel() click to toggle source
# File lib/browserfactory.rb, line 84
def release_channel()
  self.lockfile.flock(File::LOCK_UN)
end
reset!() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 223
def reset!
  self.notify("reset!")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
screenshot() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 217
def screenshot
  self.notify("screenshot")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
send_keys(*args) click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 241
def send_keys(*args)
  # no se notifica el evento, porque incremente el # de llamadas a la API de 800/hora a 5000/hora, y eso requiere mas infraestructura
  #self.notify("send_keys")
  #BlackStack::BrowserFactory.browser.push_screenshot
  super
end
text() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 248
def text
  self.notify("text")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
title() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 254
def title
  self.notify("title")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
url() click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 260
def url
  self.notify("url")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end
wait(timeout = 5) click to toggle source
Calls superclass method
# File lib/browserfactory.rb, line 266
def wait(timeout = 5)
  self.notify("wait")
  BlackStack::BrowserFactory.browser.push_screenshot
  super
end