Adding asset server support with base tag approach
This commit is contained in:
parent
8368069cfd
commit
e0591fef5c
|
@ -16,6 +16,7 @@ module Capybara
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
attr_accessor :asset_root, :app_host, :run_server, :default_host, :always_include_port
|
attr_accessor :asset_root, :app_host, :run_server, :default_host, :always_include_port
|
||||||
|
attr_accessor :asset_host
|
||||||
attr_accessor :server_host, :server_port
|
attr_accessor :server_host, :server_port
|
||||||
attr_accessor :default_selector, :default_wait_time, :ignore_hidden_elements
|
attr_accessor :default_selector, :default_wait_time, :ignore_hidden_elements
|
||||||
attr_accessor :save_and_open_page_path, :automatic_reload
|
attr_accessor :save_and_open_page_path, :automatic_reload
|
||||||
|
@ -36,6 +37,7 @@ module Capybara
|
||||||
# [asset_root = String] Where static assets are located, used by save_and_open_page
|
# [asset_root = String] Where static assets are located, used by save_and_open_page
|
||||||
# [app_host = String] The default host to use when giving a relative URL to visit
|
# [app_host = String] The default host to use when giving a relative URL to visit
|
||||||
# [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL (Default: false)
|
# [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL (Default: false)
|
||||||
|
# [asset_host = String] Where dynamic assets are hosted - will be prepended to relative asset locations if present (Default: nil)
|
||||||
# [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
|
# [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
|
||||||
# [default_selector = :css/:xpath] Methods which take a selector use the given type by default (Default: CSS)
|
# [default_selector = :css/:xpath] Methods which take a selector use the given type by default (Default: CSS)
|
||||||
# [default_wait_time = Integer] The number of seconds to wait for asynchronous processes to finish (Default: 2)
|
# [default_wait_time = Integer] The number of seconds to wait for asynchronous processes to finish (Default: 2)
|
||||||
|
|
|
@ -304,10 +304,18 @@ module Capybara
|
||||||
def save_page(path=nil)
|
def save_page(path=nil)
|
||||||
path ||= "capybara-#{Time.new.strftime("%Y%m%d%H%M%S")}#{rand(10**10)}.html"
|
path ||= "capybara-#{Time.new.strftime("%Y%m%d%H%M%S")}#{rand(10**10)}.html"
|
||||||
path = File.expand_path(path, Capybara.save_and_open_page_path) if Capybara.save_and_open_page_path
|
path = File.expand_path(path, Capybara.save_and_open_page_path) if Capybara.save_and_open_page_path
|
||||||
|
body_to_write = body
|
||||||
|
|
||||||
|
if Capybara.asset_host
|
||||||
|
parsed = Nokogiri::HTML(body_to_write)
|
||||||
|
if parsed.css("base").empty? && match = body_to_write.match(/<head[^<]*?>/)
|
||||||
|
body_to_write.insert match.end(0), "<base href='#{Capybara.asset_host}' />"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
FileUtils.mkdir_p(File.dirname(path))
|
FileUtils.mkdir_p(File.dirname(path))
|
||||||
|
|
||||||
File.open(path,'w') { |f| f.write(body) }
|
File.open(path,'w') { |f| f.write(body_to_write) }
|
||||||
path
|
path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -43,4 +43,25 @@ Capybara::SpecHelper.spec '#save_page' do
|
||||||
filename = path.split("/").last
|
filename = path.split("/").last
|
||||||
result.should == filename
|
result.should == filename
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "asset_host contains a string" do
|
||||||
|
before { Capybara.asset_host = "http://example.com" }
|
||||||
|
after { Capybara.asset_host = nil }
|
||||||
|
|
||||||
|
it "prepends base tag with value from asset_host to the head" do
|
||||||
|
@session.visit("/with_js")
|
||||||
|
path = @session.save_page
|
||||||
|
|
||||||
|
result = File.read(path)
|
||||||
|
result.should include("<head><base href='http://example.com' />")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't prepend base tag to pages which already have it" do
|
||||||
|
@session.visit("/with_base_tag")
|
||||||
|
path = @session.save_page
|
||||||
|
|
||||||
|
result = File.read(path)
|
||||||
|
result.should_not include("http://example.com")
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
||||||
|
<base href="http://example2.com" />
|
||||||
|
<title>with_external_source</title>
|
||||||
|
</head>
|
||||||
|
<body id="with_js">
|
||||||
|
<h1>FooBar</h1>
|
||||||
|
</body>
|
||||||
|
</html
|
Loading…
Reference in New Issue