web-dev-qa-db-fra.com

Comment gérer le téléchargement de fichiers Windows avec Selenium WebDriver?

J'ai vu beaucoup de questions et de solutions sur le téléchargement de fichiers à l'aide de Selenium WebDriver sur Stackoverflow. Mais aucun des travaux pour le scénario suivant. 

Quelqu'un a donné la solution comme suit 

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");

Mais je ne trouve toujours pas de poignée de fenêtre, comment puis-je y travailler?

Screenshot

Je cherche une solution pour le scénario ci-dessus 

Veuillez vérifier ceci pour l’un des sites Web suivants

http://www.uploadify.com/demos/
http://www.zamzar.com/
34
Jasmine.Olivra

Le code ci-dessous fonctionne pour moi:

public void test() {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.freepdfconvert.com/pdf-Word");
    driver.findElement(By.id("clientUpload")).click();
    driver.switchTo()
            .activeElement()
            .sendKeys(
                    "/home/likewise-open/GLOBAL/123/Documents/filename.txt");
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    driver.findElement(By.id("convertButton"));
9
Emmanuel Angelo.R

En utilisant C # et Selenium ce code ici fonctionne pour moi,NOTEvous voudrez utiliser un paramètre pour permuter "localhost" dans l'appel FindWindow pour votre serveur particulier s'il ne s'agit pas de localhost et de suivi qui est la dernière boîte de dialogue ouverte s'il y a plus d'une boîte de dialogue, mais ceci devrait vous aider à démarrer:

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    public static void UploadFile(this IWebDriver webDriver, string fileName)
    {
        webDriver.FindElement(By.Id("SWFUpload_0")).Click();
        var dialogHWnd = FindWindow(null, "Select file(s) to upload by localhost");
        var setFocus = SetForegroundWindow(dialogHWnd);
        if (setFocus)
        {
            Thread.Sleep(500);
            SendKeys.SendWait(fileName);
            SendKeys.SendWait("{ENTER}");
        }
    }
2
Matt

Importez le fichier binaire System.Windows.Forms dans la solution test et appelez les deux LOC suivants en cliquant sur le bouton Télécharger de l'interface utilisateur.

        // Send the file path and enter file path and wait.
        System.Windows.Forms.SendKeys.SendWait("complete path of the file");
        System.Windows.Forms.SendKeys.SendWait("{ENTER}");
1
Sham

Il existe un moyen plus simple de résoudre ce problème que Slanec a décrit. Cette solution fonctionne lorsque vous utilisez un clavier anglais, sinon vous aurez du mal à essayer de "mapper" la touche pour les caractères spéciaux.

Au lieu de robot.keyPress et robot.keyRelease chaque clé, vous pouvez utiliser Toolkit pour copier la chaîne dans le presse-papiers, puis la coller.

    StringSelection s = new StringSelection("Path to the file");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(s, null);
    Robot robot = new Robot();
    robot.keyPress(Java.awt.event.KeyEvent.VK_ENTER);
    robot.keyRelease(Java.awt.event.KeyEvent.VK_ENTER);
    robot.keyPress(Java.awt.event.KeyEvent.VK_CONTROL);
    robot.keyPress(Java.awt.event.KeyEvent.VK_V);
    robot.keyRelease(Java.awt.event.KeyEvent.VK_CONTROL);
    Thread.sleep(3000);
    robot.keyPress(Java.awt.event.KeyEvent.VK_ENTER);
1
Bruno Pontes

J'ai utilisé sendkeys dans les scripts Shell à l'aide d'un fichier vbsscript. Ci-dessous le code dans le fichier vbs,

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "C:\Demo.txt"
WshShell.SendKeys "{ENTER}"

Ci-dessous, la ligne de code Selenium pour exécuter ce fichier vbs,

driver.findElement(By.id("uploadname1")).click();
Thread.sleep(1000);
Runtime.getRuntime().exec( "wscript C:/script.vbs" );
1
Vignesh Sunder

Le code ci-dessous fonctionne pour moi: 

// wait for the window to appear
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());

// switch to the file upload window
Alert alert = driver.switchTo().alert();

// enter the filename
alert.sendKeys(fileName);

// hit enter
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);

// switch back
driver.switchTo().activeElement();
1
Rahul Kaup

Vous avez mis une double barre oblique \\ pour le chemin absolu complet pour atteindre cet objectif Exemple: - D: \\ images \\ Lighthouse.jpg

Pas - Utilisez sendkeys pour le bouton avec option de navigation (Le bouton qui ouvrira votre fenêtre pour sélectionner les fichiers) - Cliquez maintenant sur le bouton qui va télécharger votre fichier

driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg");  
Thread.sleep(5000);
driver.findElement(By.xpath("//button[@id='Upload']")).click();
0
Shubham Jain

Recherchez l'élément (il doit s'agir d'un élément d'entrée avec l'attribut type = "fichier") et envoyez le chemin d'accès au fichier. 

WebElement fileInput = driver.findElement(By.id("uploadFile"));
fileInput.sendKeys("/path/to/file.jpg");

REMARQUE: Si vous utilisez un RemoteWebDriver, vous devez également définir un détecteur de fichier. La valeur par défaut est UselessFileDetector

WebElement fileInput = driver.findElement(By.id("uploadFile"));
driver.setFileDetector(new LocalFileDetector());
fileInput.sendKeys("/path/to/file.jpg");
0
Marissa Novak

Utilisez le script AutoIt pour gérer le téléchargement de fichiers dans Selenium Webdriver. Cela fonctionne bien pour le scénario ci-dessus.

Runtime.getRuntime().exec("E:\\AutoIT\\FileUpload.exe");

Veuillez utiliser le lien ci-dessous pour obtenir de l'aide: http://www.guru99.com/use-autoit-Selenium.html

0
Anumanth
        webDriver.FindElement(By.CssSelector("--cssSelector--")).Click();
        webDriver.SwitchTo().ActiveElement().SendKeys(fileName);

a bien fonctionné pour moi. Une autre approche fournie par Matt dans la réponse ci-dessus en C # .net pourrait également fonctionner avec le nom de classe n ° 32770 pour la boîte d'envoi. 

0
user6723403

Commencez par ajouter le fichier dans le répertoire de ressources de votre projet.

puis

public YourPage uploadFileBtnSendKeys() {
    final ClassLoader classLoader = getClass().getClassLoader();
    final File file = new File(classLoader.getResource("yourFile.whatever").getPath());
    uploadFileBtn.sendKeys(file.getPath());
    return this;
}

Walla, vous verrez le fichier que vous avez choisi et avez ignoré la fenêtre de l'explorateur de fichiers.

0
rogger2016

Une autre solution consisterait à écrire un script pour automatiser la boîte de dialogue Ouvrir un fichier. Voir AutoIt

De plus, si vous ne pouvez pas "cliquer" sur l'élément, ma solution consiste généralement à procéder comme suit:

element.SendKeys(Keys.Enter);

J'espère que cela vous aidera (même s'il s'agit d'un ancien post)

0
sparkyShorts