web-dev-qa-db-fra.com

Une solution pour le téléchargement de fichiers à l'aide de l'API Java Robot avec Selenium WebDriver de Java

J'ai constaté que de nombreuses personnes rencontraient des problèmes pour télécharger un fichier dans un environnement de test avec Selenium WebDriver. J'utilise le Selenium WebDriver et Java, et j'ai eu le même problème. J'ai enfin trouvé une solution, je vais donc la poster ici en espérant que cela aidera quelqu'un d'autre.

Lorsque j'ai besoin de télécharger un fichier dans un test, je clique avec Webdriver dans le bouton et attends que la fenêtre "Ouvrir" s'ouvre. Et puis je copie le chemin d'accès au fichier dans le presse-papiers, puis le colle dans la fenêtre "Ouvrir" et cliquez sur "Entrée". Cela fonctionne car lorsque la fenêtre "open" apparaît, le focus est toujours sur le bouton "open".

Vous aurez besoin de ces classes et méthodes:

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);
}

Et c'est ce que je fais, juste après avoir ouvert la fenêtre "ouverte":

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);

Et c'est tout. Cela fonctionne pour moi, j'espère que cela fonctionnera pour certains d'entre vous.

21
Alex

En fait, il existe une technique intégrée pour cela aussi. Cela devrait fonctionner dans tous les navigateurs et systèmes d'exploitation.

Exemple de Selenium 2 (WebDriver) Java:

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.xpath("//input[@type='file']"));
fileInput.sendKeys("C:/path/to/file.jpg");

L'idée est d'envoyer directement le chemin absolu du fichier à un élément sur lequel vous cliquez habituellement pour obtenir la fenêtre modale - c'est-à-dire l'élément <input type='file' />.

29
Petr Janeček

Merci Alex,

L'API Java Robot m'a aidé pour le téléchargement de fichier. J'avais marre de télécharger des fichiers avec WebDriver. Voici le code que j'ai utilisé (petite modification à la vôtre):

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);
3
Kasun Mathota

Merci Alex! J'avais besoin de cela car je ne pouvais pas faire fonctionner la fonction sendKeys lorsqu'elle était utilisée via Play framework 2.1 (wrapper Fluentlenium). Je teste sur Firefox [17.0.7] pour Mac et je dois faire quelques mods pour le faire fonctionner. Vous trouverez ci-dessous une approximation de l'extrait final que j'ai utilisé.

    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)
0
Mashhood Rastgar