ich habe mir ein paar Codezeilen zusammengeschrieben um mittels der Selenium Library auf eine Website zuzugreifen und das Herunterladen von Dokumenten zu automatisieren. Zu diesem Zweck iteriere ich mit Hilfe einer For-Schleife durch ein Dictionary. Meine Codestruktur sieht wie folgt aus:
Code: Alles auswählen
for key in mydict.keys():
ein paar Zeilen Code
for x in range(Number):
ein paar Zeilen Code
for x in range(Number):
ein paar Zeilen Code
Nun kann es vorkommen, dass die Dateien unterschiedlich lange benötigen um heruntergeladen zu werden. Um den Abschluss des Downloads zu prüfen nutze ich aktuell folgende Funktion, die sowohl im äußeren als auch in den inneren For-Loops aufgerufen wird:
Code: Alles auswählen
def is_file_downloaded(filename, timeout=200):
end_time = time.time() + timeout
while not os.path.exists(filename):
time.sleep(1)
if time.time() > end_time:
print("File not found within time")
break
if os.path.exists(filename):
print("File found")
return True
Es kommt leider auch vor, dass eine Datei während des Herunterladens nicht im Rahmen der vorgegebenen 200 Sekunden heruntergeladen ist und der Download quasi in einer Endlosschleife festhängt, also nicht beendet wird. Aktuell wird dann "File not found within time" ausgegeben und die Ausführung des Codes abgebrochen. Wenn ich dann eine neue Download Anfrage starte funktioniert der Download der Datei meist problemlos. Diese neue Anfrage würde ich nun gerne in meinem Code berücksichtigen, sodass ich sie nicht mehr manuell ausführen muss. Genauer gesagt suche ich nach einer Lösung, die es mir erlaubt den äußeren For-Loop bei einer Fehlermeldung erneut, d.h. mit derselben Iteration, zu durchlaufen. Nehmen wir an ich iteriere in dem äußeren For-Loop über das Alphabet. Wenn bei der Iteration beim Buchstaben D ein Fehler beim Download der Datei auftritt und die 200 Sekunden überschritten werden, soll der äußere For-Loop erneut gestartet werden und bei der Iteration bei D beginnen. Gibt es eine Möglichkeit diese erneute Schleifenbedingung direkt in der Download Funktion zu implementieren? Ich hatte überlegt anstatt des break Befehls in der Downloadfunktion einen Zähler einzubauen der entsprechend den Wert 1 annimmt, wenn der Download zu lange dauert und dann mittels einer while Schleife zu Beginn der äußeren For-Schleife zu prüfen, ob der Wert der Variable 1 entspricht. Nur bin ich mit der genauen Umsetzung überfordert und scheitere schon an der Problematik die äußere For-Schleife erneut bei der "fehlgeschlagenen" Iteration beginnen zu lassen.
Über Hilfe zu meinem Problem würde ich mich sehr freuen.
Vielen Dank und ein schönes Wochenende