2009-07-24 13 views
71

¿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).Acceso al diálogo de descarga de archivos en Firefox

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

+3

me acaba de pasar la mejor parte de tres semanas de configurar mi propio servidor privado virtual Apache por primera vez (porque es un poco complicado correr selenio en alojamiento compartido), consiguiendo Firefox, Selenium y Python trabajan juntos, escribiendo el código de Python real para recorrer un sitio muy cargado 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. –

+0

AppleScript sería genial para eso, si Firefox tuviera un diccionario AppleScript decente. –

+0

¿Puede alguien ayudarme [Pregunta en este sitio web] [1] [1]: http://stackoverflow.com/questions/27058053/selenium-python-webdriver-path-error-system- cant-find-the-path-specified –

Respuesta

26

No es que yo sepa. Pero puede configurar Firefox al automatically start the download and save the file en un lugar específico. Su prueba podría verificar que el archivo realmente haya llegado.

+0

Ok, creo que voy a ir con esta solución. –

+1

Pero selenio lanzará Firefox en el perfil predeterminado (ya que no se especifica ningún perfil) así que cada vez que lo configure. En lugar de crear un nuevo perfil con tus preferencias, es más fácil. –

3

No lo sé, pero quizás podría verificar el origen de uno de los complementos de descarga de Firefox.

Aquí está la fuente para una que uso Download Statusbar.

+0

Gracias, eso es muy interesante (pero prueba que es imposible o increíblemente difícil a menos que esté escribiendo una extensión con partes xul). –

0

No he entendido su objetivo, ¿Desea que su prueba descargue automáticamente el archivo cuando se ejecuta la prueba, si es así, entonces necesita utilizar un perfil de Firefox personalizado en la ejecución de la prueba.

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

34

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

Por supuesto, esto era Java, 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 fue un archivo CSV. Pero cuando se necesita más, no se almacenan en la ~/.mozilla/$USER_PROFILE/mimeTypes.rdf

+2

He intentado esto, pero parece que no funciona para mí. El diálogo de guardar archivo aún aparece. – erjoalgo

+0

Gracias, la última preferencia fue clutch: "application/pdf" – user2426679

+0

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-> application/pdf, application/x-pdf) – Yatin

68

tengo una solución para este problema, compruebe 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"); 
+1

Close, pero no funciona 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 ser el nombre del valor cambiado, 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 utilizado-> application/pdf, application/x-pdf) – Yatin

6

aplicaciones web generan 3 tipos diferentes de pop-ups; 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 se generan mediante 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 los archivos emergentes del navegador y descargar archivos se hace haciendo uso de los perfiles del navegador; Hay dos maneras de hacer esto:

  • implican manualmente los cambios en las propiedades del navegador (o)
  • propiedades del examinador de usar el perfil setPreference

Método1

Antes de empezar a trabajar con el pop -ups en los perfiles del navegador, asegúrese de que las opciones de descarga estén configuradas por defecto en Guardar archivo.

(Abre Firefox) Herramientas> Opciones> Aplicaciones

enter image description here

metodo2

hacer uso del siguiente fragmento de código y hacer cambios 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); 
2

La mayoría de los navegadores (en el caso mío 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); 
2

En lugar de desencadenar el cuadro de diálogo de descarga de archivos nativo de este modo:

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

que suelo hacer esto en su lugar, para omitir el cuadro de diálogo 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 sólo requiere que implemente el método que utiliza Apache getFileFromURL HttpClient para descargar un archivo y devolver una referencia de archivo para usted.

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

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

5

Estaba enfrentando el mismo problema. En la solicitud de la instancia de Firefox fue creado por pasar los DesiredCapabilities de la siguiente manera

driver = new FirefoxDriver(capabilities); 

Sobre la base de las sugerencias de los demás, hice mis cambios como

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

Esto sirvió el propósito, pero por desgracia mi otra las pruebas de automatización comenzaron a fallar. Y el motivo fue que eliminé las capacidades que se habían aprobado anteriormente.

Algunos navegadores más en la red y encontraron una manera alternativa. Podemos configurar el perfil en las capacidades deseadas.

Así que el nuevo código de trabajo se parece a

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

Además se puede añadir

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

Para eliminar la lista de archivos descargados que consigue muestra por defecto y cubre parte de la página web.

Mis ajustes totales son:

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

Hola, Neil Ellis, Al hacer clic en el botón de la imagen, "Exportar" abre una ventana emergente. La descarga de archivos se desencadena desde la ventana emergente y la ventana emergente se cierra. Si es posible, guíenme para lograr la descarga silenciosa de archivos en este escenario. – AVA

3

que tenían el mismo problema, quería ningún acceso de Save Diálogo.

A continuación código puede ayudar a:

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, es necesario especificar content types.

Se pueden especificar varios tipos de contenido separados '; '

por ejemplo:

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