trustedinstaller - Descargar el archivo a una carpeta específica usando el controlador Capybara y Poltergeist
trustedinstaller windows 7 (4)
Esto no es posible actualmente con Poltergeist.
Creo que sería mejor que escribieras una prueba para este CSV que no usa Capybara. (Por ejemplo, mediante el uso de la función de pruebas de integración de Rails incorporada y el análisis de la respuesta como un CSV).
Estoy escribiendo mis pruebas de aceptación usando Capybara y Poltergeist driver. Necesito validar el contenido del archivo CSV descargado.
- Probé varias formas de mostrar el contenido en la página en lugar de descargarlo.
- También intenté cambiar los tipos mime, pero no está funcionando.
Finalmente, quiero establecerme con la opción de descargar el archivo en una carpeta específica y luego leer el archivo CSV usando las bibliotecas del núcleo Ruby.
Para lograr esto, cuando el controlador de Poltergeist haga clic en el enlace de descarga, quiero que maneje la ventana emergente y descargue el archivo directamente en la carpeta dada.
En los controladores de Chrome y Firefox de Selenium, tengo la opción de configurar perfiles para manejar ventanas emergentes y configurar el directorio de descarga.
¿Existe alguna opción de este tipo utilizando poltergeist? Cualquier información será útil.
Hay un ticket para admitir la descarga de archivos en PhantomJS / Poltergeist y hay una o dos bifurcaciones que afirman que lo hicieron para funcionar de alguna manera. Ver https://github.com/ariya/phantomjs/issues/10052
He tenido que hacer cosas similares en mi aplicación de rieles. Mi solución es usar Javascript para realizar una solicitud XMLHttpRequest a la URL, descargar el archivo, devolver el contenido del archivo a Capybara y usar ruby para guardar el archivo en algún lugar del disco. Luego, en otro paso, reviso el contenido del archivo CSV descargado.
Aquí está la definición del paso para descargar el archivo:
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
Cambie la URL en el código de Javascript a la ubicación de su CSV.
Y finalmente, aquí está mi definición de paso para validar el contenido del archivo 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
Buena suerte. Espero que esto ayude.
No es posible con Poltergeist, solo puede verificar los encabezados.
step ''I should get zipped file'' do
page.response_headers[''Content-Disposition''].should include("filename=/"file.zip/"")
end
Pero es posible con el controlador Chrome y también con las versiones recientes de Firefox y Selenium Webdriver. Desafortunadamente, se ejecuta a través de Selenium, es decir, sin cabeza ... Consulte este artículo: http://collectiveidea.com/blog/archives/2012/01/27/testing-file-downloads-with-capybara-and-chromedriver/
Mi enfoque, ligeramente diferente mientras trabajo con Spinach y Rubyzip:
Agregue lo siguiente a su Gemfile
group :test do
gem ''chromedriver-helper'' # for Chrome <= 28
gem ''chromedriver2-helper'' # for Chrome >= 29
gem ''selenium-webdriver''
end
features / support / capybara.rb - Estoy usando Poltergeist para escenarios con la etiqueta @javascript
y Chrome para escenarios con la etiqueta @download
.
require ''spinach/capybara''
require ''capybara/poltergeist''
require ''selenium/webdriver''
# ChromeDriver 1.x, for Chrome <= 28
Capybara.register_driver :chrome do |app|
profile = Selenium::WebDriver::Chrome::Profile.new
profile[''download.default_directory''] = DownloadHelper::PATH.to_s
args = ["--window-size=1024,768"]
Capybara::Selenium::Driver.new(app, browser: :chrome, profile: profile, args: args)
end
# ChromeDriver 2.x, for Chrome >= 29
Capybara.register_driver :chrome do |app|
prefs = {
download: {
prompt_for_download: false,
default_directory: DownloadHelper::PATH.to_s
}
}
args = [''--window-size=1024,768'']
Capybara::Selenium::Driver.new(app, browser: :chrome, prefs: prefs, args: args)
end
# Tested with Firefox 27 and Selenium Webdriver 2.39
Capybara.register_driver :firefox do |app|
profile = Selenium::WebDriver::Firefox::Profile.new
profile[''browser.download.dir''] = DownloadHelper::PATH.to_s
profile[''browser.download.folderList''] = 2 # 2 - save to user defined location
profile[''browser.helperApps.neverAsk.saveToDisk''] = ''application/zip''
Capybara::Selenium::Driver.new(app, browser: :firefox, profile: profile)
end
Capybara.javascript_driver = :poltergeist # :webkit :selenium :poltergeist :chrome
Spinach.hooks.on_tag("javascript") do
Capybara.current_driver = Capybara.javascript_driver
Capybara.default_wait_time = 5
end
Spinach.hooks.on_tag("download") do
Capybara.current_driver = :chrome # or :firefox
Capybara.default_wait_time = 50
end
características / soporte / descargas.rb
module DownloadHelper
TIMEOUT = 10
PATH = Rails.root.join("tmp/downloads")
extend self
def downloads
Dir[PATH.join("*")]
end
def download_path
wait_for_download
downloads.first
end
def download_content
wait_for_download
File.read(download_path)
end
def wait_for_download
Timeout.timeout(TIMEOUT) do
sleep 0.1 until downloaded?
end
end
def downloaded?
downloads.any? && !downloading?
end
def downloading?
downloads.grep(//.crdownload$/).any?
end
def clear_downloads
FileUtils.rm_f(downloads)
end
end
Spinach.hooks.before_scenario do |scenario|
DownloadHelper.clear_downloads
end
Spinach.hooks.after_scenario do
DownloadHelper.clear_downloads
end
características / file_download.feature
Feature: File download
As a user
I want to be able to download my files
Background:
Given I am logged in as a user
And I have uploaded files in the system
@download
Scenario: Successfull download
When I click on the download button
Then I should get zipped files
features / steps / file_download.rb - Tenga en cuenta que no puede usar page.response_headers
ya que no es compatible con Selenium / ChromeDriver. Pero puede verificar el nombre del archivo descargado usando File.basename()
.
class Spinach::Features::FileDownload < Spinach::FeatureSteps
include SharedAuthentication
step ''I click on the download button'' do
click_link "Download"
end
step ''I should get zipped files'' do
File.basename(DownloadHelper.download_path).should == ''file.zip''
Zip::ZipFile.open(DownloadHelper.download_path) do |zipfile|
zipfile.find_entry(''myfile.txt'').should_not be_nil
zipfile.find_entry(''myphoto.jpg'').should_not be_nil
end
end
end