web-dev-qa-db-ja.com

CapybaraおよびPoltergeistドライバーを使用して特定のフォルダーにファイルをダウンロードする

CapybaraとPoltergeistドライバーを使用して受け入れテストを作成しています。ダウンロードしたCSVファイルの内容を検証する必要があります。

  1. ダウンロードする代わりに、ページ自体にコンテンツをレンダリングするさまざまな方法を試しました。
  2. Mimeタイプも変更してみましたが、動作しません。

最後に、特定のフォルダーにファイルをダウンロードして、コアRubyライブラリーを使用してCSVファイルを読み取るというオプションで落ち着きたいです。

これを実現するために、ポルターガイストドライバーがダウンロードリンクをクリックすると、ポップアップを処理して、指定されたフォルダーにファイルを直接ダウンロードする必要があります。

Seleniumのchromeおよびfirefoxドライバーでは、ポップアップを処理し、ダウンロードディレクトリを構成するようにプロファイルを構成するオプションがあります。

ポルターガイストを使用したそのようなオプションはありますか?どんな情報でも役に立ちます。

20
rupesh

Railsアプリで同様のことをしなければなりませんでした。私の解決策は、Javascriptを使用してURLへのXMLHttpRequestを作成し、ファイルをダウンロードし、ファイルの内容をCapybaraに返します。 Rubyを使用してファイルをディスクのどこかに保存します。次に、別の手順で、ダウンロードしたCSVファイルの内容を確認します。

ファイルをダウンロードするためのステップ定義は次のとおりです。

Then /^I download the csv file$/ do
  page.execute_script("window.downloadCSVXHR = function(){ var url = window.location.protocol + '//' + window.location.Host + '/file.csv'; return getFile(url); }")
  page.execute_script("window.getFile = function(url) { var xhr = new XMLHttpRequest();  xhr.open('GET', url, false);  xhr.send(null); return xhr.responseText; }")

  data = page.evaluate_script("downloadCSVXHR()")
  File.open(File.join(Rails.root, "tmp", "csv.data"), "w") { |f| f.write(data) }
end

JavascriptコードのURLをCSVの場所に変更します。

最後に、CSVファイルの内容を検証するためのステップ定義を次に示します。

And /^the contents of the downloaded csv should be:$/ do |contents|
  file = File.open(File.join(Rails.root, "tmp", "csv.data"), "r")
  file_contents = file.read
  file_contents.chop!
  file_contents.should == contents
end

幸運を。お役に立てれば。

15
Richard

これは現在、ポルターガイストでは不可能です。

カピバラを使用しないこのCSVのテストを作成したほうがよいと思います。 (たとえば、組み込みのRails統合テストを使用し、応答をCSVとして解析します。)

4
jonleighton

PhantomJS/Poltergeistでのファイルのダウンロードをサポートするチケットがあり、何らかの形で機能したと主張するフォークが1つか2つあります。 https://github.com/ariya/phantomjs/issues/10052 を参照してください

2
wojtha