web-dev-qa-db-fra.com

Comment Selenium Webdriver télécharge-t-il des fichiers dans le navigateur?

Je suis un développeur javascript/Java et j'ai essayé de comprendre comment le framework d'automatisation Selenium webdriver télécharge des fichiers à partir du 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 sécurité. Pourtant, le webdriver est en mesure 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();

Donc, ils définissent la valeur en lui envoyant des clés? Je ne comprends pas. J'ai parcouru le code source trouvé ici: http://code.google.com/p/Selenium/source/checkout Je ne suis toujours pas en mesure de trouver où ils font cela.

Edit: Ma question n'est pas de savoir comment faire cela avec Selenium, mais comment les développeurs de Selenium ont-ils rendu cela possible? Comment ont-ils contourné les restrictions de sécurité en javascript? Comment téléchargent-ils le fichier?

35
justspamjustin

Nice buddy question ... ils ont écrit un proxy 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 de la "même origine de l'hôte", où un navigateur ne permet pas à Javascript d'appeler autre chose que le serveur à partir duquel la page actuelle a été servie.

De plus, WebDriver utilise l'approche alternative de déclenchement d'événements au niveau du système d'exploitation. Comme ces "événements natifs" ne sont pas générés par le navigateur, cette approche contourne les restrictions de sécurité imposées aux événements synthétisés et, parce qu'ils sont spécifiques au système d'exploitation, une fois qu'ils fonctionnent pour un navigateur sur une plate-forme particulière, la réutilisation du code dans un autre navigateur est relativement facile.

La plupart du contenu ci-dessus est référencé ci-dessous..lisez la référence suivante pour plus de détails sur les composants internes du sélénium

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

18
Anuragh27crony

Les codes HTML de la fonction de téléchargement des fichiers 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. Cela fonctionne avec succès et les codes n'incluent pas 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();
3
user2637184

J'ai photo téléchargée sur Facebook à l'aide de Selenium Webdriver et AutoIt

Les étapes sont les suivantes

Étape 1

Sur le code Eclipse Upto (Télécharger une photo) est comme ci-dessous:

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

Étape 2

Téléchargé et installez AutoIt: http://www.autoitscript.com/site/autoit/downloads/ (Download Zip)

Étape 3

Écrivez le code comme ci-dessous dans le bloc-notes et enregistrez-le sous PhotoUpload.au3

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

Étape 4 : Faites un clic droit sur ce fichier .au3 et compilez-le.

Étape 5 : Ajoutez 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) {}

Étape 6 : exécutez le script (PhotoUpload.Java)

Étape 7 : La photo a été téléchargée avec succès.

2
Vrushali Haldankar
  //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 faites le moi savoir

0
Ankit jain