JavaScript - Descarga masiva

   
Vista:
Imágen de perfil de Juan Carlos

Descarga masiva

Publicado por Juan Carlos (3 intervenciones) el 08/01/2015 21:06:57
Buen día a todos, antes que nada me presento, mi nombre es Juan Carlos y soy desarrollador desde hace poco tiempo, me he dedicado a visual basic pero por necesidades de actualización estoy aprendiendo Java Script.

El problema que tengo es el siguiente:

Hay una página en la cual existe un grid (matriz, grilla) con un número dinámico de registros (ésto depende de la consulta que se haga), dentro de ésta hay una liga de descarga para un documento por cada registro.

Ya tengo la manera de recorrer la página y saber cuántos registros hay, todo desde Java Script y un navegador en Visual Studio .Net.

El problema es que necesito un botón que me permita hacer una descarga masiva de tales documentos, intenté hacer un for dentro del script de java pero sólo me descarga el último registro, las dudas que tengo son:

¿Cómo le hago para ir descargando cada documento (un ciclo for es mi idea)?
¿Cómo indico la ruta de descarga?
¿Es posible hacer una descarga en background o segundo plano?

Les adjunto el código que tengo (Dentro de un botón que me permite ejecutar código de JavaScript en Visual Studio.Net):

1
2
3
4
5
6
var nouEvent = document.createEvent("MouseEvents");
nouEvent.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
var listado = document.getElementById("masivapg0");//Obtengo el nombre del grid
contenedores = listado.getElementsByClassName("BtnDescarga");//Busco todas las ligas de descarga
numContenedores = contenedores.length; //Aquí obtengo el número de registros
contenedores[0].click(); //A través de esto puedo simular un clic en el registro que desee pero es en donde necesito meter el for para descargar todos los documentos

De antemano muchas gracias y ojalá alguien pueda ayudarme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Descarga masiva

Publicado por xve (1596 intervenciones) el 09/01/2015 08:00:48
Hola Juan Carlos, por lo que nos muestras, entiendo que tienes que hacer un bucle por todos los contenedores... algo así:

1
2
3
for (var i=0; i<contenedores.length; i++) {
    contenedores[i].click();
}

Este código te realizaría click en todos los contenedores.

Es esto lo que necesitas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos

Descarga masiva

Publicado por Juan Carlos (3 intervenciones) el 09/01/2015 17:12:09
Hola xve, gracias por la respuesta, efectivamente es algo como lo que necesito, lo acabo de probar pero el problema es que la descarga sólo se me ejecuta en el último registro, todos los anteriores es como si no ejecutara el "clic" ¿Crees que el problema esté en el objeto navegador que estoy ocupando?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Descarga masiva

Publicado por xve (1596 intervenciones) el 10/01/2015 01:16:48
Exactamente que hace el click? ya que si envía un formulario, puede ser que únicamente envié el ultimo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos

Descarga masiva

Publicado por Juan Carlos (3 intervenciones) el 11/01/2015 03:33:35
Muchas gracias por la ayuda, creo que ya vi el problema... Al momento de hacer click el código sigue ejecutándose sin detenerse en la ventana de diálogo para descargar el archivo, sólo en la última iteración se muestra tal ventana.

Ahora, ya encontré más o menos la manera de solucionarlo, te explico y luego te pongo mis dudas:

El botón tiene, en su evento "onclick", una llamada a una función mas o menos así... Return Descargar(Obtienen.aspx parte_de_la_url_del_archivo, Recuperar)
Yo ya tengo la dirección en donde está alojado el archivo y la función regresa la carpeta y nombre del mismo.

Ahora, dentro del objeto navegador que tengo en mi proyecto de visual basic, puedo ejecutar una instrucción de JavaScript y obtener el valor de una variable directamente de ese código, el único problema es que debe ser de tipo "primitivo", es decir, entero, cadena, booleano, etc., y para obtener la parte de la url que me falta lo necesito tomar de la función "onclick", lo hago de la siguiente manera... var url = contenedor[0].onclick pero no me regresa un valor del tipo que necesito, string, ¿Como puedo tomar el valor de un evento y volverlo texto?

Las opciones que ya intenté y no sirvieron son...

Var url = ToString(contenedor[0].onclick);

Var url = ToString(contenedor[0].onclick);
url = ToString(url);

Espero no ser tan complicado en mi explicación, y nuevamente muchas gracias por el apoyo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Descarga masiva

Publicado por Gerardo Garcia gerar2ac517@me.com (2 intervenciones) el 23/11/2015 19:04:46
Ya pudiste descargar las facturas de los enlaces generados en tu matriz de datos?

Porque yo ya consegui capturar los enlaces de todos los CFDIs en una matriz.
Si copio uno de esos enlaces en un navegador como Safari, Opera o Firefox , se abre la pagina de login donde se te pide identificarte(RFC y CIEC).
Hecho esto se se descarga normalmente el XML.

Mi problema es al querer descargarlo en código. Me descarga un archivo de texto con un enlace que dice "Object Moved to" y manda a un enlace 404

No se si tu hayas encontrado una respuesta.


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Descarga masiva

Publicado por Gerardo Garcia (2 intervenciones) el 30/12/2015 02:53:35
Eso pasa porque no es una descarga simple. Requieres hacer una descarga a través de un webclient, al cual en los parámetros de request header deberás capturar los valores de la cookie. Echó esto podrás descargar tantas cono quieras
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Descarga masiva

Publicado por William Colón (1 intervención) el 30/12/2015 03:13:21
Ya pude manipular los controles de la página como mucha gente del foro lo hace con Selenium webdriver, pero yo utilize puro Javascript. Valiendome de GetElementbyId, setattribute para quitarle el estilo CSS que oculta los controles originales de la pagina. Para poder iterar sobre cada ítem de los controles select

Ahora hago lo siguiente. Evaluó el rotulo q dice: La Consulta solo representa los primeros 500.

Si el rotulo aparece, entonces selecciono el día uno de ese mes, acto seguido presiono el botón buscar. Con .click()
Así emulo el click con código. Y obtengo solo las facturas del dia primero de ese mes.

Y tengo ya mi procedimiento para descargar la rejilla, pero el problema es q al dar clic en buscar ejecuta muy rapido el codigo y llama a mi procedimiento de descarga. Y descarga mi consulta anterior.

Yo lo q quisiera es esperar a q desaparezca el rotulo de "Espere" y cuando detecte q ya se quitó, ahora si llamar ami procedimiento de descarga. O no se ustedes como lo resuelven?
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Descarga masiva

Publicado por Wiliam Colon of.central@mg7construccion.net (1 intervención) el 14/01/2016 19:52:08
Ya estuve viendo que en el foro de VB Net usan ctl00_MainContent_UpdateProgress1 y utilizan sus atributos CSS para saber cuando desaparezca el logotipo de "Espere un momento" mientras se está haciendo la consulta.


Cuando el control ctl00_MainContent_UpdateProgress1 está en reposo, o ya finalizó la consulta su estado es: display: none
y cuando se está efectuando la búsqueda es: width: 45px


La cuestión es que veo que usan un While, para evaluar que mientras sea distinto a width:45px el valor sea distinto, yo no logro o no lo comprendo como llevarlo a cabo en Javascript.

También se me ocurrió hace un For desde 1 hasta 20,000 y por cada vez que ejecute el bucle, consultar si el Atributo de "ctl00_MainContent_UpdateProgress1" ha cambiado y cuando cambie,entonces poder seguir.


No se si estoy en lo correcto,o ustedes como lo manejan?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar