2012-07-23 27 views
5

Me pregunto si hay una solución de C# o selenio a lo siguiente:cómo hacer clic automáticamente en "¿Quieres abrir o guardar?"

enter image description here

estoy usando selenio para descargar un archivo de un servidor web.

desafortunadamente en IE9 no hay manera de deshabilitar esta pantalla emergente.

¿hay alguna solución en C# para hacer clic en el botón GUARDAR?

+0

archivo zip se descargará automáticamente si está de acuerdo con comprimir el archivo csv. – BumbleB2na

+0

no tengo control sobre el formato –

+0

tal vez esto ayude: http://blog.codecentric.de/en/2010/07/file-downloads-with-selenium-mission-impossible/ – BumbleB2na

Respuesta

3

cliente

WebClient client = new WebClient(); 
byte[] file = client.DownloadData("http://domain.com/default.aspx"); 
File.WriteAllBytes("helloworld.txt", file); 

servidor

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     using (MemoryStream memory = new MemoryStream()) 
     using (StreamWriter writer = new StreamWriter(memory)) 
     { 
      // The bytes written can be anything, does not have to be text 
      writer.WriteLine("hello, world"); 
      writer.Flush(); 
      Response.BinaryWrite(memory.ToArray()); 
     } 

     Response.AddHeader("Content-Disposition", "Attachment; filename=helloworld.txt"); 
     Response.AddHeader("Content-Type", "application/octet-stream"); 
     Response.End(); 
    } 
} 

Como se puede ver con el ejemplo anterior, no sólo yo no sé la ubicación física del archivo, pero no hay una ubicación física! Es algo que acabo de escribir en la memoria y luego escribí los bytes en bruto en la respuesta, pero WebClient.DownloadData() aún podrá descargar los bytes de todos modos. No importa de dónde vienen los bytes. Espero que esto ayude.


Información adicional:

Parte de la información antecedente adicional que explica además por qué las obras anteriores.

El trabajo principal de un navegador es enviar solicitudes HTTP y gestionar la respuesta. Afortunadamente, manejan mucho del trabajo pesado para nosotros. Mostrar una página web simple implica enviar un HTTP-GET al servidor y recibir bytes en el cuerpo de la respuesta, decodificar esos bytes en texto y analizar ese texto para representar una página web HTML. Sabe manejar la respuesta de esa manera porque tiene un encabezado Content-Type de Texto/HTML. Si bien esto es lo que hace la mayor parte del tiempo, los navegadores también pueden manejar otros tipos MIME, si Content-Type es text/plain decodificará los bytes y simplemente los mostrará sin intentar analizarlos. El texto/XML generalmente le permitirá colapsar y expandir nodos XML, etc. De nuevo, todo depende de cómo esté programado el navegador para manejar ese tipo de partícula MIME.

Cuando obtiene un cuadro de diálogo Guardar como en un navegador, esa es simplemente la manera en que el navegador maneja una respuesta con un encabezado de disposición de contenido: archivo adjunto. Este encabezado le dice al navegador que no intente renderizar o mostrar el contenido, sino que lo descargue como un archivo adjunto.

Cuando utiliza las clases WebClient/HttpWebRequest, básicamente está escribiendo su propio navegador en miniatura, sin embargo, la implementación de cómo se manejan los tipos MIME/encabezados HTTP depende exclusivamente de usted. Y esto puede permitirle guardar los bytes de una respuesta de disposición de contenido (o cualquier respuesta para ese asunto) sin preguntar con un cuadro de diálogo Abrir o Guardar.

+0

gracias pero no puedo hacer esto porque el archivo es generado automáticamente por el servidor web, no hay un enlace explícito al mismo –

+0

Independientemente de si es un enlace directo, o una respuesta generada, el servidor web está escribiendo bytes sin procesar a la respuesta, aún debería poder descargar esos bytes como un byte [] y guardarlos en un archivo. – Despertar

+0

seguro, pero ¿cómo puedo averiguar cuál es la URL del archivo? no hay una URL explícita –

Cuestiones relacionadas