Eine Lösung für den Datei-Upload mit Java Robot API mit Selenium WebDriver von Java
Lesezeit: 5 Minuten
Alex
Ich habe gesehen, dass viele Leute Probleme beim Hochladen einer Datei in einer Testumgebung mit Selenium WebDriver haben. Ich benutze den Selenium WebDriver und Java und hatte das gleiche Problem. Ich habe endlich eine Lösung gefunden, also werde ich sie hier posten, in der Hoffnung, dass sie jemand anderem hilft.
Wenn ich in einem Test eine Datei hochladen muss, klicke ich mit Webdriver in den Button und warte bis das Fenster “Öffnen” erscheint. Und dann kopiere ich den Pfad zur Datei in die Zwischenablage und füge ihn dann in das “Öffnen”-Fenster ein und klicke auf “Enter”. Das funktioniert, denn wenn das Fenster “Öffnen” auftaucht, liegt der Fokus immer auf der Schaltfläche “Öffnen”.
Und das mache ich, gleich nachdem ich das “Öffnen”-Fenster geöffnet habe:
setClipboardData("C:\path to file\example.jpg");
//native key strokes for CTRL, V and ENTER keys
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
Und das ist es. Bei mir funktioniert es, ich hoffe es funktioniert bei einigen von euch.
Petr Janeček
Tatsächlich gibt es dafür auch eine eingebaute Technik. Es sollte in allen Browsern und Betriebssystemen funktionieren.
Selenium 2 (WebDriver) Java-Beispiel:
// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.xpath("//input[@type="file"]"));
fileInput.sendKeys("C:/path/to/file.jpg");
Die Idee ist, den absoluten Pfad zur Datei direkt an ein Element zu senden, auf das Sie normalerweise klicken würden, um das modale Fenster zu erhalten – das heißt <input type="file" /> Element.
1
Danke, das Problem ist, dass “sendKeys” bei mir nicht funktioniert, weil ich die Datei über einen Ajax-Aufruf hochlade, bevor ich das Formular sende. Aber vielleicht hilft es anderen. 🙂
– Alex
24. Mai ’12 um 8:14
3
Aber. Es füllt nur den Pfad aus, alle Ajax-Aufrufe sollte gelöst werden nach dem <input> verliert den Fokus (was bedeutet, dass nach dem sendkeys() Anruf, Sie müssen außerhalb des klicken <input> oder fang an einen anderen zu füllen für onchange Skripte zum Auslösen).
– Petr Janeček
24. Mai ’12 um 8:19
Ja, Sie haben Recht, aber der Dateiupload, den ich verwende, verwendet ein gefälschtes Eingabefeld, das nur den Namen der hochgeladenen Datei anzeigt. Der Ajax wird nicht ausgelöst, wenn dieses Feld den Fokus verliert. Es ist nicht wirklich einfach und kann so nicht getestet werden, obwohl es mir viel lieber wäre.
– Alex
24. Mai ’12 um 8:33
1
Spaß. Mich würde das Innenleben wirklich interessieren. Hoffentlich nicht :).
– Petr Janeček
24. Mai ’12 um 8:35
Ich möchte hinzufügen, vielleicht möchten Sie verwenden C:\path\to\file.jpg anstatt C:/path/to/file.jpg.
– fettes Huhn13
22. Okt ’12 um 19:38
Kasun Mathota
Danke Alex,
Java Robot API hat mir beim Hochladen der Datei geholfen. Ich hatte genug vom Datei-Upload mit WebDriver. Folgendes ist der Code, den ich verwendet habe (kleine Änderung an Ihrem):
Danke Alex! Ich brauchte dies, da ich die sendKeys-Funktion nicht zum Laufen bringen konnte, wenn sie über das Play Framework 2.1 (fluentlenium Wrapper) verwendet wurde. Ich teste über Firefox [17.0.7] für Mac und musste ein paar Mods machen, damit es funktioniert. Unten ist eine Annäherung an das letzte Snippet, das ich verwendet habe.
val file = new File(PATH_TO_IPA)
val stringSelection: StringSelection = new StringSelection(file.getAbsolutePath)
Toolkit.getDefaultToolkit.getSystemClipboard().setContents(stringSelection, null)
val robot: Robot = new Robot()
// Cmd + Tab is needed since it launches a Java app and the browser looses focus
robot.keyPress(KeyEvent.VK_META)
robot.keyPress(KeyEvent.VK_TAB)
robot.keyRelease(KeyEvent.VK_META)
robot.keyRelease(KeyEvent.VK_TAB)
robot.delay(500)
robot.keyPress(KeyEvent.VK_META)
robot.keyPress(KeyEvent.VK_SHIFT)
robot.keyPress(KeyEvent.VK_G)
robot.keyRelease(KeyEvent.VK_META)
robot.keyRelease(KeyEvent.VK_SHIFT)
robot.keyRelease(KeyEvent.VK_G)
robot.keyPress(KeyEvent.VK_META)
robot.keyPress(KeyEvent.VK_V)
robot.keyRelease(KeyEvent.VK_META)
robot.keyRelease(KeyEvent.VK_V)
robot.keyPress(KeyEvent.VK_ENTER)
robot.keyRelease(KeyEvent.VK_ENTER)
robot.delay(500)
robot.keyPress(KeyEvent.VK_ENTER)
robot.keyRelease(KeyEvent.VK_ENTER)
Schön zu hören. Ah! und danke fürs Teilen deiner Lösung 🙂
– Alex
30. Juli ’13 um 8:50
Hey Mashhood, könnten Sie mir bei der Konvertierung Ihrer Version des Keypress-Datei-Uploads auf dem Mac für die Verwendung mit den Python-Bindungen von Selen helfen: selenium.googlecode.com/svn/trunk/docs/api/py/webdriver/…. Auch ich konnte sendKeys nicht dazu bringen, für meinen Anwendungsfall richtig zu funktionieren.