如何在Capybara和RSpec中测试CSV文件下载?

发布于 2021-02-01 11:36:37

控制器中包含以下内容:

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

我看到“保存文件”对话框,但显然不是“警告”对话框。

如何单击确定并让水豚看到数据?

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    改编自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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看