控制器中包含以下内容:
respond_to do |format| format.csv { send_data as_csv, type:'text/csv' } end
规格:
click_link 'Download CSV' page.driver.browser.switch_to.alert.accept expect( page ).to have_content csv_data
但这不起作用:
Failure/Error: page.driver.browser.switch_to.alert.accept Selenium::WebDriver::Error::NoAlertPresentError: No alert is present
我看到“保存文件”对话框,但显然不是“警告”对话框。
如何单击确定并让水豚看到数据?
改编自CollectiveIdea和其他来源。
在OSX上工作。Firefox 34.0.5
describe 'Download CSV' do let( :submission_email ){ 'foo@example.com' } let( :email_csv ){ "id,email,created_at\n1,#{ submission_email }," } specify do visit '/emails' expect( page ).to have_content 'Email Submissions' click_on 'Download CSV' expect( DownloadHelpers::download_content ).to include email_csv end end
规范助手:
require 'shared/download_helper' Capybara.register_driver :selenium do |app| profile = Selenium::WebDriver::Firefox::Profile.new profile['browser.download.dir'] = DownloadHelpers::PATH.to_s profile['browser.download.folderList'] = 2 # Suppress "open with" dialog profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv' Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile) end config.before( :each ) do DownloadHelpers::clear_downloads end
共享/download_helper.rb:
module DownloadHelpers TIMEOUT = 1 PATH = Rails.root.join("tmp/downloads") extend self def downloads Dir[PATH.join("*")] end def download downloads.first end def download_content wait_for_download File.read(download) end def wait_for_download Timeout.timeout(TIMEOUT) do sleep 0.1 until downloaded? end end def downloaded? !downloading? && downloads.any? end def downloading? downloads.grep(/\.part$/).any? end def clear_downloads FileUtils.rm_f(downloads) end end