2012-01-11 44 views
9

Estoy usando Watir-Webdriver con Firefox y el método recomendado en el sitio watirwebdriver.com para automatizar las descargas de archivos. Esto implica configurar FireFox sobre: ​​parámetros de configuración para desactivar el diálogo de descarga en Firefox para tipos de archivos específicos. Esto funciona bien, pero ahora estoy tratando de encontrar la mejor manera de determinar cuándo se ha completado la descarga del archivo (algunos tardan unos segundos, otros tardan unos minutos) para que pueda cerrar la sesión del sitio y pasar a la siguiente prueba. Parece que debido a que no quedan pistas visuales en el navegador, puedo tener que supervisar el archivo en el directorio de descargas. Cualquier opción sería apreciada.Watir-Webdriver Espere a que descargue la descarga

Respuesta

2

Quizás pueda hacer un seguimiento del tamaño del archivo para ver cuándo deja de cambiar durante unos segundos.

+0

Esa es prácticamente la única solución que he encontrado. No es muy satisfactorio porque tengo que rastrear el archivo dado cómo Firefox maneja una descarga. Funciona pero no es portátil cuando se controla un navegador diferente. – user1142012

+0

También puede tener problemas cuando tiene una conexión de red no estable. – encoded

1

Tengo un enfoque un poco diferente para la automatización de descargas de archivos. lo hago de esta manera:

Los requiures:

require 'rubygems' 
require 'watir-webdriver' 
require 'win32ole' 

En primer lugar crear un método para el manejo Tamaño del archivo:

def fileinfo(name) 
     if File.exists?(name) 
       print "#{name} exists " 
       bytes = File.size(name) 
       print "and is #{bytes} in size;" 
       whenm = File.mtime(name) 
       print whenm,";" 
       print whenm.to_i,";" 
     else 
       print "#{name} does NOT exist;" 
     end 
end 

coche En segundo lugar cromo con pre puesta a punto de descargar dir:

download_directory = "#{Dir.pwd}/downloads" 
download_directory.gsub!("/", "\\") if Selenium::WebDriver::Platform.windows? 
profile = Selenium::WebDriver::Chrome::Profile.new 
profile['download.prompt_for_download'] = false 
profile['download.default_directory'] = download_directory 

A continuación, elimine el archivo (de las ejecuciones anteriores) para el caso de prueba la reutilización y el validness (uno de 3):

%x(DEL /Q C:\\automation\\qa\\downloads\\*.exe) 
%x(DEL /Q downloads\\*.exe) 
%x(DEL /Q downloads\\*.*) 

definir la variable tamaño del componente descargado:

contains = Dir.new(download_directory).entries 
dlc = contains[2] 
dcinfo = fileinfo("downloads/"+dlc) 
dlcsize = File.size("downloads/"+dlc) 

Y por último hay que poner el punto de validación:

if dlcsize > 0 
     puts "File found and is #{dlcsize} bytes." 
       logfile = open("test_results.csv", "a") 
       begin 
        logRow = "#{__FILE__}" 
        logfile.puts logRow + "," + "Passed".to_s 
       end 
    else 
     puts "Test Failed! File not found either is zero." 
      logfile = open("test_results.csv", "a") 
       begin 
        logRow = "#{__FILE__}" 
        logfile.puts logRow + "," + "Passed".to_s 
       end 
end 
2

No me gustó simplemente mirar el tamaño del archivo, se sentía frágil, así que terminé usando el comando lsof para detectar cuando no hay procesos que mantienen el archivo abierto, y luego leer el archivo. Es mejor que una pausa en la descarga debido a problemas de la red no cause errores intermitentes, pero peor (?) En cuanto a que no es portátil y se desvanece al comando lsof.

El código se veía algo como esto: descargas

# Watch the download dir for new files, and read the first new file that 
# appears. 
def read_newest_download 
    existing_files = list_files_in_download_dir 
    new_files = [] 

    Timeout::timeout(DOWNLOAD_TIMEOUT) do 
    while (new_files = list_files_in_download_dir - existing_files).empty? 
     sleep 0.25 
    end 
    end 

    if 1 == new_files.size 
    wait_for_file_to_be_closed(new_files.first) 
    File.read(new_files.first) 
    else 
    fail "Found #{new_files.size} new files." 
    end 
end 

# Ignore files ending in .part, which is common for temp files in Firefox. 
def list_files_in_download_dir 
    raise ArgumentError, "No download dir specified" unless @opts[:download_dir] 
    @_download_glob ||= File.join(@opts[:download_dir], "*") 

    # Ignore files ending in .part as they're temporary files from Firefox. 
    Dir[@_download_glob].entries.reject {|e| /\.part$/ === e} 
end 

def wait_for_file_to_be_closed(filename) 
    begin 
    sleep 0.25 
    end until `lsof #{filename}`.blank? 
end 
2

que almacena Chrome no completadas con una extensión añadido .crdownload archivo. Compruebe si el directorio de descarga tiene un archivo que termina en .crdownload y que usted debe saber si una descarga está todavía en curso

0

La forma en que manejar esto, es el siguiente

Firefox Descargar archivos terminan con .part

tienen todos los nombres de los archivos descargados en una lista después de agregarlos ".parte" a ellos mantener el bucle en esa lista y comprobar si alguno de esos archivos todavía existen en el lsdir de la carpeta de descargas de código

Python:

import os 
import time 

def wait_till_download(): 
    if len(new_part_files) > 0: 
     time.sleep(1) 
     for part_file in new_part_files: 
      if part_file in os.listdir("."): 
       print "Downloading..." 
       wait_till_download() 

nota: cuando no hay archivos de piezas . en os.listdir('.'), eso significa que la descarga está terminado

1

que tenía una tarea similar en lo que quería extraer el contenido de un archivo PDF descargado solía siguiente solución:

t = '' 
(0..19).each do 
    sleep 5 
    t = `pdftotext -raw some_directory/*.pdf -` 
    break if $?.success? 
end 

Hace 20 intentos para extraer el texto usando el comando de shell pdftotext y saldrá del bloque si el comando de shell fue exitoso. La ventaja de hacerlo de esta manera es que si el archivo no existe o si el archivo se descarga parcialmente, generará un error y luego volverá a intentarlo. Si su archivo no es un PDF o si no le interesan los contenidos, utiliza otro comando de shell en lugar de pdftotext, siempre que genere un error si el archivo está incompleto.

Cuestiones relacionadas