it-swarm.com.de

Umgang mit dem Hochladen von Dateien in der Testautomatisierung mit Selenium oder einem Web-Treiber

Ich denke, dass jeder, der Webdriver für die Testautomatisierung verwendet, seine großen Vorteile für die Webentwicklung kennen muss.

Es gibt jedoch ein großes Problem, wenn das Hochladen von Dateien Teil Ihres Webflows ist. Es hört auf, Testautomatisierung zu sein. Die Sicherheitsbeschränkung von Browsern (das Aufrufen der Dateiauswahl) macht es praktisch unmöglich, Tests zu automatisieren.

Afaik ist die einzige Option, Webtreiber auf die Schaltfläche zum Hochladen von Dateien klicken, den Thread in den Ruhezustand versetzen zu lassen, Entwickler/Tester die Datei manuell auswählen zu lassen und den Rest des Webflusses auszuführen.

Wie geht man damit um, gibt es dafür ein Problem? Weil es wirklich nicht so geht. Es würde keinen Sinn machen.

Dies ist der einzige Fall, den ich kenne, wenn Browser-Sicherheitsbeschränkungen nicht zutreffen:

<script language=javascript>   
  function window.onload(){   
          document.all.attachment.focus();   
          var WshShell=new ActiveXObject("WScript.Shell")   
          WshShell.sendKeys("D:\MyFile.doc")
  }   
</script>
23
lisak

Web-Treiber können dies in IE und Firefox recht einfach handhaben. Es ist ein einfacher Fall, das Element zu finden und darin einzugeben.

driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("myfile.txt")

Das obige Beispiel ist in Python, aber Sie haben die Idee

40
AutomatedTester

Die Verwendung von AWT-Robotern ist eine Option, wenn Sie Java verwenden. Aber es ist keine gute Option, es ist nicht sehr zuverlässig und überhaupt nicht sauber. Schau hier

Ich benutze HttpClient und führe einige Tests außerhalb von Selenium durch. Das ist zuverlässiger und sauberer.

Siehe den Code unten. Sie benötigen mehr Ausnahmebehandlung und Bedingungen, um sie an Ihre Arbeit anzupassen.

HttpClient c = new HttpClient();
String url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/j_security_check";
PostMethod post = new PostMethod(url);
post.setParameter("j_username", username);
post.setParameter("j_password", password);
c.executeMethod(post);

url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/myurl.html";
MultipartPostMethod mPost = new MultipartPostMethod(url);
String fileNameWithPath = this.getClass().getClassLoader().getResource(filename).getPath();
File f1 = new File(fileNameWithPath);
mPost.addParameter(elementName, f1);
mPost.addParameter("action", "upload");
mPost.addParameter("ajax", "true");

c.executeMethod(mPost);
mPost.getResponseBodyAsString();
2
rahul

Der Vorschlag, in das Textfeld zu tippen, funktioniert nur, wenn das Textfeld aktiviert ist. Viele Anwendungen zwingen Sie, aus offensichtlichen Gründen durch den Dateibrowser des Dateisystems zu gehen .. Was tun Sie dann? Denken Sie nicht, dass die WebDriver-Entwickler daran gedacht haben, nur Schlüssel in den KeyBoard-Puffer einzufügen (dies war in früheren Automatisierungstagen ein "Kinderspiel").

===

Nachdem ich einige Tage lang wenig geschlafen, mit dem Kopf geschlagen und an den Haaren gezerrt hatte, konnte ich etwas von der hier vorgeschlagenen Roboterlösung (und anderswo) bekommen.

Das Problem, auf das ich gestoßen bin, war, dass das Dialogfeld mit dem richtigen Dateipfad und dem richtigen Dateinamen nicht auf die KeyPress/Release-Ereignisse reagieren konnte, wenn der Dateiname mit VK_ENTER wie folgt beendet wurde:

private final static int Enter = KeyEvent.VK_ENTER;
keyboard.keyPress(Enter);
keyboard.keyRelease(Enter);

Was passiert ist, ist, dass der Dateipfad und der Dateiname korrekt eingegeben werden, der Dialog bleibt jedoch geöffnet - gegen mein ständiges Hoffen und Beten, dass die Tastenemulation es beendet und von der getesteten App verarbeitet wird.

Weiß jemand, wie man diesen Roboter dazu bringt, sich ein bisschen besser zu benehmen?

1
user3037058

Ich dachte nur, ich würde eine FYI für den ursprünglichen Beitrag des Autors zur Verwendung von ActiveX zur Verfügung stellen. Eine andere Problemumgehung wäre die Integration mit Desktop-GUI-Automatisierungstools, um die Aufgabe zu erledigen. Zum Beispiel google "Selenium AutoIt". Für eine plattformübergreifende Lösung sollten Sie Tools wie Sikuli gegenüber AutoIt in Betracht ziehen.

Dies berücksichtigt natürlich nicht die Unterstützung von WebDriver für Uploads auf IE und Firefox über SendKeys oder andere Browser, bei denen diese Methode nicht funktioniert.

1
David

Wenn Sie ein Raster verwenden, können Sie den Ordner der Testdateien für die Freigabe öffnen.

Auf diese Weise können Sie das Upload-Eingabefeld auswählen und seinen Wert auf \\ pc-name\myTestFiles setzen

Wenn nicht, sollten Sie lokale Dateien auf jedem System verwenden.

0
HerrWalter

Nachdem ich mich viel zu viele Stunden mit diesem Problem beschäftigt hatte, wollte ich mit der Community teilen, dass Firefox 7.0.1 anscheinend ein Problem mit der FirefoxDriver sendKeys () - Implementierung hat, die oben erwähnt wurde (zumindest konnte ich es nicht zum Laufen bringen Bei meiner Windows 7 x64-Box habe ich keine Problemumgehung gefunden, aber ein Update auf Firefox 8.0.1 scheint das Problem zu beheben. Für diejenigen, die sich fragen, ist es auch möglich, Selenium RC zu verwenden, um dieses Problem zu lösen (obwohl Sie alle Zielbetriebssysteme und die systemeigenen Tastendrücke berücksichtigen müssen, die für die Interaktion mit ihren Dateiauswahldialogen erforderlich sind). Ich hoffe, dass die Probleme, mit denen ich umgehen musste, andere Zeit sparen, zusammenfassend: 

https://Gist.github.com/1511360

0
Matthew Madson