Eine Lösung für den Datei-Upload mit Java Robot API mit Selenium WebDriver von Java

Lesezeit: 5 Minuten

Eine Losung fur den Datei Upload mit Java Robot API mit
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”.

Sie benötigen diese Klassen und Methode:

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;


public static void setClipboardData(String string) {
   StringSelection stringSelection = new StringSelection(string);
   Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}

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.

Eine Losung fur den Datei Upload mit Java Robot API mit
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


1641583411 762 Eine Losung fur den Datei Upload mit Java Robot API mit
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):

Robot robot = new Robot();
robot.delay(1000);

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);
robot.delay(1000);

  • Freut mich zu hören, dass es dir geholfen hat 🙂

    – Alex

    10. Juli ’13 um 8:48

1641583411 560 Eine Losung fur den Datei Upload mit Java Robot API mit
Mashhood Rastgar

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.

    – jcuwaz

    4. August ’14 um 12:10 Uhr

Das Umschalten der Anwendung auf dem Mac ist viel besser mit AppleScript zu bewerkstelligen. AppleScript ist in das System integriert, so dass es immer funktionsfähig ist und nicht von der Reihenfolge der Apps auf Cmd+Tab abhängt. Ihr Test/Ihre App wird weniger anfällig sein.
https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html

Sie müssen nur erkennen, dass Sie auf einem Mac sind und den Namen der Anwendung haben.

Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app "Chrome" to activate" };
            Process process = runtime.exec(args);

.

178820cookie-checkEine Lösung für den Datei-Upload mit Java Robot API mit Selenium WebDriver von Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy