Dialogue d'accès au téléchargement de fichiers dans Firefox

y a-t-il une API quelconque qui puisse me permettre de manipuler un dialogue de téléchargement de fichier dans Firefox? (Je veux accéder à celui qui apparaît lorsque l'utilisateur fait quelque chose, pas l'initier moi-même).

ce que je veux faire, c'est Accéder à ce dialogue à partir du sélénium (et si le" mode privilégié " du sélénium est suffisant pour accéder à l'interface de chrome, c'est quelque chose dont je ne suis pas sûr).

73
demandé sur Andrey Shchekin 2009-07-24 12:10:47

11 réponses

Pas que je sache. Mais vous pouvez configurer Firefox à démarrer automatiquement le téléchargement et enregistrer le fichier dans un endroit spécifique. Votre test pourrait alors vérifier que le dossier est réellement arrivé.

29
répondu Aaron Digulla 2009-07-24 08:22:27

j'ai une solution pour 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");
69
répondu dlopezgonzalez 2014-09-11 01:05:50

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

bien sûr que C'était 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, c'était un fichier CSV. Mais quand vous avez besoin de plus, il sont stockés dans le ~/.mozilla/$USER_PROFILE/mimeTypes.rdf

36
répondu Akendo 2014-02-11 12:46:05
"151930920 des Applications Web de générer des 3 différents types de pop-ups, à 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 d'application web. Selenium fournit une API pour gérer ces pop-ups JavaScript, comme Alert .

finalement, la façon la plus simple d'ignorer les pop-up et les fichiers de téléchargement de navigateur est fait en faisant usage des profils de navigateur; il ya deux façons de le faire:

  • implique une modification manuelle des propriétés du navigateur (ou)
  • personnaliser les propriétés du navigateur en utilisant profile setPreference

Method1

avant de commencer à travailler avec des pop-ups sur les profils de navigateur, assurez-vous que les options de téléchargement sont définis par défaut pour enregistrer le fichier.

(Open Firefox) Outils > Options > Applications

enter image description here

Method2

utilisez l'extrait ci-dessous et effectuez des 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
répondu Prashanth Sams 2015-05-27 10:59:22

je faisais face à la même question. Dans notre application, L'instance de FireFox a été créée en passant les capacités désirées comme suit

driver = new FirefoxDriver(capabilities);

basé sur les suggestions des autres, 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 le but mais malheureusement mes autres tests d'automatisation ont commencé à échouer. Et la raison en était, j'ai enlevé les capacités qui étaient passées plus tôt.

un peu plus je regarde sur le net et j'ai trouvé un autre moyen. Nous pouvons définir le profil lui-même dans les compétences requises.

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
répondu Sanjay Bharwani 2017-07-11 15:54:16

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

Voici la source pour un que j'utilise télécharger Statusbar .

3
répondu Nifle 2014-09-11 01:06:20

j'ai eu le même problème, Je ne voulais pas d'accès de Save Dialogue.

ci-dessous le code 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 téléchargé, vous devez spécifier les types de contenu .

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

E. g:

    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");
3
répondu Pratik Patel 2017-03-20 07:14:38

la plupart des navigateurs (dans le cas de la mine Firefox) sélectionnez le bouton OK par défaut. Donc j'ai réussi à résoudre ce problème en utilisant le code suivant. Il appuie sur Entrée 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);
2
répondu shish 2016-01-04 18:05:43

au lieu de déclencher le dialogue de téléchargement de fichier natif comme ceci:

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

je le fais habituellement à la place, pour contourner la boîte de dialogue de téléchargement de fichier natif. De cette façon, il fonctionne sur tous les navigateurs:

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

il vous suffit D'implémenter la méthode getFileFromURL qui utilise Apache HttpClient pour télécharger un fichier et vous renvoyer une référence de fichier.

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

Jusqu'à marionnette est plus mature, c'est ce que je fais.

2
répondu djangofan 2016-04-28 22:22:22

Je n'ai pas manqué votre objectif, Voulez-vous que votre test télécharger automatiquement le fichier lorsque le test est exécuté, si oui, alors vous devez utiliser le profil personnalisé de Firefox dans votre exécution de test.

dans le profil personnalisé, pour la première fois exécuter le test manuellement et si la boîte de dialogue de téléchargement vient, le jeu Il enregistrer sur le disque, également vérifier toujours effectuer cette case à cocher action qui garantira que le fichier est téléchargé automatiquement la prochaine fois que vous exécutez votre test.

0
répondu 2009-07-25 10:45:07

en plus, vous pouvez ajouter

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

pour supprimer la liste des fichiers téléchargés qui s'affiche par défaut et couvre 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
répondu Neil Ellis 2016-05-09 21:56:01