class CongressForms::WebForm

Attributes

actions[RW]
bioguide[RW]
success_content[RW]
success_status[RW]
updated_at[RW]

Public Class Methods

create_browser() click to toggle source
# File lib/congress_forms/web_form.rb, line 26
def self.create_browser
  if ENV["HEADLESS"] == "0"
    Capybara::Session.new(:chrome)
  elsif ENV["WEBDRIVER_HOST"] && !ENV["WEBDRIVER_HOST"].empty?
    Capybara::Session.new(:remote)
  else
    Capybara::Session.new(:headless_chrome)
  end.tap do |browser|
    browser.current_window.resize_to(1920, 1080)
  end
end
new(actions = [], bioguide: nil, success_status: nil, success_content: nil, updated_at: nil) click to toggle source
# File lib/congress_forms/web_form.rb, line 38
def initialize(actions = [], bioguide: nil,
               success_status: nil,
               success_content: nil,
               updated_at: nil)
  self.bioguide = bioguide
  self.actions = actions
  self.success_status = success_status
  self.success_content = success_content
  self.updated_at = updated_at
end
parse(spec, attrs={}) click to toggle source
# File lib/congress_forms/web_form.rb, line 7
def self.parse(spec, attrs={})
  yaml = YAML.load(spec)

  actions = yaml.dig("contact_form", "steps").map do |step|
    Actions.build(step)
  end.flatten

  new(
    actions,
    attrs.merge(
      bioguide: yaml["bioguide"],
      success_status:
        yaml.dig("contact_form", "success", "headers", "status"),
      success_content:
        yaml.dig("contact_form", "success", "body", "contains"),
    )
  )
end

Public Instance Methods

fill(values, browser: self.class.create_browser, validate_only: false) click to toggle source
# File lib/congress_forms/web_form.rb, line 64
def fill(values, browser: self.class.create_browser, validate_only: false)
  log("#{bioguide} fill")

  actions.each do |action|
    break if action.submit? && validate_only

    log(action.inspect)

    action.perform(browser, values)
  end

  log("done: success")
rescue Capybara::CapybaraError, Selenium::WebDriver::Error::WebDriverError => e
  log("done: error")

  error = Error.new(e.message)
  error.set_backtrace(e.backtrace)

  attach_screenshot(browser, error)

  raise error
ensure
  browser.quit
end
required_params() click to toggle source
# File lib/congress_forms/web_form.rb, line 49
def required_params
  required_actions = actions.dup

  required_actions.select!(&:required?)
  required_actions.select!(&:placeholder_value?)

  required_actions.map do |action|
    {
      value: action.value,
      max_length: action.max_length,
      options: action.select_options
    }
  end
end

Protected Instance Methods

attach_screenshot(browser, error) click to toggle source
# File lib/congress_forms/web_form.rb, line 105
def attach_screenshot(browser, error)
  if dir = ENV["CONGRESS_FORMS_SCREENSHOT_LOCATION"]
    random = SecureRandom.hex(16)
    stamp = Time.now.strftime("%Y-%m-%d_%H:%M:%S")

    path = "#{dir}/#{bioguide}/#{stamp}_#{random}.png"
    FileUtils.mkdir_p(File.dirname(path))

    browser.save_screenshot(path, full: true)

    error.screenshot = path
  end
rescue Selenium::WebDriver::Error::NoSuchDriverError => e
  nil
end
log(message) click to toggle source
# File lib/congress_forms/web_form.rb, line 91
def log(message)
  if defined?(Rails)
    Rails.logger.debug(message)
  end

  if defined?(Raven)
    unless Raven.context.extra.key?(:fill_log)
      Raven.extra_context(fill_log: "")
    end

    Raven.context.extra[:fill_log] << message << "\n"
  end
end