add :download filter to :link selector

This commit is contained in:
Thomas Walpole 2018-06-17 13:25:32 -07:00
parent fc2a0ffd20
commit 047a3feb73
5 changed files with 32 additions and 8 deletions

View File

@ -112,6 +112,15 @@ Capybara.add_selector(:link) do
href.is_a?(Regexp) ? node[:href].match(href) : true
end
expression_filter(:download, valid_values: [true, false, String]) do |expr, download|
mod = case download
when true then XPath.attr(:download)
when false then !XPath.attr(:download)
when String then XPath.attr(:download) == download
end
expr[mod]
end
describe do |**options|
desc = +""
desc << " with href #{options[:href].inspect}" if options[:href]

View File

@ -49,7 +49,8 @@ module Capybara
end
def valid_value?(value)
!@options.key?(:valid_values) || Array(@options[:valid_values]).include?(value)
return true unless @options.key?(:valid_values)
Array(@options[:valid_values]).any? { |valid| valid === value } # rubocop:disable Style/CaseEquality
end
end
end

View File

@ -49,4 +49,22 @@ Capybara::SpecHelper.spec '#find_link' do
expect(@session.find_link(href: '#anchor').text).to eq "Normal Anchor"
end
end
context "download filter" do
it "finds a download link" do
expect(@session.find_link("Download Me", download: true).text).to eq "Download Me"
end
it "doesn't find a download link if download is false" do
expect { @session.find_link("Download Me", download: false) }.to raise_error Capybara::ElementNotFound
end
it "finds a renaming download link" do
expect(@session.find_link(download: "other.csv").text).to eq "Download Other"
end
it "raises if passed an invalid value" do
expect { @session.find_link(download: 37) }.to raise_error ArgumentError
end
end
end

View File

@ -175,3 +175,4 @@ banana</textarea>
</div>
<a href="/download.csv" download>Download Me</a>
<a href="/download.csv" download="other.csv">Download Other</a>

View File

@ -15,9 +15,7 @@ Capybara.register_driver :selenium_chrome do |app|
driver = Capybara::Selenium::Driver.new(app, browser: :chrome)
# TODO: Fix this when selenium with `download_path =` support is released
bridge = driver.browser.send(:bridge)
params = { 'cmd' =>'Page.setDownloadBehavior',
"params" => {"behavior" => 'allow', 'downloadPath' => Capybara.save_path }
}
params = { cmd: 'Page.setDownloadBehavior', params: { behavior: 'allow', downloadPath: Capybara.save_path } }
command = +'/session/:session_id/chromium/send_command'
command[':session_id'] = bridge.session_id
bridge.http.call(:post, command, params)
@ -33,9 +31,7 @@ Capybara.register_driver :selenium_chrome_headless do |app|
# TODO: Fix this when selenium with `download_path =` support is released
bridge = driver.browser.send(:bridge)
params = { 'cmd' =>'Page.setDownloadBehavior',
"params" => {"behavior" => 'allow', 'downloadPath' => Capybara.save_path }
}
params = { cmd: 'Page.setDownloadBehavior', params: { behavior: 'allow', downloadPath: Capybara.save_path } }
command = +'/session/:session_id/chromium/send_command'
command[':session_id'] = bridge.session_id
bridge.http.call(:post, command, params)
@ -43,7 +39,6 @@ Capybara.register_driver :selenium_chrome_headless do |app|
driver
end
Capybara.register_driver :selenium_chrome_clear_storage do |app|
chrome_options = {
browser: :chrome,