Acceso al cuadro de diálogo de descarga de archivos en Firefox

83

¿Existe algún tipo de API que pueda permitirme manipular un cuadro de diálogo de descarga de archivos en Firefox? (Quiero acceder al que aparece cuando el usuario hace algo, no iniciar uno yo mismo).

Lo que quiero hacer es acceder a este cuadro de diálogo desde Selenium (y tampoco estoy seguro de si el "modo privilegiado" de Selenium es suficiente para acceder a la interfaz de Chrome).

Andrey Shchekin
fuente
3
Acabo de pasar la mayor parte de las tres semanas configurando mi propio servidor privado virtual Apache por primera vez (porque es un poco complicado ejecutar Selenium en un alojamiento compartido), consiguiendo que Firefox, Selenium y Python trabajen juntos, escribiendo código Python real a paso a través de un sitio muy pesado de JavaScript, todo para descargar un archivo al final. Entonces me di cuenta de que no tenía idea de cómo acceder realmente al archivo descargado. Estoy muy contento de que hayas hecho la pregunta primero.
Paul D. Waite
AppleScript sería genial para eso, si Firefox tuviera un diccionario AppleScript decente.
Nicolas Barbulesco
¿Alguien me puede ayudar [Pregunta en este sitio web] [1] [1]: stackoverflow.com/questions/27058053/…
Yevgeniy Semashko

Respuestas:

33

No que yo sepa. Pero puede configurar Firefox para que inicie automáticamente la descarga y guarde el archivo en un lugar específico. Su prueba podría verificar que el archivo realmente llegó.

Aaron Digulla
fuente
Ok, creo que iré con esta solución.
Andrey Shchekin
1
Pero selenium lanzará Firefox en el perfil predeterminado (ya que no se especifica ningún perfil), así que cada vez que lo configure. En lugar de eso, crea un nuevo perfil con tus preferencias para que sea más fácil.
Vignesh Dhamodaran
71

Tengo una solución para este problema, verifique el código:

FirefoxProfile firefoxProfile = new FirefoxProfile();

firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir","c:\\downloads");
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

WebDriver driver = new FirefoxDriver(firefoxProfile);//new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);

driver.navigate().to("http://www.myfile.com/hey.csv");
dlopezgonzalez
fuente
1
Cerca, pero no funciona del todo para Firefox en Ubuntu 12.04 a partir del 17/8/2013. Cambie el valor de la propiedad "browser.helperApps.neverAsk.saveToDisk" a "text / csv, application / vnd.ms-excel" y funcionará en Ubuntu.
bakoyaro
2
Puede haber cambiado el nombre del valor, esto es desde hace más de un año.
dlopezgonzalez
1
Estoy usando el mismo método para guardar automáticamente el archivo, pero no funciona. Mi versión de Firefox es 20.0. Y estoy tratando de descargar archivos pdf (tipo MIME usado-> aplicación / pdf, aplicación / x-pdf)
Yatin
3
No es que esto no funcione Content-Disposition: attachment. ¡Firefox siempre parece mostrar un cuadro de diálogo en este caso!
Martin Höller
para descargar archivos xls en linux, esto funcionó para mí:setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
donfuxx
42

Me quedé atrapado con el mismo problema, pero encontré una solución. Lo hice de la misma manera que lo hizo este blog .

Por supuesto, esto era Java, lo he traducido a Python:

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir",getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv")

browser = webdriver.Firefox(firefox_profile=fp)

En mi ejemplo, era un archivo CSV. Pero cuando necesita más, se almacenan en el~/.mozilla/$USER_PROFILE/mimeTypes.rdf

Akendo
fuente
3
He intentado esto, pero no parece funcionar para mí. El cuadro de diálogo para guardar el archivo sigue apareciendo.
ealfonso
1
Gracias, la última preferencia fue clutch: "application / pdf"
user2426679
1
Estoy usando el mismo método para guardar automáticamente el archivo, pero no funciona. Mi versión de Firefox es 20.0. Y estoy tratando de descargar archivos pdf (tipo MIME usado-> aplicación / pdf, aplicación / x-pdf)
Yatin
1
Gracias @Akendo. Esto me funciona usando python 3.4.3, selenium-2.52 y Firefox 44.
Igor
8

Las aplicaciones web generan 3 tipos diferentes de ventanas emergentes; a saber,

 1| JavaScript PopUps
 2| Browser PopUps
 3| Native OS PopUps [e.g., Windows Popup like Upload/Download]

En general, las ventanas emergentes de JavaScript son generadas por el código de la aplicación web. Selenium proporciona una API para manejar estas ventanas emergentes de JavaScript, como Alert.

Finalmente, la forma más sencilla de ignorar la ventana emergente del navegador y descargar archivos es haciendo uso de los perfiles del navegador; Hay dos formas de hacer esto:

  • Involucrar manualmente cambios en las propiedades del navegador (o)
  • Personalizar las propiedades del navegador usando profile setPreference

Método 1

Antes de comenzar a trabajar con ventanas emergentes en los perfiles del navegador, asegúrese de que las opciones de descarga estén configuradas de forma predeterminada en Guardar archivo.

(Abra Firefox) Herramientas> Opciones> Aplicaciones

ingrese la descripción de la imagen aquí

Método2

Utilice el siguiente fragmento y realice modificaciones cuando sea necesario.

FirefoxProfile profile = new FirefoxProfile();

String path = "C:\\Test\\";
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", path);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
profile.setPreference("browser.download.manager.showWhenStarting", false);
profile.setPreference("browser.download.manager.focusWhenStarting", false);  
profile.setPreference("browser.download.useDownloadDir", true);
profile.setPreference("browser.helperApps.alwaysAsk.force", false);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.download.manager.closeWhenDone", true);
profile.setPreference("browser.download.manager.showAlertOnComplete", false);
profile.setPreference("browser.download.manager.useWindow", false);
profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false);
profile.setPreference("pdfjs.disabled", true);
       
driver = new FirefoxDriver(profile);
Prashanth Sams
fuente
4

Estaba enfrentando el mismo problema. En nuestra aplicación, la instancia de FireFox se creó pasando las capacidades deseadas de la siguiente manera

driver = new FirefoxDriver(capabilities);

Basado en las sugerencias de otros, hice mis cambios como

FirefoxProfile firefoxProfile = new FirefoxProfile();     
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");
driver = new FirefoxDrvier(firefoxProfile);

Esto sirvió para el propósito, pero desafortunadamente mis otras pruebas de automatización comenzaron a fallar. Y la razón fue que eliminé las capacidades que se estaban pasando antes.

Un poco más navegando en la red y encontré una forma alternativa. Podemos establecer el perfil en sí en las Capacidades deseadas.

Entonces el nuevo código de trabajo parece

DesiredCapabilities capabilities = DesiredCapabilities.firefox();

// add more capabilities as per your need.
FirefoxProfile firefoxProfile = new FirefoxProfile();        
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");

// set the firefoxprofile as a capability
capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile);
driver = new FirefoxDriver(capabilities);
Sanjay Bharwani
fuente
3

No lo sé, pero quizás podrías comprobar la fuente de uno de los complementos de descarga de Firefox.

Aquí está la fuente de uno que uso Download Statusbar .

Nifle
fuente
Gracias, eso es muy interesante (pero demuestra que es imposible o increíblemente difícil a menos que esté escribiendo una extensión con partes xul).
Andrey Shchekin
3

La mayoría de los navegadores (en el mío, Firefox) seleccionan el botón Aceptar de forma predeterminada. Así que logré resolver esto usando el siguiente código. Básicamente, presiona Intro para usted y el archivo se descarga.

Robot robot = new Robot();

// A short pause, just to be sure that OK is selected
Thread.sleep(3000);

robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
shish
fuente
3

Tuve el mismo problema, no quería acceder a Save Dialogue.

El siguiente código puede ayudar:

    FirefoxProfile fp = new FirefoxProfile();
    fp.setPreference("browser.download.folderList",2);
    fp.setPreference("browser.download.manager.showWhenStarting",false);
    fp.setPreference("browser.helperApps.alwaysAsk.force", false);
    // Below you have to set the content-type of downloading file(I have set simple CSV file)
    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

Según el tipo de archivo que se está descargando, debe especificar los tipos de contenido.

Puede especificar varios tipos de contenido separados con ' ; '

p.ej:

    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");
Pratik Patel
fuente
2

En lugar de activar el cuadro de diálogo de descarga de archivos nativo así:

By DOWNLOAD_ANCHOR = By.partialLinkText("download");
driver.findElement(DOWNLOAD_ANCHOR).click();

En su lugar, suelo hacer esto para omitir el diálogo de descarga de archivos nativo. De esta forma funciona en TODOS los navegadores:

String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href");
File downloadedFile = getFileFromURL(downloadURL);

Esto solo requiere que implemente un método getFileFromURLque use Apache HttpClient para descargar un archivo y devolverle una referencia de archivo.

De manera similar, si está usando Selenide , funciona de la misma manera usando la download()función incorporada para manejar descargas de archivos.

djangofan
fuente
Eso funcionará solo para archivos vinculados estáticamente en el html, por ejemplo, no un archivo que se genere a partir de una solicitud de publicación (o similar).
Todor Minakov
Sí, el kilometraje puede variar. Por lo general, podrá trabajar con sus desarrolladores para resolver algo en esos casos marginales.
djangofan
0

No he entendido su objetivo. ¿Quería que su prueba se descargara automáticamente el archivo cuando se ejecuta la prueba?

En el perfil personalizado, por primera vez ejecute la prueba manualmente y si aparece el cuadro de diálogo de descarga, configúrelo Guardarlo en el disco, también marque la casilla de verificación Realizar siempre esta acción, lo que garantizará que el archivo se descargue automáticamente la próxima vez que ejecute su prueba.


fuente
0

Además puedes agregar

      profile.setPreference("browser.download.panel.shown",false);

Para eliminar la lista de archivos descargados que se muestra de forma predeterminada y cubre parte de la página web.

Mi configuración total es:

        DesiredCapabilities dc = DesiredCapabilities.firefox();
        dc.merge(capabillities);
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setPreference("browser.download.folderList", 4);
        profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath());
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        profile.setPreference("browser.download.manager.focusWhenStarting", false);
        profile.setPreference("browser.download.useDownloadDir", true);
        profile.setPreference("browser.helperApps.alwaysAsk.force", false);
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.download.manager.closeWhenDone", true);
        profile.setPreference("browser.download.manager.showAlertOnComplete", false);
        profile.setPreference("browser.download.manager.useWindow", false);
        profile.setPreference("browser.download.panel.shown",false);
        dc.setCapability(FirefoxDriver.PROFILE, profile);
        this.driver = new FirefoxDriver(dc);
Neil Ellis
fuente
1
Hola Neil Ellis, Al hacer clic en el botón de imagen, "Exportar" abre una ventana emergente. La descarga de archivos se activa desde la ventana emergente y la ventana emergente se cierra. Si es posible, guíeme para lograr la descarga silenciosa de archivos en este escenario.
AVA