web-dev-qa-db-fra.com

Selenium WebDriver et les navigateurs sélectionnant un dialogue de fichier

J'utilise le webdriver Selenium, C #.

Est-il possible de faire fonctionner WebDriver avec Firefox le dialogue de sélection de fichier? Ou dois-je utiliser quelque chose comme AutoIt?

18
Oleg Strokatyy

Si vous essayez de sélectionner un fichier à télécharger, Selenium 2 prend en charge les entrées de fichier HTML. Par exemple:

HTML

<input type="file" id="uploadhere" />

Code sélénium

IWebElement element = driver.FindElement(By.Id("uploadhere"));
element.SendKeys("C:\\Some_Folder\\MyFile.txt");

Fondamentalement, vous "tapez" (avec SendKeys) le chemin d'accès complet à l'élément d'entrée de fichier. Sélénium gère la boîte de dialogue de sélection de fichier pour vous.

Toutefois, si vous souhaitez manipuler une boîte de dialogue de sélection de fichier arbitraire, comme le dit Anders, vous devez sortir de Selenium.

31
prestomanifesto

Non, WebDriver ne peut pas interagir avec les boîtes de dialogue. En effet, les boîtes de dialogue sont le domaine du système d'exploitation et non la page Web.

Je connais des gens qui ont eu de la chance avec autoit ainsi que l’API d’automatisation fournie par .Net.

Une autre option consisterait à ignorer entièrement le dialogue de fichier et à émettre un POST ou un GET, mais cela nécessite une connaissance plus avancée du site Web et une compréhension de la construction d'un POST/GET.

Vous pouvez essayer Webinator , il est similaire à Selenium dans le sens où il est alimenté par WebDriver. Il offre des possibilités de dialogue de fichier et j'ai eu beaucoup de succès avec cela.

8
Anders

Voici une autre solution utilisant remotewebdriver, cela fonctionne comme par magie et j'ai adoré.

Voici le cours que j'ai:

driver.findElementByLinkText("Upload Files").click();
driver.setLogLevel(Level.ALL);
System.out.println(driver.getCurrentUrl());
WebElement element = driver.findElement(By.xpath("//input[@name='file_1']"));
LocalFileDetector detector = new LocalFileDetector();

//Now, give the file path and see the magic :)              
String path = "D://test66T.txt";
File f = detector.getLocalFile(path);
((RemoteWebElement)element).setFileDetector(detector);
element.sendKeys(f.getAbsolutePath());

//now click the button to finish
driver.findElementByXPath("//html/body/div[9]/div[1]/a/span").click(); 
4
Bijoy Meethal

Cela peut être fait comme suit, testé et fonctionnant avec Internet Explorer et le pilote Chrome 

var allowsDetection = this.Driver as IAllowsFileDetection;
if (allowsDetection != null)
{
   allowsDetection.FileDetector = new LocalFileDetector();
}

Driver.FindElement(By.Id("your-upload-input")).SendKeys(@"C:\PathToYourFile");

Référence https://groups.google.com/forum/#!msg/webdriver/KxmRZ8MkM4M/45CT4ID_WjQJ

1
DalSoft

Selon Nadim Saker

.Net a une bibliothèque pour gérer la boîte de dialogue de téléchargement de fichier. Il a une classe SendKeys qui a une méthode SendWait (clés de chaîne). Il envoie la clé donnée sur l'application active et attend que le message soit traité. Il ne retourne aucune valeur. 

1
Vadim

J'ai utilisé cela pour résoudre le problème ... essayez si tout ce qui précède ne fonctionne pas

    Actions action = new Actions(driver);
    action.SendKeys(pObjElement, Keys.Space).Build().Perform();

    Thread.Sleep(TimeSpan.FromSeconds(2));

    var dialogHWnd = FindWindow(null, "Elegir archivos para cargar"); // Here goes the title of the dialog window
    var setFocus = SetForegroundWindow(dialogHWnd);
    if (setFocus)
    {

        Thread.Sleep(TimeSpan.FromSeconds(2));
        System.Windows.Forms.SendKeys.SendWait(pFile);
        System.Windows.Forms.SendKeys.SendWait("{DOWN}");
        System.Windows.Forms.SendKeys.SendWait("{TAB}");
        System.Windows.Forms.SendKeys.SendWait("{TAB}");
        System.Windows.Forms.SendKeys.SendWait("{ENTER}");
    }

    Thread.Sleep(TimeSpan.FromSeconds(2));
}
0
José Carlos

Une autre approche consiste à utiliser System.Windows.Forms.SendKeys.SendWait("pathToFile")
Je l'utilise avec succès partout où je ne peux pas simplement envoyer les clés à l'élément tel que décrit par @prestomanifesto.

0
bewu