Une solution pour le téléchargement de fichiers en utilisant Java robot API avec Selenium WebDriver par Java
J'ai vu que beaucoup de gens ont 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 finalement trouvé une solution, donc je vais la poster ici en espérant que cela aide quelqu'un d'autre.
Quand 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" apparaisse. Et puis je copie le chemin d'accès au fichier dans le presse-papiers, puis collez-le dans la fenêtre "Ouvrir" et cliquez sur "Entrer". Cela fonctionne parce que lorsque la fenêtre "Ouvrir" apparaît, le focus est toujours dans le bouton "Ouvrir".
Vous aurez besoin de ces classes et de cette méthode:
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 "Ouvrir":
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. Il est travaillé pour moi, j'espère que cela fonctionne pour certains d'entre vous.
4 réponses
En fait, il existe une technique intégrée pour cela aussi. Il devrait fonctionner dans tous les navigateurs et systèmes d'exploitation.
Sélénium 2 (WebDriver) Java exemple:
// 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 vers le fichier à un élément qui vous aurait généralement cliquez sur à pour obtenir la fenêtre modale - c'est - <input type='file' />
élément.
Merci Alex,
Java Robot API m'a aidé à télécharger le fichier. J'étais fedup avec le téléchargement de fichiers en utilisant 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);
Merci Alex! J'en avais besoin 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 j'ai dû faire quelques mods pour le faire fonctionner. Voici 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)
La commutation de l'application sur Mac est beaucoup mieux à faire avec AppleScript. AppleScript est intégré au système, donc il sera toujours fonctionnel et ne dépend pas de l'ordre des applications sur Cmd+Tab. Votre test / application sera moins fragile. https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html
Vous devez seulement détecter que vous êtes sur mac et a le nom de l'application.
Runtime runtime = Runtime.getRuntime();
String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
Process process = runtime.exec(args);