web-dev-qa-db-fra.com

Comment gérer le téléchargement de fichiers dans l'automatisation des tests à l'aide de Selenium ou de WebDriver

Je pense que tout le monde utilise Webdriver pour l'automatisation de tests doit être conscient de ses grands avantages pour le développement Web.

Mais il y a un énorme problème si le téléchargement de fichiers fait partie de votre flux Web. Il cesse d'être automatisé de test. Les restrictions de sécurité des navigateurs (appel de la sélection de fichier) rendent pratiquement impossible l'automatisation des tests.

En tout état de cause, WebDriver ne peut cliquer que sur le bouton de téléchargement de fichier, mettre le thread en veille, laisser le développeur/le testeur sélectionner le fichier manuellement, puis effectuer le reste du flux Web.

Comment gérer cela, y a-t-il un moyen de le contourner? Parce que ça ne peut vraiment pas être fait comme ça. Cela n'aurait aucun sens.

C’est le seul cas que je connaisse lorsque les restrictions de sécurité du navigateur ne s’appliquent pas:

<script language=javascript>   
  function window.onload(){   
          document.all.attachment.focus();   
          var WshShell=new ActiveXObject("WScript.Shell")   
          WshShell.sendKeys("D:\MyFile.doc")
  }   
</script>
23
lisak

Webdriver peut gérer cela assez facilement dans IE et Firefox. C'est un cas simple de trouver l'élément et de taper dedans.

driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("myfile.txt")

L'exemple ci-dessus est en Python mais vous avez l'idée

40
AutomatedTester

Utiliser AWT Robots est une option, si vous utilisez Java, ce que vous êtes. Mais ce n'est pas une bonne option, ce n'est pas très fiable, et pas propre du tout. Regardez ici

J'utilise HttpClient et exécute quelques tests en dehors de Selenium. C'est plus fiable et plus propre.

Voir le code ci-dessous. Vous aurez besoin de davantage de gestion d'exceptions et de conditions pour l'adapter à votre travail.

HttpClient c = new HttpClient();
String url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/j_security_check";
PostMethod post = new PostMethod(url);
post.setParameter("j_username", username);
post.setParameter("j_password", password);
c.executeMethod(post);

url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/myurl.html";
MultipartPostMethod mPost = new MultipartPostMethod(url);
String fileNameWithPath = this.getClass().getClassLoader().getResource(filename).getPath();
File f1 = new File(fileNameWithPath);
mPost.addParameter(elementName, f1);
mPost.addParameter("action", "upload");
mPost.addParameter("ajax", "true");

c.executeMethod(mPost);
mPost.getResponseBodyAsString();
2
rahul

La suggestion de taper dans la zone de texte ne fonctionne que si celle-ci est activée . De nombreuses applications vous obligent à utiliser le navigateur de fichiers du système de fichiers pour des raisons évidentes . Que faites-vous alors? I. ne pensez pas que les pilotes WebDriver ont pensé à présenter simplement les clés dans la mémoire tampon KeyBoard (auparavant, c'était une "évidence" dans les premiers jours d'automatisation)

===

Après plusieurs jours de peu de sommeil, de coups dans la tête et de tirer les cheveux, j'ai pu me procurer une partie de la solution à base de robot suggérée ici (et ailleurs).

Le problème que j'ai rencontré est que la zone de texte de la boîte de dialogue contenant le chemin et le nom de fichier correct ne peut pas répondre aux événements KeyPress/Release consistant à mettre fin au nom de fichier avec VK_ENTER, comme suit:

private final static int Enter = KeyEvent.VK_ENTER;
keyboard.keyPress(Enter);
keyboard.keyRelease(Enter);

Ce qui se passe, c’est que le chemin et le nom du fichier sont correctement entrés, mais que la boîte de dialogue reste ouverte - malgré mon espoir constant et ma prière que l’émulation de la clé l’arrête et soit traitée par l’application testée.

Est-ce que quelqu'un sait comment amener ce robot à se comporter un peu mieux?

1
user3037058

Je pensais juste que je fournirais un FYI au message original de l'auteur sur l'utilisation d'ActiveX. Une autre solution consiste à intégrer les outils d'automatisation de l'interface graphique de bureau pour effectuer le travail. Par exemple, Google "Selenium AutoIt". Pour une solution plus multi-plateforme, envisagez des outils tels que Sikuli sur AutoIt.

Bien entendu, cela n’envisage pas le support de WebDriver pour les téléchargements sur IE et Firefox via SendKeys, ni pour d’autres navigateurs où cette méthode ne fonctionne pas.

1
David

Si vous utilisez une grille, vous pouvez ouvrir le dossier des fichiers de test pour le partage.

De cette façon, vous pouvez sélectionner le champ de saisie de téléchargement et définir sa valeur sur \\ pc-name\myTestFiles

Si vous ne l'êtes pas, vous devriez utiliser des fichiers locaux sur chaque système.

0
HerrWalter

Après avoir passé trop de temps sur ce problème, je voulais dire à la communauté que Firefox 7.0.1 semblait présenter un problème avec l'implémentation de FirefoxDriver sendKeys () mentionnée ci-dessus (du moins, je ne pouvais pas le faire fonctionner. sous Windows 7 x64), je n’ai pas trouvé de solution de contournement, mais la mise à jour vers Firefox 8.0.1 semble avoir résolu le problème. Pour ceux qui s’interrogent, il est également possible d’utiliser Selenium RC pour résoudre ce problème (bien que vous deviez prendre en compte tous vos systèmes d’exploitation cibles et les raccourcis clavier nécessaires pour interagir avec leurs boîtes de dialogue de sélection de fichiers). Espérons que les problèmes sur lesquels je devais travailler épargnent un peu de temps aux autres, en résumé: 

https://Gist.github.com/1511360

0
Matthew Madson