Acceso al diálogo de descarga de archivos en Firefox

¿Existe algún tipo de API que me permita manipular un 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 diálogo desde Selenium (y si el “modo privilegiado” de Selenium es suficiente para acceder a la interfaz de Chrome es algo de lo que tampoco estoy seguro).

    No que yo sepa. Pero puede configurar Firefox para iniciar automáticamente la descarga y guardar el archivo en un lugar específico. Su prueba podría verificar que el archivo realmente haya llegado.

    Tengo una solución para este problema, revisa 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"); 

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

    Por supuesto, esto fue 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 ~/.mozilla/$USER_PROFILE/mimeTypes.rdf

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

      1| JavaScript PopUps 2| Browser PopUps 3| Native OS PopUps [eg, 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 .

    Eventualmente, la manera más simple de ignorar el navegador emergente y descargar archivos se hace haciendo uso de los perfiles del navegador; Hay dos maneras de hacer esto:

    • Involucre manualmente cambios en las propiedades del navegador (o)
    • Personalice las propiedades del navegador utilizando el perfil 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 manera predeterminada en Guardar archivo.

    (Abre Firefox) Herramientas> Opciones> Aplicaciones

    enter image description here

    Método2

    Utilice el siguiente fragmento y realice ediciones siempre que 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); 

    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); 

    En base a 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 cumplió el propósito, pero desafortunadamente mis otras pruebas de automatización comenzaron a fallar. Y el motivo fue que eliminé las capacidades que se habían aprobado anteriormente.

    Algunos navegan más en la red y encuentran una forma alternativa. Podemos configurar el perfil en las capacidades deseadas.

    Entonces el nuevo código de trabajo se ve como

     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); 

    No lo sé, pero tal vez puedas consultar el origen de uno de los complementos de descarga de Firefox.

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

    Tuve el mismo problema, no quería acceso 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"); 

    De acuerdo con el tipo de archivo que se está descargando, debe especificar los tipos de contenido.

    Puede especificar múltiples tipos de contenido separados por ‘ ;

    p.ej:

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

    La mayoría de los navegadores (en mi caso, Firefox) seleccionan el botón OK por defecto. Así que logré resolver esto usando el siguiente código. Básicamente presiona ingresar 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); 

    En lugar de activar el diálogo de descarga de archivos nativo de la siguiente manera:

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

    Por lo general, hago esto, para eludir el diálogo de descarga de archivos nativo. De esta manera funciona en TODOS los navegadores:

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

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

    Del mismo modo, si está utilizando Selenide , funciona de la misma manera con la función de download() integrada download() para manejar las descargas de archivos.

    Hasta que Marionette sea ​​más madura, eso es lo que hago.

    No he entendido su objective. ¿Desea que su prueba descargue automáticamente el archivo cuando se ejecuta la prueba? En caso afirmativo, debe utilizar un perfil de Firefox personalizado en la ejecución de la prueba.

    En el perfil personalizado, por primera vez ejecute la prueba de forma manual y si aparece el diálogo de descarga, configúrelo Guardar en disco, también marque la casilla Activar siempre esta acción que asegurará que el archivo se descargue automáticamente la próxima vez que ejecute la prueba.

    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);