comment selenium WebDriver télécharge des fichiers vers le navigateur?

je suis un développeur javascript / java et j'ai essayé de comprendre comment le selenium WebDriver automation framework télécharge des fichiers depuis le système de fichiers. Il est impossible de définir une entrée de fichier via javascript car il s'agit d'une violation de la sécurité. Pourtant, webdriver est capable de le faire avec la commande suivante:

driver.setFileDetector(new LocalFileDetector());
WebElement upload = driver.findElement(By.id("myfile"));
upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
driver.findElement(By.id("submit")).click();

alors ils fixent la valeur en lui envoyant des clés? Je n'ai pas l'obtenir. J'ai cherché dans le code source trouvé ici: http://code.google.com/p/selenium/source/checkout Je n'arrive toujours pas à trouver où ils font ça.

Edit: ma question n'est pas de savoir comment faire avec le sélénium, mais comment les développeurs du sélénium ont-ils rendu cela possible? Comment ont-ils contourné les restrictions de sécurité dans javascript? Comment sont-ils le téléchargement du fichier?

34
demandé sur justspamjustin 2012-12-20 04:58:11

6 réponses

bonne question mon pote...ils ont écrit un mandataire HTTP pour résoudre les restrictions de sécurité Javascript. L'utilisation de ce proxy a permis de contourner de nombreuses contraintes de la Politique "même origine hôte", où un navigateur ne permet pas à Javascript de faire des appels vers autre chose que le serveur à partir duquel la page actuelle a été servie.

en outre WebDriver utilise l'approche alternative de mise à feu des événements au niveau de L'OS. Comme ces "événements natifs" ne sont pas générés par navigateur cette approche contourne les restrictions de sécurité imposées sur les événements synthétisés et, parce qu'ils sont spécifiques à un OS, une fois qu'ils fonctionnent pour un navigateur sur une plate-forme particulière, réutiliser le code dans un autre navigateur est relativement facile.

la plus grande partie du contenu ci-dessus est référencé à partir de ce qui suit..lisez la référence suivante pour plus de détails sur Selenium internals

http://www.aosabook.org/en/selenium.html

17
répondu Anuragh27crony 2012-12-20 06:57:02

les codes HTML de la fonction de fichier upload windowns sont:

<input id="fileField" type="file" onchange="document.getElementById('textfield').value=this.value" name="position">   

<input type="submit" value="导入">

vous pouvez utiliser les codes suivants pour terminer le téléchargement d'un fichier windows. Il fonctionne avec succès et les codes n'incluent pas le fait de cliquer sur une action de téléchargement.

driver.FileDetector = new LocalFileDetector();
FindElement(By.Id("fileField")).SendKeys(@"C:\Users\admin\Desktop\ProfessionCodes.txt"); FindElement(By.CssSelector("input[type='submit']")).Click();
4
répondu user2637184 2013-07-31 08:37:27

j'ai Téléchargé de photo sur Facebook en Utilisant Selenium Webdriver et AutoIt

les Étapes sont comme ci-dessous

Etape 1

Sur eclipse code Jusqu'à (Télécharger une Photo) est comme ci-dessous:

WebElement Upload = Firefox.findElement(By.cssSelector("input[id^='u_']"));
Upload.click();

Etape 2

Téléchargé et installer AutoIt: http://www.autoitscript.com/site/autoit/downloads/ (Télécharger le ZIP)

Etape 3

Écrire le code comme ci-dessous dans le bloc-notes et enregistré comme PhotoUpload.au3

WinWaitActive("File Upload")
Send("D:\Photo0116.jpg")   
Send("{ENTER}")

Etape 4: clic Droit sur cette .au3 Fichier et de le compiler.

Etape 5: Ajouter le code dans le fichier de script comme ci-dessous:

try {
    String[] commands = new String[]{};
    // Location of the autoit executable
    commands = new String[] {"D:\My softwares\install software\selenium\UploadPhoto3.exe"};
    Runtime.getRuntime().exec(commands);
}       
catch (IOException e) {}

Etape 6: Exécuter le script (PhotoUpload.java)

Étape 7: Photo téléchargée avec succès.

2
répondu Vrushali Haldankar 2013-09-03 15:56:14
  //assuming driver is a healthy WebDriver instance
    WebElement fileInput = driver.findElement(By.name("uploadfile"));
   fileInput.sendKeys("C:/path/to/file.jpg");

ou

 driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");

Essayez ceci et laissez-moi savoir

0
répondu Ankit jain 2012-12-20 04:04:32

dans certains cas, spécialement avec Java, vous devez créer un objet File et passer l'absolutePath () au pilote, comme suit:

File file = new File(sampleFile);
driver.findElement(By.id("<Your input tag with type of File>")).sendKeys(file.getAbsolutePath());

Exemple de fichier est une chaîne qui pointent vers le fichier qui doit être téléchargé. Cela fonctionne pour moi dans Firefox et Chrome.

0
répondu pouyanghasemi 2013-03-04 18:52:50

Cela m'a aidé à faire un téléchargement de fichier,

Code:

 public class FileUpload {
        @Test
        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"));
            /*
             * driver.switchTo().activeElement()
             * .sendKeys("selenium_2_testing_tools.pdf"); ;
             */
         {
                driver.wait(30000);
            } catch (Exception er) {
                System.out.println(er);
            }

        }
    }
0
répondu Emmanuel Angelo.R 2014-04-15 06:37:44