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