In diesem Artikel erkläre ich, wie man bei Flatex aus dem Dokumentenarchiv (Posteingang) alle PDF-Dokumente herunterlädt. Leider gibt es bei Flatex hierfür keine automatische Exportfunktion und die Extraktion der PDFs ist nicht trivial, mehr dazu im Technischen Hintergrund weiter unten. Ich habe daher ein Macro gebaut, dass dieses Problem löst und das Herunterladen erlaubt ohne sich einzeln durch hunderte Dokumente klicken zu müssen. Falls du auf der Suche nach einem Depot mit günstigeren Konditionen bist, dann schau dir gerne hier meinen Vergleich an.
1. Kompatiblität
Diese Anleitung bezieht sich auf Mozilla Firefox 71 und funktionierte für mich am 10.06.2020 au einem Bildschirm mit 4K (die Auflösung sollte theoretisch keine Rolle spielen). Das ganze sollte sich auch auf Chromium übertragen lassen, da hierfür die selbe Schnittstelle existiert. Sollte das hier genannte Prozedere nicht mehr funktionieren kann das die im Abschnitt 5 aufgelisteten Ursachen haben. Hinterlasse in diesem Falle gern einen Kommentar. Das Skript funktioniert auf Windows und Mac OS X und vermutlich auch auf GNU/Linux für Flatex Deutschland und Flatex Österreich.
2. Praktische Anleitung
- Installiere Selenium IDE
- Kopiere den Quelltext von weiter unten auf der Seite. Öffne Notepad (Win + R -> Notepad -> Enter) und füge den Quelltext ein. Wähle Datei -> speichern aus (STRG + S) wähle Dateityp Alle Dateien (*) (WICHTIG!) und gebe den Dateinamen “FlatexDownload.side” ein. Wenn du Notepad++ installiert hast würde ich dir Empfehlen diesen zu benutzen, da der Standard-Windows-Editor ein paar Macken hat und immer wieder zu unerwarteten Problemen führt.
- Logge dich bei Flatex ein und wähle “Alle Dokumenttypen”, “Alle”, “Indivudueller Zeitraum” aus.
- Wähle ein Startdatum aus das auf jeden Fall vor deiner Kontoeröffnung liegt (bei mir war das früheste wählbare Datum der 01.01.2005). Ändere Gelesen zu Alle.
- Gehe auf die Firefox Einstellungen Pop-Up Fenster Blockieren Ausnahmen und gebe https://konto.flatex.de beziehungsweise https://konto.flatex.at wenn du bei Flatex Östterreich bist in die Zeile ein und klicke auf Erlauben.
Theoretisch kannst du nun dir alle Dokumente bis zum heutigen Tag anzeigen lassen, allerdings stellt Flatex nur die letzten (laut eigener inkorrekter Anzeige “ersten”) 100 Dokumente dar. Deshalb empfiehlt es sich meiner Ansicht nach die Dokumente jahresweise abzuspeichern.
- Wenn du Windows benutzt, dann springe direkt zu Schritt 7. Wenn du ein anderes Betriebssystem nutzt, dann führe vorher die in Auf nicht Windows-Systemen beschriebenen Schritte durch. Wenn du Flatex Österreich benutzt, dann führe die Andreas’ Kommentar aufgelisteten Schritte durch bevor du mit Schritt 7 weiter machst.
- Wähle den 31.12. des 1. Jahres deiner Kontoeröffnung aus
- Klicke oben rechts in der Leiste auf das Symbol → Einstellungen → Downloads → Alle Dateien in folgendem Ordner abspeichern → “Flatex\20xx”. Ändere bei “Anwendungen” das “Portable Document Format” zu “Datei speichern”. (Das entfernt den Dialog vor dem Abspeichern).
- Klicke auf das Seleniumsymbol oben rechts in der Leiste von Firefox. Es öffnet sich ein neues Fenster mit einem Menü.
- Wähle “Open Existing Project” und wähle mein heruntergeladenes Macro aus.
- Starte das Macro indem du auf den Abspielknopf drückst.
- Das Macro lädt nun alle auf der Seite Abrufbaren PDFS herunter.
- Sobald länger als für 5 Sekunden sich keine neuen Fenster mehr öffnen und Firefox nicht mehr zappelt, ist der Vorgang für die gerade ausgewählten PDFs beendet. Im Selenium IDE Fenster sollte dich die Botschaft “Script completed successfully” begrüßen.
- Ändere nun das Start- und Enddatum entsprechend auf das nächste Jahr und ändere den Download ordner auf “Flatex\20xx+y”.
- Schließe das Flatexfenser welches vom Macro geöffnet wurde (sehr wichtig, sonst kann es beim nächsten Ausführen zur Fehlermeldung kommen).
- Starte den Prozess erneut indem du auf das Abspielensymbol drückst. Wiederhole bis du alle Jahre archiviert hast.
2.1 Auf nicht Windows-Systemen
Flatex erkennt welches Betriebssystem du verwendest und schickt dir dann eine Webseite die nicht nur ein anderes Aussehen (CSS) hat sondern auch andere interne Semantikstruktur (HTML). Da diese Anleitung auf der Semantikstruktur für Windows basiert musst du also folgendes tun:
- Installier dir eine Firefox Erweiterung die dir erlaubt den Benutzerclienten den dein Browser bei der HTTP(S)-Anfrage angibt zu manipulieren, zum Beispiel User Agent Switcher“ und stelle auf Windows um.
- Gehe in die Einstellungen von Firefox -> Cookies und Website-Daten -> Daten verwalten -> suche nach Flatex markiere die gefunden Einträge und wähle Ausgewähltes entfernen.
- Fahre mit Schritt 7 fort.
3. Quelltext
{
"id": "f8551403-a89c-4751-b6fe-066386359340",
"version": "3.0",
"name": "FlatexDownload",
"url": "https://konto.flatex.de",
"tests": [{
"id": "ad0cd28d-7bf9-4590-a38c-98834e14d625",
"name": "FlatexDownloadScript",
"commands": [{
"id": "86862c98-ce1c-4028-9ce5-823f8d0e14ef",
"comment": "",
"command": "open",
"target": "/banking-flatex/documentArchiveListFormAction.do",
"targets": [],
"value": ""
}, {
"id": "a8b96cc8-7cd6-42a9-87a7-dbbb4cf8a7c5",
"comment": "",
"command": "setWindowSize",
"target": "1280x720",
"targets": [],
"value": ""
}, {
"id": "e9456761-1a49-42c9-bdb4-36f4f2d70586",
"comment": "",
"command": "storeWindowHandle",
"target": "root",
"targets": [],
"value": ""
}, {
"id": "4b381b95-2e4b-4b48-a0ad-ab1e2d036d47",
"comment": "",
"command": "selectWindow",
"target": "handle=${root}",
"targets": [],
"value": ""
}, {
"id": "635f5774-6a68-49aa-8f78-bbdf36871157",
"comment": "",
"command": "pause",
"target": "3000",
"targets": [],
"value": ""
}, {
"id": "ff78ecb6-780a-47dc-abd8-aed1648a796a",
"comment": "",
"command": "store",
"target": "1",
"targets": [],
"value": "iter"
}, {
"id": "6893606d-e905-4527-8818-f8eb6a64f6bb",
"comment": "",
"command": "storeXpathCount",
"target": "xpath=//table/tbody/tr/td/table/tbody/tr",
"targets": [],
"value": "rowCount"
}, {
"id": "bbe4b87d-11fb-480e-897c-f37e961a7b20",
"comment": "",
"command": "echo",
"target": "Number of rows is ${rowCount}",
"targets": [],
"value": ""
}, {
"id": "6c6c0775-d239-4e0d-bb33-25d96d2d4cbf",
"comment": "",
"command": "while",
"target": "${iter}<=${rowCount}",
"targets": [],
"value": ""
}, {
"id": "54e0211e-286b-4203-9441-fbcae02d3c8c",
"comment": "",
"command": "echo",
"target": "Saving ${iter}. document",
"targets": [],
"value": ""
}, {
"id": "a8069780-383a-4997-85b8-04d2011a0001",
"comment": "",
"command": "click",
"target": "xpath=//table/tbody/tr/td/table/tbody/tr[${iter}]",
"targets": [
["css=#TID190629481_0-0 > .C0", "css:finder"],
["xpath=//tr[@id='TID190629481_0-0']/td", "xpath:idRelative"],
["xpath=//td/table/tbody/tr/td", "xpath:position"]
],
"value": "",
"opensWindow": true,
"windowHandleName": "win9876",
"windowTimeout": 3000
}, {
"id": "6da5712a-509c-4628-8865-c667eefe3cac",
"comment": "",
"command": "selectWindow",
"target": "handle=${win9876}",
"targets": [],
"value": ""
}, {
"id": "cf1b6252-433b-4bf1-be13-cedfd840696a",
"comment": "",
"command": "pause",
"target": "2000",
"targets": [],
"value": ""
}, {
"id": "5937cfb3-cddb-4326-8848-c6a85d251476",
"comment": "",
"command": "click",
"target": "xpath=//button[@id=\"download\"]",
"targets": [],
"value": ""
}, {
"id": "1af05a85-2ff4-4f09-b6aa-eca816e2afbc",
"comment": "",
"command": "close",
"target": "",
"targets": [],
"value": ""
}, {
"id": "bba64a01-274f-4f77-a543-731b442fff28",
"comment": "",
"command": "selectWindow",
"target": "handle=${root}",
"targets": [],
"value": ""
}, {
"id": "086dd774-54a4-4b25-992f-d37720c8edf0",
"comment": "",
"command": "executeScript",
"target": "return Number(${iter})+1;",
"targets": [],
"value": "iter"
}, {
"id": "58f32f41-52c4-46dc-8685-e63fb841915a",
"comment": "",
"command": "end",
"target": "",
"targets": [],
"value": ""
}, {
"id": "7a8c7897-0882-443d-846e-b89d6435e3e1",
"comment": "",
"command": "echo",
"target": "Script completed successfully",
"targets": [],
"value": ""
}]
}],
"suites": [{
"id": "b272b29e-dfae-4594-b23b-1d76f8ee2f56",
"name": "Default Suite",
"persistSession": false,
"parallel": false,
"timeout": 300,
"tests": ["ad0cd28d-7bf9-4590-a38c-98834e14d625"]
}],
"urls": ["https://konto.flatex.de/"],
"plugins": []
}
4. Technischer Hintergrund
Die PDF-Dokumente sind nicht in der Seite direkt verlinkt sind sondern über einen Javascript-PDF-Viewer. Es wird dabei beim Klick auf die Tabellenzeile ein Link zu einem PDF-Viewer generiert und diesem gefolgt. In diesem PDF-Viewer kann dann der Herunterladeknopf geklickt werden.
Das ganze wird in meinem Macro auf folgende Art und Weise automatisiert:
- Öffne die Seite “/banking-flatex/documentArchiveListFormAction.do”
- Setze das Fenster groß genug, dass Flatex die Formatierung für den Desktop beibehält
- Speichere eine Referenz zu dem aktuellen Flatexfenster
- Warte 3000 Millisekunden, dass die Seite auf jeden Fall geladen ist
- Gehe in einer Schleife von i = 1. bis zur letzten Zeile.
- Klicke auf jede i-te Zeile, warte bis das Fenster sich öffnet
- Warte dann 2000 ms. Da ein PDF-Viewer geladen wird muss man anschließend nach dessen Laden nochmal warten um sicher zu sein, dass er auch das Dokument in diesem geladen wurde.
- Drücke den Knopf herunterladen
- Schließe das Fenster
- Kehre zum ursprünglichen Fenster zurück, fahre bei Punkt 5 fort.
Ich hoffe das Skript hilft euch eure Daten von Flatex zu exportieren. Und ich empfehle euch einen Blick in das neue Preismodell Flatex’ zu werfen. Mit ihren neuerlichen Gebühren sind sie schwer noch als kompetitiv zu bezeichnen.
5. Das Skript funktioniert nicht!
Wenn das Skript nicht funktioniert kann das entweder daran liegen dass Flatex die Seitenstruktur stark verändert hat (mit kleineren Änderungen kommt das Skript gut klar), deine Internetverbindung, Rechner oder Software sehr schlecht sind, oder aber dass du einfach Pech hattest. Manchmal funktioniert das Skript nicht beim ersten Mal Ausführen. Es einfach nochmal zu probieren kann helfen. Es kann auch helfen vorm erneuten Probieren alle vom Skript geöffneten (oder auch nur ein paar, probier’s aus, lies die Kommentare) Seiten schließt und es dann nochmal ausführt tadellos. Wie du die beiden anderen Ursachen angehen kannst erfährst du in folgenden zwei Abschnitten:
5.1 Skript aktualisieren
Jedes mal wenn Flatex die HTML-Struktur der Seite verändert (vermutlich mehrmals im Jahr) muss das Skript angepasst werden. Dabei muss im gesamten Skript in der Regel zum Glück nur zwei Ausdrück angepasst werden: der Pfad zur Tabellenzeile und der Pfad zum Herunterladenknopf. Falls das Skript nicht mehr funktioniert und du dir sicher bist, das Skript korrekt ausgeführt zu haben, dann kannst du es auf folgende Art und Weise Teilkapiteln:
5.1.1 Tabellenzeile aktualisieren
- Rufe ganz normal dein Dokumentenarchiv bei Flatex auf.
- In Firefox (in Chrome ähnlich) klicke mit der rechten Maustaste auf eine Tabellenzeile (also darauf wo du normalerweise klickst um ein Dokument zu öffnen).
- Wähle Element untersuchen aus dem Dialog aus
- Es öffnet sich nun im unteren Bereich des Fensters eine Übersicht des HMTL-Quelltextes der Seite. Das Element das du rechts angeklickt hattest ist hervorgehoben.
- Rechtsklicke das in der HTML-Übersicht hervorgehobene HTML-Element.
- Im sich öffnenenden Menü wähle Kopieren -> XPath
- Du solltest nun etwas erhalten wie /html/body/div[a]/div[b]/div[c]/div[d]/div[e]/div[f]/table/tbody/tr/td/table/tbody/tr[g] wobei a, b, c, d, e, f, g Platzhalter beliebige natürliche Zahlen sind. Entferne nun [g] und füge den Ausdruck anstelle von //table/tbody/tr/td/table/tbody/tr in Zeile 55 und Zeile 83 (im Quelltext) ein.
- Poste ein Kommentar zum aktualisierten Xpath, damit das Skript hier für andere Nutzer angepasst werden kann. Poste den Kommentar selbst wenn deine Aktualisierung nicht funktioniert, damit ich und die Nutzer bescheid wissen ob sich etwas an der Seitenstruktur verändert hat.
5.1.2 Herunterladenknopf aktualisieren
- Öffne ein Dokument im Flatex Dokumentenarchiv.
- Im nun geöffneten Fenster gilt analoges vorgehen, wie in obiger Beschreibung, nur dass du einen Rechtsklick auf den Herunterladenknopf durchführst und entsprechend die Zeile 111 bearbeitest.
- Poste deinen Kommentar mit dem aktualisierten XPath.
5.2 Skript an Datenwüste Deutschland oder langsamen Rechner anpassen
Im Skript warte ich an zwei verschiedenen Stellen auf das Laden einer Seite. Die Wartezeit beträgt dabei beim ersten mal 3000 ms Sekunden und beim den anderen Malen 2000 ms. Nun kann es sein, dass diese Wartezeit für ein vollständiges Laden nicht ausreicht. Das kann an einer langsamen Internetverbindung einem schlechten Browser (Internet Explorer 😉 ) oder an einem Rechner mit mangelnder Leistung liegen. In jedem Falle solltest du ausprobieren, ob du wenn du diese Werte in der Selenium IDE abänderst (einfach bei dem jeweiligen “Pause”-Eintrag die Zahlabändern) du bessere Resultate bekommst. Je höher du die Zahlen setzt, desto länger braucht das Skript. Aber dafür steigt die Wahrscheinlichkeit dass die Wartezeit ausreicht um die Seiten vollständig zu laden bevor das Skript fortfährt. 3000 und 2000 ms Sekunden haben bei mir und vielen anderen Nutzern gut gereicht.
6. Änderungslog
- 2021-02-18: Anmerkungen von Tom und Manni übernommen
- 2021-01-23: Warnhinweise entschärft, Anleitung zur Anpassung an langsames Internet oder langasame Rechner hinzugefügt. Skript abgeändert, dass es länger kompatibel sein wird (XPath für den Knopf generisiert, “xpath=/html/body/div[1]/div[2]/div[3]/div/div[1]/div[2]/button[@id=\”download\” -> “xpath=/button[@id=\“download\“
- 2021-01: Anleitung zur Aktualisierung hinzugefügt
- 2020-11: Österreich dank Nutzerkommentar hinzugefügt
- 2020-09-21: Rolands Test berücksichtigt.
- 2020-09-19: Rolands Anmerkungen berücksichtigt.
- 2020-06-10: Die Flatexseite hat sich geändert. Das Element
“/html/body/div[1]/form[3]/div/div/div[6]/div[2]/table/tbody/tr/td/table/tbody” ist nun
“/html/body/div/form[3]/div/div/div[7]/div[2]/table/tbody/tr/td/table/tbody”, im Quelltext habe ich folglich das ganze durch
“///table/tbody/tr/td/table/tbody” ersetzt um möglichst lange Kompatibilität zu bewahren. - 2020-06-19: Das zweite Pause wieder eingefügt. Danke Erik.