web-dev-qa-db-fra.com

Accès à la boîte de dialogue de téléchargement de fichier dans Firefox

Existe-t-il un type d’API qui me permet de manipuler une boîte de dialogue de téléchargement de fichier dans Firefox?.

Ce que je veux faire, c'est accéder à cette boîte de dialogue à partir de Selenium (et je ne suis pas sûr que le "mode privilégié" de Selenium soit suffisant pour accéder à l'interface Chrome).

80
Andrey Shchekin

Pas que je sache de. Mais vous pouvez configurer Firefox pour démarrer automatiquement le téléchargement et enregistrer le fichier dans un emplacement spécifique. Votre test pourrait alors vérifier que le fichier est bien arrivé.

31
Aaron Digulla

J'ai une solution à ce problème, vérifiez le code:

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");
70
dlopezgonzalez

J'étais coincé avec le même problème, mais j'ai trouvé une solution. Je l'ai fait de la même manière que ce blog did. 

Bien sûr, c'était en Java, je l'ai traduit en 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)

Dans mon exemple, il s’agissait d’un fichier CSV. Mais quand vous avez besoin de plus, il y en a dans le ~/.mozilla/$USER_PROFILE/mimeTypes.rdf

38
Akendo

Les applications Web génèrent 3 types de pop-ups différents; à savoir,

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

En général, les pop-ups JavaScript sont générés par le code de l'application Web. Selenium fournit une API permettant de gérer ces fenêtres contextuelles JavaScript, telles que Alert.

Finalement, le moyen le plus simple d'ignorer les fichiers contextuels et les fichiers de téléchargement du navigateur consiste à utiliser les profils du navigateur. Il y a deux façons de faire cela:

  • Impliquer manuellement des modifications sur les propriétés du navigateur (ou)
  • Personnaliser les propriétés du navigateur à l'aide de profile setPreference

Méthode1

Avant de commencer à utiliser des fenêtres contextuelles dans les profils du navigateur, assurez-vous que les options de téléchargement sont définies par défaut sur Enregistrer le fichier.

(Ouvrir Firefox) Outils> Options> Applications

enter image description here

Méthode2

Utilisez l'extrait ci-dessous et effectuez les modifications chaque fois que nécessaire.

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);
6
Prashanth Sams

Je faisais face au même problème. Dans notre application, l’instance de FireFox a été créée en transmettant le DesiredCapabilities comme suit:

driver = new FirefoxDriver(capabilities);

Sur la base des suggestions d’autres personnes, j’ai fait mes changements en tant que 

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

Cela a servi à cela, mais malheureusement, mes autres tests d'automatisation ont commencé à échouer. Et la raison en est que j'ai supprimé les capacités qui étaient en train d'être passées plus tôt.

Un peu plus de navigation sur le net et trouvé un autre moyen. Nous pouvons définir le profil lui-même dans les capacités souhaitées.

Donc, le nouveau code de travail ressemble à

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);
5
Sanjay Bharwani

Je ne sais pas, mais vous pourriez peut-être vérifier la source d'un des addons de téléchargement de Firefox.

Voici la source de celui que j'utilise Download Statusbar .

3
Nifle

J'ai eu le même problème, je ne voulais pas accéder à Save Dialogue.

Le code ci-dessous peut aider:

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

Selon le type de fichier en cours de téléchargement, vous devez spécifier les types de contenu.

Vous pouvez spécifier plusieurs types de contenu séparés par ';

par exemple: 

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

La plupart des navigateurs (dans le cas de la mine Firefox) sélectionnent le bouton OK par défaut. J'ai donc réussi à résoudre ce problème en utilisant le code suivant. Il appuie essentiellement sur entrer pour vous et le fichier est téléchargé.

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

Au lieu de déclencher le dialogue de téléchargement de fichier natif comme suit:

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

Je fais généralement cela à la place, pour contourner le dialogue de téléchargement de fichier natif. De cette façon, cela fonctionne sur TOUS les navigateurs:

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

Cela nécessite simplement que vous implémentiez la méthode getFileFromURL utilisant Apache HttpClient pour télécharger un fichier et vous renvoyer une référence de fichier.

De même, si vous utilisez Selenide , cela fonctionne de la même manière en utilisant la fonction intégrée download() pour gérer les téléchargements de fichiers.

2
djangofan

Je ne comprenais pas votre objectif, Souhaitez-vous que votre test télécharge automatiquement le fichier une fois le test exécuté? Dans l'affirmative, vous devez utiliser un profil Firefox personnalisé lors de l'exécution de votre test.

Dans le profil personnalisé, pour la première fois, exécutez manuellement le test et, si la boîte de dialogue de téléchargement apparaît, configurez-le, sauvegardez-le également, puis cochez la case Toujours effectuer cette action pour que le fichier soit automatiquement téléchargé à la prochaine exécution du test.

0
Ruturaj

En plus vous pouvez ajouter

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

Pour supprimer la liste de fichiers téléchargés qui est affichée par défaut et qui recouvre une partie de la page Web.

Mes paramètres totaux sont:

        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
Neil Ellis