Class: Capybara::RackTest::Browser
- Inherits:
-
Object
- Object
- Capybara::RackTest::Browser
- Includes:
- Rack::Test::Methods
- Defined in:
- lib/capybara/rack_test/browser.rb
Instance Attribute Summary collapse
-
#current_host ⇒ Object
Returns the value of attribute current_host.
-
#driver ⇒ Object
readonly
Returns the value of attribute driver.
Instance Method Summary collapse
- #app ⇒ Object
- #build_uri(path) ⇒ Object
- #current_url ⇒ Object
- #dom ⇒ Object
- #find(format, selector) ⇒ Object
- #follow(method, path, **attributes) ⇒ Object
- #html ⇒ Object
-
#initialize(driver) ⇒ Browser
constructor
A new instance of Browser.
- #options ⇒ Object
- #process(method, path, attributes = {}, env = {}) ⇒ Object
- #process_and_follow_redirects(method, path, attributes = {}, env = {}) ⇒ Object
- #refresh ⇒ Object
- #reset_cache! ⇒ Object
- #reset_host! ⇒ Object
- #submit(method, path, attributes) ⇒ Object
- #title ⇒ Object
- #visit(path, **attributes) ⇒ Object
Constructor Details
#initialize(driver) ⇒ Browser
Returns a new instance of Browser.
9 10 11 12 |
# File 'lib/capybara/rack_test/browser.rb', line 9 def initialize(driver) @driver = driver @current_fragment = nil end |
Instance Attribute Details
#current_host ⇒ Object
Returns the value of attribute current_host
7 8 9 |
# File 'lib/capybara/rack_test/browser.rb', line 7 def current_host @current_host end |
#driver ⇒ Object (readonly)
Returns the value of attribute driver
6 7 8 |
# File 'lib/capybara/rack_test/browser.rb', line 6 def driver @driver end |
Instance Method Details
#app ⇒ Object
14 15 16 |
# File 'lib/capybara/rack_test/browser.rb', line 14 def app driver.app end |
#build_uri(path) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/capybara/rack_test/browser.rb', line 75 def build_uri(path) URI.parse(path).tap do |uri| uri.path = request_path if path.empty? || path.start_with?('?') uri.path = '/' if uri.path.empty? uri.path = request_path.sub(%r{/[^/]*$}, '/') + uri.path unless uri.path.start_with?('/') uri.scheme ||= @current_scheme uri.host ||= @current_host uri.port ||= @current_port unless uri.default_port == @current_port end end |
#current_url ⇒ Object
87 88 89 90 91 92 93 |
# File 'lib/capybara/rack_test/browser.rb', line 87 def current_url uri = build_uri(last_request.url) uri.fragment = @current_fragment if @current_fragment uri.to_s rescue Rack::Test::Error '' end |
#dom ⇒ Object
104 105 106 |
# File 'lib/capybara/rack_test/browser.rb', line 104 def dom @dom ||= Capybara::HTML(html) end |
#find(format, selector) ⇒ Object
108 109 110 111 112 113 114 |
# File 'lib/capybara/rack_test/browser.rb', line 108 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) ⇒ Object
39 40 41 42 43 |
# File 'lib/capybara/rack_test/browser.rb', line 39 def follow(method, path, **attributes) return if fragment_or_script?(path) process_and_follow_redirects(method, path, attributes, 'HTTP_REFERER' => current_url) end |
#html ⇒ Object
116 117 118 119 120 |
# File 'lib/capybara/rack_test/browser.rb', line 116 def html last_response.body rescue Rack::Test::Error '' end |
#options ⇒ Object
18 19 20 |
# File 'lib/capybara/rack_test/browser.rb', line 18 def driver. end |
#process(method, path, attributes = {}, env = {}) ⇒ Object
66 67 68 69 70 71 72 73 |
# File 'lib/capybara/rack_test/browser.rb', line 66 def process(method, path, attributes = {}, env = {}) method = method.downcase new_uri = build_uri(path) @current_scheme, @current_host, @current_port = new_uri.select(:scheme, :host, :port) @current_fragment = new_uri.fragment || @current_fragment reset_cache! send(method, new_uri.to_s, attributes, env.merge([:headers] || {})) end |
#process_and_follow_redirects(method, path, attributes = {}, env = {}) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/capybara/rack_test/browser.rb', line 45 def process_and_follow_redirects(method, path, attributes = {}, env = {}) @current_fragment = build_uri(path).fragment 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 if last_response.redirect? # rubocop:disable Style/GuardClause raise Capybara::InfiniteRedirectError, "redirected more than #{driver.redirect_limit} times, check for infinite redirects." end end |
#refresh ⇒ Object
27 28 29 30 |
# File 'lib/capybara/rack_test/browser.rb', line 27 def refresh reset_cache! request(last_request.fullpath, last_request.env) end |
#reset_cache! ⇒ Object
100 101 102 |
# File 'lib/capybara/rack_test/browser.rb', line 100 def reset_cache! @dom = nil end |
#reset_host! ⇒ Object
95 96 97 98 |
# File 'lib/capybara/rack_test/browser.rb', line 95 def reset_host! uri = URI.parse(driver..app_host || driver..default_host) @current_scheme, @current_host, @current_port = uri.select(:scheme, :host, :port) end |
#submit(method, path, attributes) ⇒ Object
32 33 34 35 36 37 |
# File 'lib/capybara/rack_test/browser.rb', line 32 def submit(method, path, attributes) path = request_path if path.nil? || path.empty? uri = build_uri(path) uri.query = '' if method.to_s.casecmp('get').zero? process_and_follow_redirects(method, uri.to_s, attributes, 'HTTP_REFERER' => current_url) end |
#title ⇒ Object
122 123 124 |
# File 'lib/capybara/rack_test/browser.rb', line 122 def title dom.title end |
#visit(path, **attributes) ⇒ Object
22 23 24 25 |
# File 'lib/capybara/rack_test/browser.rb', line 22 def visit(path, **attributes) reset_host! process_and_follow_redirects(:get, path, attributes) end |