B S*_*ven 15 ruby selenium rspec ruby-on-rails capybara
以下是在控制器中:
respond_to do |format|
format.csv { send_data as_csv, type:'text/csv' }
end
Run Code Online (Sandbox Code Playgroud)
在规格:
click_link 'Download CSV'
page.driver.browser.switch_to.alert.accept
expect( page ).to have_content csv_data
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
Failure/Error: page.driver.browser.switch_to.alert.accept
Selenium::WebDriver::Error::NoAlertPresentError: No alert is present
Run Code Online (Sandbox Code Playgroud)
我看到"保存文件"对话框显示,但显然它不是"警告"对话框.
如何点击确定并让Capybara查看数据?
B S*_*ven 19
改编自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
Run Code Online (Sandbox Code Playgroud)
规范助手:
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
Run Code Online (Sandbox Code Playgroud)
共享/ 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
Run Code Online (Sandbox Code Playgroud)
如果您使用rack_test驱动程序(没有 javascript/没有浏览器),我找到了另一种方法来做到这一点:
DOWNLOAD_CACHE_PATH = Rails.root.join("tmp/downloaded_file").to_s
setup do
File.delete(DOWNLOAD_CACHE_PATH)
end
test "download file" do
visit download_file_path
# simulate file download
File.write(DOWNLOAD_CACHE_PATH, page.body)
csv = CSV.open(DOWNLOAD_CACHE_PATH)
# assert something on the csv data
end
Run Code Online (Sandbox Code Playgroud)