Zugriff auf den Dialog zum Herunterladen von Dateien in Firefox

83

Gibt es eine API, mit der ich einen Dialog zum Herunterladen von Dateien in Firefox bearbeiten kann? (Ich möchte auf diejenige zugreifen, die angezeigt wird, wenn der Benutzer etwas tut, und nicht selbst eine initiieren.)

Ich möchte über Selen auf diesen Dialog zugreifen (und ob der "privilegierte Modus" von Selen für den Zugriff auf die Chrome-Oberfläche ausreicht, weiß ich auch nicht genau).

Andrey Shchekin
quelle
3
Ich habe gerade den größten Teil von drei Wochen damit verbracht, meinen eigenen virtuellen privaten Apache-Server zum ersten Mal zu konfigurieren (weil es etwas schwierig ist, Selenium auf Shared Hosting auszuführen), Firefox, Selenium und Python zusammenzubringen und den eigentlichen Python-Code schrittweise zu schreiben über eine sehr JavaScript-lastige Site, um am Ende eine Datei herunterzuladen. Dann wurde mir klar, dass ich keine Ahnung hatte, wie ich tatsächlich auf die heruntergeladene Datei zugreifen sollte. Ich bin wirklich froh, dass Sie die Frage zuerst gestellt haben.
Paul D. Waite
AppleScript wäre dafür großartig, wenn Firefox ein anständiges AppleScript-Wörterbuch hätte.
Nicolas Barbulesco
Kann mir jemand helfen [Frage auf dieser Website] [1] [1]: stackoverflow.com/questions/27058053/…
Jewgenij Semaschko

Antworten:

33

Nicht, dass ich davon Wüste. Sie können Firefox jedoch so konfigurieren, dass der Download automatisch gestartet und die Datei an einem bestimmten Ort gespeichert wird . Ihr Test könnte dann überprüfen, ob die Datei tatsächlich angekommen ist.

Aaron Digulla
quelle
Ok, ich denke, ich werde mit dieser Lösung gehen.
Andrey Shchekin
1
Selen startet Firefox jedoch im Standardprofil (da kein Profil angegeben ist), sodass Sie es jedes Mal konfigurieren müssen. Erstellen Sie stattdessen ein neues Profil mit Ihren Einstellungen, damit es einfacher ist.
Vignesh Dhamodaran
71

Ich habe eine Lösung für dieses Problem. Überprüfen Sie den 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");
dlopezgonzalez
quelle
1
Schließen, aber nicht ganz für Firefox unter Ubuntu 12.04 ab dem 17.08.2013. Ändern Sie den Wert der Eigenschaft "browser.helperApps.neverAsk.saveToDisk" in "text / csv, application / vnd.ms-excel" und es funktioniert unter Ubuntu.
Bakoyaro
2
Möglicherweise wird der Wertname geändert, dies ist seit mehr als einem Jahr.
Dlopezgonzalez
1
Ich verwende dieselbe Methode, um die Datei automatisch zu speichern, aber sie funktioniert nicht. Meine Firefox-Version ist 20.0. Und ich versuche, PDF-Dateien herunterzuladen (MIME-Typ verwendet-> Anwendung / pdf, Anwendung / x-pdf)
Yatin
3
Nicht, dass das nicht funktioniert Content-Disposition: attachment. Firefox scheint in diesem Fall immer einen Dialog zu öffnen!
Martin Höller
Für das Herunterladen von XLS-Dateien unter Linux funktionierte dies für mich:setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
Donfuxx
42

Ich hatte das gleiche Problem, fand aber eine Lösung. Ich habe es genauso gemacht wie dieser Blog .

Natürlich war dies Java, ich habe es in Python übersetzt:

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)

In meinem Beispiel war es eine CSV-Datei. Aber wenn Sie mehr brauchen, sind dort in der gespeichert~/.mozilla/$USER_PROFILE/mimeTypes.rdf

Akendo
quelle
3
Ich habe es versucht, aber es scheint bei mir nicht zu funktionieren. Der Dialog zum Speichern von Dateien wird weiterhin angezeigt.
ealfonso
1
Danke, die letzte Präferenz war Kupplung: "application / pdf"
user2426679
1
Ich verwende dieselbe Methode, um die Datei automatisch zu speichern, aber sie funktioniert nicht. Meine Firefox-Version ist 20.0. Und ich versuche, PDF-Dateien herunterzuladen (MIME-Typ verwendet-> Anwendung / pdf, Anwendung / x-pdf)
Yatin
1
Vielen Dank, dass Sie @Akendo. Dies funktioniert für mich mit Python 3.4.3, Selen-2.52 und Firefox 44.
Igor
8

Webanwendungen generieren drei verschiedene Arten von Popups. nämlich,

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

Im Allgemeinen werden die JavaScript-Popups vom Webanwendungscode generiert. Selenium bietet eine API für die Verarbeitung dieser JavaScript-Popups, z Alert.

Der einfachste Weg, Browser-Popup- und Download-Dateien zu ignorieren, ist die Verwendung von Browser-Profilen. Es gibt verschiedene Möglichkeiten, dies zu tun:

  • Manuelle Änderungen an den Browsereigenschaften (oder)
  • Passen Sie die Browsereigenschaften mit profile setPreference an

Methode 1

Stellen Sie vor dem Arbeiten mit Popups für Browserprofile sicher, dass die Download-Optionen standardmäßig auf Datei speichern eingestellt sind.

(Öffnen Sie Firefox) Extras> Optionen> Anwendungen

Geben Sie hier die Bildbeschreibung ein

Methode2

Verwenden Sie das folgende Snippet und nehmen Sie bei Bedarf Änderungen vor.

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
quelle
4

Ich stand vor dem gleichen Problem. In unserer Anwendung wurde die Instanz von FireFox erstellt, indem die DesiredCapabilities wie folgt übergeben wurden

driver = new FirefoxDriver(capabilities);

Aufgrund der Vorschläge anderer habe ich meine Änderungen vorgenommen als

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

Dies diente dem Zweck, aber leider scheiterten meine anderen Automatisierungstests. Und der Grund war, ich habe die Fähigkeiten entfernt, die früher übergeben wurden.

Noch ein bisschen im Internet surfen und einen alternativen Weg finden. Wir können das Profil selbst in den gewünschten Funktionen einstellen.

Der neue Arbeitscode sieht also so aus

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
quelle
3

Weiß nicht, aber Sie könnten vielleicht die Quelle eines der Firefox-Download-Addons überprüfen.

Hier ist die Quelle für eine, die ich als Download-Statusleiste verwende .

Nifle
quelle
Danke, das ist sehr interessant (beweist aber, dass es entweder unmöglich oder wahnsinnig schwer ist, wenn ich nicht eine Erweiterung mit xul-Teilen schreibe).
Andrey Shchekin
3

Die meisten Browser (in meinem Fall Firefox) wählen standardmäßig die Schaltfläche OK. Also habe ich es geschafft, dies mit dem folgenden Code zu lösen. Grundsätzlich wird die Eingabetaste für Sie gedrückt und die Datei wird heruntergeladen.

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);
Schaschlik
quelle
3

Ich hatte das gleiche Problem, ich wollte keinen Zugriff auf Save Dialogue.

Der folgende Code kann helfen:

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

Je nach Dateityp, der heruntergeladen wird, müssen Sie Inhaltstypen angeben .

Sie können mehrere Inhaltstypen angeben, die durch ' ; '

z.B:

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

Anstatt den nativen Dialog zum Herunterladen von Dateien wie folgt auszulösen:

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

Normalerweise mache ich das stattdessen, um den nativen Dialog zum Herunterladen von Dateien zu umgehen. Auf diese Weise funktioniert es in ALLEN Browsern:

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

Dies erfordert lediglich, dass Sie eine Methode implementieren getFileFromURL, die Apache HttpClient verwendet, um eine Datei herunterzuladen und einen Dateiverweis an Sie zurückzugeben.

Wenn Sie Selenide verwenden , funktioniert dies auf die gleiche Weise wie bei der integrierten download()Funktion zum Herunterladen von Dateien.

Djangofan
quelle
Dies funktioniert nur für Dateien, die statisch im HTML verknüpft sind, z. B. nicht für eine Datei, die auf der Grundlage einer Post-Anfrage (oder einer ähnlichen Anfrage) generiert wird.
Todor Minakov
Ja, die Laufleistung kann variieren. Normalerweise können Sie mit Ihren Entwicklern zusammenarbeiten, um in diesen Randfällen etwas herauszufinden.
Djangofan
0

Ich habe Ihr Ziel nicht verstanden. Möchten Sie, dass Ihr Test die Datei automatisch herunterlädt, wenn der Test ausgeführt wird? Wenn ja, müssen Sie bei der Testausführung ein benutzerdefiniertes Firefox-Profil verwenden.

Führen Sie im benutzerdefinierten Profil den Test zum ersten Mal manuell aus. Wenn der Download-Dialog angezeigt wird, aktivieren Sie das Kontrollkästchen Auf Festplatte speichern. Aktivieren Sie außerdem das Kontrollkästchen Immer diese Aktion ausführen, um sicherzustellen, dass die Datei beim nächsten Ausführen des Tests automatisch heruntergeladen wird.


quelle
0

Darüber hinaus können Sie hinzufügen

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

So entfernen Sie die heruntergeladene Dateiliste, die standardmäßig angezeigt wird und einen Teil der Webseite verdeckt.

Meine Gesamteinstellungen sind:

        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
quelle
1
Hallo Neil Ellis, Klicken Sie auf die Bildschaltfläche. "Exportieren" öffnet ein Popup-Fenster. Der Dateidownload wird über das Popup-Fenster ausgelöst und das Popup wird geschlossen. Wenn möglich, leiten Sie mich bitte in diesem Szenario zum Herunterladen stiller Dateien.
AVA