class Dinero::Bank::Base

Attributes

login_url[R]
password[R]
security_questions[R]
timeout[R]
username[R]

Public Class Methods

new(options) click to toggle source
# File lib/dinero/banks.rb, line 9
def initialize options
  opts = default_options.merge options

  @username = opts[:username]
  @password = opts[:password]
  @login_url = opts[:login_url]
  @security_questions = opts[:security_questions] || []
  @timeout = opts[:timeout] || DEFAULT_TIMEOUT
  @authenticated = false
  validate!
end

Public Instance Methods

accounts_summary_document() click to toggle source
# File lib/dinero/banks.rb, line 62
def accounts_summary_document
  return @accounts_summary_document if @accounts_summary_document

  goto_accounts_summary_page
  @accounts_summary_document = Nokogiri::HTML connection.page_source
end
after_successful_login() click to toggle source
# File lib/dinero/banks.rb, line 69
def after_successful_login
  # NOP
end
authenticated?() click to toggle source
# File lib/dinero/banks.rb, line 54
def authenticated?
  !!@authenticated
end
class_name() click to toggle source
# File lib/dinero/banks.rb, line 73
def class_name
  self.class.to_s.downcase.gsub("dinero::bank::", '')
end
connection() click to toggle source
# File lib/dinero/banks.rb, line 50
def connection
  @connection ||= establish_connection
end
default_options() click to toggle source
# File lib/dinero/banks.rb, line 27
def default_options
  {}
end
establish_connection() click to toggle source
# File lib/dinero/banks.rb, line 39
def establish_connection
  capabilities = Selenium::WebDriver::Remote::Capabilities.phantomjs(
    'phantomjs.page.settings.userAgent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0',
    'service_args' => ['--ignore-ssl-errors=true', '--ssl-protocol=any']
  )

  driver = Selenium::WebDriver.for :phantomjs, :desired_capabilities => capabilities
  driver.manage.window.size = Selenium::WebDriver::Dimension.new(1640, 768)
  driver
end
find_answer(question) click to toggle source
# File lib/dinero/banks.rb, line 31
def find_answer question
  if q = security_questions.detect{ |qa| qa["question"] == question }
    return q["answer"]
  else
    raise "Unknown security question: #{question.inspect}"
  end
end
goto_login_page() click to toggle source
# File lib/dinero/banks.rb, line 96
def goto_login_page
  connection.navigate.to login_url
  snap "#{class_name}_login_page.png"
end
login!() click to toggle source
# File lib/dinero/banks.rb, line 101
def login!
  return if authenticated?
  screenshot_on_error do
    goto_login_page
    post_credentials!
    wait.until { on_accounts_summary_page? }
    after_successful_login
    @authenticated = true
  end
end
screenshot_on_error(name = nil) { || ... } click to toggle source
# File lib/dinero/banks.rb, line 82
def screenshot_on_error name = nil
  begin
    yield
  rescue
    unless name
      class_name, method_name = caller.first.match(/(\w+)\.rb\:\d+\:in\s\`([^\']+)/).captures
      name = "#{class_name}_#{method_name.gsub(/\W/, '')}"
    end
    snap "#{name}_error" unless @captured_error
    @captured_error = true
    raise
  end
end
snap(filename) click to toggle source
# File lib/dinero/banks.rb, line 77
def snap filename
  filename = filename + '.png' unless filename =~ /\.png$/
  connection.save_screenshot "log/#{filename}"
end
validate!() click to toggle source
# File lib/dinero/banks.rb, line 21
def validate!
  raise "Must supply :username" if @username.to_s.empty?
  raise "Must supply :password" if @password.to_s.empty?
  raise "Must have a :login_url" if @login_url.to_s.empty?
end
wait() click to toggle source
# File lib/dinero/banks.rb, line 58
def wait
  @wait ||= Selenium::WebDriver::Wait.new(:timeout => timeout)
end