class Capybara::RackTest::Browser
def app
def app driver.app end
def build_rack_mock_session
def build_rack_mock_session reset_host! unless current_host Rack::MockSession.new(app, current_host) end
def current_url
def current_url last_request.url rescue Rack::Test::Error '' end
def dom
def dom @dom ||= Capybara::HTML(html) end
def find(format, selector)
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
def follow(method, path, **attributes)
def follow(method, path, **attributes) return if fragment_or_script?(path) process_and_follow_redirects(method, path, attributes, 'HTTP_REFERER' => current_url) end
def fragment_or_script?(path)
def fragment_or_script?(path) path.gsub(/^#{Regexp.escape(request_path)}/, '').start_with?('#') || path.downcase.start_with?('javascript:') end
def html
def html last_response.body rescue Rack::Test::Error '' end
def initialize(driver)
def initialize(driver) @driver = driver end
def options
def options driver.options end
def process(method, path, attributes = {}, env = {})
def process(method, path, attributes = {}, env = {}) new_uri = URI.parse(path) method.downcase! unless method.is_a? Symbol if path.empty? new_uri.path = request_path else 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?('/') end new_uri.scheme ||= @current_scheme new_uri.host ||= @current_host new_uri.port ||= @current_port unless new_uri.default_port == @current_port @current_scheme, @current_host, @current_port = new_uri.select(:scheme, :host, :port) reset_cache! send(method, new_uri.to_s, attributes, env.merge(options[:headers] || {})) end
def process_and_follow_redirects(method, path, attributes = {}, env = {})
def process_and_follow_redirects(method, path, attributes = {}, env = {}) process(method, path, attributes, env) return unless driver.follow_redirects? driver.redirect_limit.times do if last_response.redirect? if [307, 308].include? last_response.status process(last_request.request_method, last_response['Location'], last_request.params, env) else process(:get, last_response['Location'], {}, env) end end end raise Capybara::InfiniteRedirectError, "redirected more than #{driver.redirect_limit} times, check for infinite redirects." if last_response.redirect? end
def refresh
def refresh reset_cache! request(last_request.fullpath, last_request.env) end
def request_path
def request_path last_request.path rescue Rack::Test::Error '/' end
def reset_cache!
def reset_cache! @dom = nil end
def reset_host!
def reset_host! uri = URI.parse(driver.session_options.app_host || driver.session_options.default_host) @current_scheme, @current_host, @current_port = uri.select(:scheme, :host, :port) end
def submit(method, path, attributes)
def submit(method, path, attributes) path = request_path if path.nil? || path.empty? process_and_follow_redirects(method, path, attributes, 'HTTP_REFERER' => current_url) end
def title
def title dom.title end
def visit(path, **attributes)
def visit(path, **attributes) reset_host! process_and_follow_redirects(:get, path, attributes) end