2010-10-12 8 views
9

Ich versuche den Happy-Path für ein Stück Code zu testen, der lange braucht, um zu antworten, und dann beginnt, eine Datei in den Response-Ausgabestream zu schreiben, was einen Download-Dialog in Browsern auslöst.Selen warten auf Download?

Das Problem ist, dass dieser Prozess in der Vergangenheit fehlgeschlagen ist, eine Ausnahme nach dieser langen Arbeit zu werfen. Gibt es einen Weg in Selen zu wait-for-download oder gleichwertig?

Ich könnte in Thread.sleep werfen, aber das wäre ungenau und verlangsamt den Testlauf unnötig.

Was soll ich tun, hier?

Antwort

5

Sie haben also zwei Probleme:

  1. Sie müssen den Browser bewirken, dass die Datei
  2. Sie zum Download messen müssen, wenn die heruntergeladene Datei abgeschlossen ist

Weder problemc eine sein direkt gelöst von Selenium (noch - 2.0 kann helfen), aber beides sind lösbare Probleme. Das erste Problem kann durch GUI-Automatisierungs-Toolkits wie AutoIT gelöst werden. Sie können aber auch gelöst werden, indem einfach ein automatisierter Tastendruck auf Betriebssystemebene gesendet wird, der die Eingabetaste simuliert (funktioniert für Firefox, etwas schwieriger bei einigen Versionen von Chrome und Safari). Wenn Sie Java verwenden, können Sie Robot dazu verwenden. Andere Sprachen haben ähnliche Toolkits, um so etwas zu tun.

Das zweite Problem ist wahrscheinlich am besten mit einer Art Proxy-Lösung gelöst. Wenn Ihr Browser beispielsweise so konfiguriert wurde, dass er einen Proxy durchläuft und dieser Proxy über eine API verfügt, können Sie den Proxy mit dieser API abfragen, um zu fragen, wann die Netzwerkaktivität beendet wurde.

Das machen wir bei http://browsermob.com, das ist ein Startup, das ich gegründet habe, das Selenium verwendet, um Belastungstests zu machen. Wir haben einen Teil des Proxy-Codes als Open Source veröffentlicht, verfügbar unter http://browsermob.com/tools.

aber zwei Probleme bestehen nach wie vor:

  1. Sie müssen den Browser konfigurieren, dass der Proxy zu verwenden. In Selen 2 ist das einfacher, aber es ist auch mit Selen 1 möglich. Der Schlüssel ist nur sicherzustellen, dass Ihr Browser-Launcher den Browser mit den richtigen Profilen/Einstellungen aufruft.
  2. Momentan gibt es keine API für den BrowserMob-Proxy, um Ihnen mitzuteilen, wann der Netzwerkverkehr gestoppt wurde! Dies ist ein großes Loch im Konzept des Projekts, das ich beheben möchte, sobald ich die Zeit habe. Wenn Sie jedoch gerne mithelfen möchten, schließen Sie sich der Google-Gruppe an und ich kann Sie auf jeden Fall in die richtige Richtung lenken.

Hoffnung, die Ihnen hilft, Ihre verschiedenen Optionen zu identifizieren. Viel Glück!

0

Dies fällt unter die Kategorie "Dinge, die nicht automatisiert werden können". Selenium wurde mit JavaScipt erstellt und kann aufgrund der Einschränkungen der JavaScript-Sandbox nicht auf Downloads zugreifen.

Selen 2 könnte dies möglicherweise tun, sobald Alerts/Prompts implementiert wurden, aber dass dies für die nächste Zeit noch nicht passieren wird.

+1

wie jetzt? ist es immer noch nicht möglich? – user942640

0

Wenn Sie nach dem Download-Dialogfeld suchen möchten, versuchen Sie es mit AutoIt. Ich benutze das zum Hochladen und Herunterladen der Dateien. Die Verwendung von AutoIt mit Se RC ist einfacher.

4

Dies ist Chrome-Test-only Lösung für die Downloads mit Javascript zu steuern ..

Mit WebDriver (Selenium2) kann innerhalb von Chrome Chrom erfolgen: // die HTML/CSS/Javascript :

driver.get("chrome://downloads/"); 
waitElement(By.CssSelector("#downloads-summary-text")); 

// next javascript snippet cancels the last/current download 
// if your test ends in file attachment downloading 
// you'll very likely need this if you more re-instantiated tests left 
((JavascriptExecutor)driver).executeScript("downloads.downloads_[0].cancel_();"); 

Es gibt andere Download.prototype.functions in "Chrom: //downloads/downloads.js"

Diese Suiten Sie, wenn Sie gerade brauchen um einige Informationen zu prüfen, z. verursacht durch Dateianhang Startaktivität und nicht die Datei selbst. Erwähnt von Patrick above - -

Natürlich Sie Schritt 1. steuern müssen und diese steuern Sie Schritt 2. für den Test nicht für die Funktionalität der aktuellen Datei herunterladen Abschluss/abzubrechen.

Siehe auch: Javascript: Cancel/Stop Image Requests die sich auf den Browser Stop bezieht.

8

Ich hatte das gleiche Problem. Ich habe etwas erfunden, um das Problem zu lösen. Eine Versuchdatei wird von Python mit der Erweiterung ".part" erstellt. Also, wenn wir noch die Temperatur haben, kann Python 10 Sekunden warten und erneut prüfen, ob die Datei heruntergeladen ist oder noch nicht.

while True: 
     if os.path.isfile('ts.csv.part'): 
      sleep(10) 
     elif os.path.isfile('ts.csv'): 
      break 
     else: 
      sleep(10) 
driver.close() 
+0

Zwischen dieser Antwort und Santeri's können Sie tatsächlich alles erreichen, was Sie hier brauchen. – Yablargo