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
Quizás pueda hacer un seguimiento del tamaño del archivo para ver cuándo deja de cambiar durante unos segundos.
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
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
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
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
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.
- 1. Descargue la descarga de 'data: text/plain' URL
- 2. Espere a que [NSAlert beginSheetModalForWindow: ...];
- 3. Espere a que SwingWorker termine
- 4. Espere a que TinyMCE cargue
- 5. Espere a que QueueUserWorkItem complete
- 6. UIViewController impide que la vista se descargue
- 7. Evitar que IIS descargue el sitio ASP.Net
- 8. espere a que se conecte gdb
- 9. Espere a que se completen los subprocesos
- 10. ¿Cómo decirle a .hover() que espere?
- 11. Espere a que tomcat termine de iniciar
- 12. Espere a que el método finalice
- 13. Espere a que el código finalice la ejecución
- 14. Backbone: Espere a que la búsqueda múltiple continúe
- 15. Espere a que el método jquery .html finalice la representación
- 16. Espere a que se cargue la imagen antes de continuar
- 17. Espere a que finalice la llamada AJAX (POST)
- 18. Espere hasta que se cargue la función
- 19. Permitir que el usuario descargue archivos usando Ajax
- 20. Descargue PDF de descarga creado por TCPDF, después de la publicación de Ajax
- 21. Deje que el usuario descargue un archivo XML
- 22. Espere hasta que QWidget cierre
- 23. cómo decirle a gradle que descargue todos los archivos fuente
- 24. ¿Cómo forzar a FileSystemWatcher a esperar hasta que se descargue el archivo?
- 25. ¿Cómo consigo que Maven descargue la dependencia de javax.comm?
- 26. Evitando que Cassandra descargue archivos hprof
- 27. espere hasta que wifi se conecte a android
- 28. WebRat + Selenium WebDriver: espere a que se complete ajax
- 29. Espere a que termine un subproceso desconectado en C++
- 30. Inicio del proceso asincrónico y espere a que finalice
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
También puede tener problemas cuando tiene una conexión de red no estable. – encoded