class Capybara::RackTest::Browser

frozen_string_literal: true

Attributes

current_host[RW]
driver[R]

Public Class Methods

new(driver) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 8
def initialize(driver)
  @driver = driver
end

Public Instance Methods

app() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 12
def app
  driver.app
end
current_url() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 64
def current_url
  last_request.url
rescue Rack::Test::Error
  ""
end
dom() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 81
def dom
  @dom ||= Capybara::HTML(html)
end
find(format, selector) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 85
def find(format, selector)
  if format==:css
    dom.css(selector, Capybara::RackTest::CSSHandlers.new)
  else
    dom.xpath(selector)
  end.map { |node| Capybara::RackTest::Node.new(self, node) }
end
follow(method, path, attributes = {}) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 30
def follow(method, path, attributes = {})
  return if path.gsub(/^#{Regexp.escape(request_path)}/, '').start_with?('#') || path.downcase.start_with?('javascript:')
  process_and_follow_redirects(method, path, attributes, {'HTTP_REFERER' => current_url})
end
html() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 93
def html
  last_response.body
rescue Rack::Test::Error
  ""
end
options() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 16
def options
  driver.options
end
process(method, path, attributes = {}, env = {}) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 45
def process(method, path, attributes = {}, env = {})
  new_uri = URI.parse(path)
  method.downcase! unless method.is_a? Symbol

  new_uri.path = request_path if path.start_with?("?")
  new_uri.path = "/" if new_uri.path.empty?
  new_uri.path = request_path.sub(%r(/[^/]*$), '/') + new_uri.path unless new_uri.path.start_with?('/')
  new_uri.scheme ||= @current_scheme
  new_uri.host ||= @current_host
  new_uri.port ||= @current_port unless new_uri.default_port == @current_port

  @current_scheme = new_uri.scheme
  @current_host = new_uri.host
  @current_port = new_uri.port

  reset_cache!
  send(method, new_uri.to_s, attributes, env.merge(options[:headers] || {}))
end
process_and_follow_redirects(method, path, attributes = {}, env = {}) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 35
def process_and_follow_redirects(method, path, attributes = {}, env = {})
  process(method, path, attributes, env)
  if driver.follow_redirects?
    driver.redirect_limit.times do
      process(:get, last_response["Location"], {}, env) if last_response.redirect?
    end
    raise Capybara::InfiniteRedirectError, "redirected more than #{driver.redirect_limit} times, check for infinite redirects." if last_response.redirect?
  end
end
reset_cache!() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 77
def reset_cache!
  @dom = nil
end
reset_host!() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 70
def reset_host!
  uri = URI.parse(Capybara.app_host || Capybara.default_host)
  @current_scheme = uri.scheme
  @current_host = uri.host
  @current_port = uri.port
end
submit(method, path, attributes) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 25
def submit(method, path, attributes)
  path = request_path if not path or path.empty?
  process_and_follow_redirects(method, path, attributes, {'HTTP_REFERER' => current_url})
end
title() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 99
def title
  if dom.respond_to? :title
    dom.title
  else
    #old versions of nokogiri don't have #title - remove in 3.0
    dom.xpath('/html/head/title | /html/title').first.text
  end
end
visit(path, attributes = {}) click to toggle source
# File lib/capybara/rack_test/browser.rb, line 20
def visit(path, attributes = {})
  reset_host!
  process_and_follow_redirects(:get, path, attributes)
end

Protected Instance Methods

build_rack_mock_session() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 110
def build_rack_mock_session
  reset_host! unless current_host
  Rack::MockSession.new(app, current_host)
end
request_path() click to toggle source
# File lib/capybara/rack_test/browser.rb, line 115
def request_path
  last_request.path
rescue Rack::Test::Error
  "/"
end