class WatchDoge::Worker

Public Class Methods

new(uid, options) click to toggle source

options:

1. width: browser's width, default to 1280
2. height: browser's height, default to 768
3. http_client: instance of Selenium::WebDriver::Remote::Http
4. all acceptable arguments of Watir::Browser class
# File lib/watchdoge/worker.rb, line 23
def initialize uid, options
  @http = Selenium::WebDriver::Remote::Http::Default.new

  # HTTP timeout default to 120 sec
  @http.read_timeout = options.delete(:timeout)

  @browser = options[:browser]

  @uid = uid

  options = {
    # Selenium HTTP configuration
    http_client: @http
  }.merge(options).merge(default_browser_profile)

  # intall required version driver
  WatchDoge::WebdriverManager.new @browser
  @core = WatchDoge.configuration.engine.new @browser, options

  # for generate uri hash
  @landed_page = nil

  # autosaving cookies while worker closed
  @cookie_autosave = false

  # flag for cookies loaded
  @cookie_loaded = false

  # width/height
  @width = options[:width]
  @height = options[:height]
  @core.window.resize_to @width, @height
end

Public Instance Methods

close() click to toggle source
# File lib/watchdoge/worker.rb, line 63
def close
  save_cookie
  @core.close
end
fullpage_screenshot(**kwargs) click to toggle source
# File lib/watchdoge/worker.rb, line 57
def fullpage_screenshot **kwargs
  resize_by_viewport(kwargs) do |resize|
    return resize.screenshot
  end
end
goto(uri) click to toggle source
# File lib/watchdoge/worker.rb, line 68
def goto uri
  @core.goto uri

  @landed_page = uri

  load_cookie unless cookie_loaded?

  @core.refresh
end
resize_by_viewport(**kwargs) { |core| ... } click to toggle source
# File lib/watchdoge/worker.rb, line 78
def resize_by_viewport **kwargs
  width = (kwargs.delete :width) || @core.body.width
  height = (kwargs.delete :height) || @core.body.height

  # TODO: improve "wait" logic
  sleep_sec = kwargs.delete :wait

  # has element selector
  unless kwargs.empty?
    sleep 0.5
    target = @core.element(kwargs)
    width = [target.width, @core.body.width].max
    height = [target.height, @core.body.height].max
  end

  @core.window.resize_to [width, 5000].min, [height, 15000].min

  # TODO: improve "wait" logic
  puts "  -> wait rendering #{sleep_sec} sec" if sleep_sec
  sleep sleep_sec.to_i

  yield(@core)
  @core.window.resize_to @width, @height
end

Private Instance Methods

default_browser_profile() click to toggle source
# File lib/watchdoge/worker.rb, line 105
def default_browser_profile
  case @browser
  when :chrome
    prefs = {}

    {
      options: {
        prefs: prefs
      }
    }
  when :firefox
    profile = Selenium::WebDriver::Firefox::Profile.new

    # basically, firefox default sanbox level to 4, which denied access to most folders
    # that broken many env config such as FONTCONFIG_PATH
    profile['security.sandbox.content.level'] = 2
    {
      profile: profile
    }
  end
end
method_missing(method_name, *args) click to toggle source

try delegate all missing methods to selenium

# File lib/watchdoge/worker.rb, line 147
def method_missing(method_name, *args)
  result = @core.__send__(method_name, *args)

  result
end