web-dev-qa-db-fra.com

Téléchargement de fichier à l'aide de Selenium WebDriver et de la classe Java Robot

J'utilise Selenium WebDriver et Java et j'ai besoin d'automatiser la fonctionnalité de téléchargement de fichier. J'ai beaucoup essayé, mais dès que vous cliquez sur le bouton Parcourir et qu'une nouvelle fenêtre s'ouvre, le script cesse de s'exécuter et reste bloqué. J'ai essayé à la fois FireFox et IE, mais en vain.

J'ai aussi essayé en appelant un fichier exoit autoit, mais lorsque la nouvelle fenêtre s'ouvre en cliquant sur le bouton Parcourir, la déclaration particulière 

Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe")

ne pouvait pas être utilisé. Aide aimablement

16
Parikshit

Cela devrait fonctionner avec les pilotes Firefox, Chrome et IE.

FirefoxDriver driver = new FirefoxDriver();

driver.get("http://localhost:8080/page");

File file = null;

try {
    file = new File(YourClass.class.getClassLoader().getResource("file.txt").toURI());
} catch (URISyntaxException e) {
    e.printStackTrace();
}

Assert.assertTrue(file.exists()); 

WebElement browseButton = driver.findElement(By.id("myfile"));
browseButton.sendKeys(file.getAbsolutePath());
23
lisak

Je pense que je dois ajouter quelque chose à la réponse de Alex .

J'ai essayé d'ouvrir la fenêtre Ouvrir en utilisant ce code:

driver.findElement(My element).click()

La fenêtre s’est ouverte, mais le pilote ne répondait plus et les actions du code n’avaient même pas abouti aux actions du robot .. Je ne sais pas pourquoi, et probablement parce que le navigateur avait perdu le focus.

Pour y parvenir, j'ai utilisé la classe Actions Selenium:

 Actions builder = new Actions(driver);

 Action myAction = builder.click(driver.findElement(My Element))
       .release()
       .build();

    myAction.perform();

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

Cliquez sur le bouton et utilisez le code ci-dessous. Notez l'utilisation de '\\' au lieu de '\' dans le nom du chemin, il est important que le code fonctionne ..

WebElement file_input = driver.findElement(By.id("id_of_button"));
file_input.sendKeys("C:\\Selenium\\ImageUpload_FF.exe");
3
Amith

En utilisant RemoteWebElement classe, vous pouvez télécharger le fichier à l'aide du code suivant.

// TEST URL: "https://www.filehosting.org/"
// LOCATOR: "//input[@name='upload_file'][@type='file'][1]"

LocalFileDetector detector = new LocalFileDetector();
File localFile = detector.getLocalFile( filePath );
RemoteWebElement input = (RemoteWebElement) driver.findElement(By.xpath( locator ));
input.setFileDetector(detector);
input.sendKeys(localFile.getAbsolutePath());
input.click();


Téléchargez un fichier avec Java Selenium: sendKeys() ou Robot Class .

Cette méthode consiste à définir le chemin de fichier spécifié sur le ClipBoard.

  1. Copier les données sur ClipBoard en tant que.

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

  1. Localisez le fichier dans la fenêtre du Finder et appuyez sur OK pour sélectionner le fichier.
    • GAGNER [ Ctrl + V]
    • MAC
      • " Go To Folder " - Command ⌘ + Shift + G.
      • Coller - Command ⌘ + V et
      • appuyez sur OK pour l'ouvrir.

enum Action {
    WIN, MAC, LINUX, SEND_KEYS, FILE_DETECTOR;
}
public static boolean FileUpload(String locator, String filePath, Action type) {
    WebDriverWait explicitWait = new WebDriverWait(driver, 10);

    WebElement element = explicitWait.until(ExpectedConditions.elementToBeClickable( By.xpath(locator) ));
    if( type == Action.SEND_KEYS ) {
        element.sendKeys( filePath );
        return true;
    } else if ( type == ActionType.FILE_DETECTOR ) {
        LocalFileDetector detector = new LocalFileDetector();
        File localFile = detector.getLocalFile( filePath );
        RemoteWebElement input = (RemoteWebElement) driver.findElement(By.xpath(locator));
        input.setFileDetector(detector);
        input.sendKeys(localFile.getAbsolutePath());
        input.click();
        return true;
    } else {
        try {
            element.click();

            Thread.sleep( 1000 * 5 );

            setClipboardData(filePath);

            Robot robot = new Robot();
            if( type == Action.MAC ) { // Apple's Unix-based operating system.

                // “Go To Folder” on Mac - Hit Command+Shift+G on a Finder window.
                robot.keyPress(KeyEvent.VK_META);
                robot.keyPress(KeyEvent.VK_SHIFT);
                robot.keyPress(KeyEvent.VK_G);
                robot.keyRelease(KeyEvent.VK_G);
                robot.keyRelease(KeyEvent.VK_SHIFT);
                robot.keyRelease(KeyEvent.VK_META);

                // Paste the clipBoard content - Command ⌘ + V.
                robot.keyPress(KeyEvent.VK_META);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_META);

                // Press Enter (GO - To bring up the file.)
                robot.keyPress(KeyEvent.VK_ENTER);
                robot.keyRelease(KeyEvent.VK_ENTER);
                return true;
            } else if ( type == Action.WIN || type == Action.LINUX ) { // Ctrl + V to paste the content.

                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
            }

            robot.delay( 1000 * 4 );

            robot.keyPress(KeyEvent.VK_ENTER);
            robot.keyRelease(KeyEvent.VK_ENTER);
            return true;
        } catch (AWTException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return false;
}

Test de téléchargement de fichier : - Vous pouvez trouver le fichier fileUploadBytes.html en cliquant sur Try it Yourself .

public static void uploadTest( RemoteWebDriver driver ) throws Exception {
    //driver.setFileDetector(new LocalFileDetector());
    String baseUrl = "file:///D:/fileUploadBytes.html";
    driver.get( baseUrl );
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    FileUpload("//input[1]", "D:\\log.txt", Action.SEND_KEYS);

    Thread.sleep( 1000 * 10 );

    FileUpload("//input[1]", "D:\\DB_SQL.txt", Action.WIN);

    Thread.sleep( 1000 * 10 );

    driver.quit();
}

Utilisation de Selenium: sendKeys () Lorsque vous souhaitez transférer un fichier (reportez-vous à un fichier local) de votre ordinateur local au serveur Grid-Node, vous devez utiliser la méthode setFileDetector . En utilisant ce Selenium-Client, le fichier sera transféré via le protocole JSON Wire. Pour plus d'informations, voir saucelabs fileUpload Example

driver.setFileDetector(new LocalFileDetector());
0
Yash

Le moment après que la boîte de dialogue modale s'ouvre, le script ne fonctionnera pas, il se bloque. Alors appelez d'abord autoit.exe puis cliquez pour ouvrir la boîte de dialogue modale.

Cela fonctionne bien comme ça,

 Runtime.getRuntime().exec("Upload_IE.exe");
 Selenium.click("//input[@name='filecontent']");
0
Madhumitha

J'utilise aussi le sélecteur Web et Java, et j'ai le même problème… .. Ce que je fais est de copier le chemin d'accès au fichier dans le presse-papier, puis de le coller dans la fenêtre «Ouvrir» et de cliquer sur «Entrée». Cela fonctionne car le focus est toujours dans le bouton "Ouvrir".

Voici le code:

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.

0
Alex