web-dev-qa-db-fra.com

Comment télécharger un fichier (image) avec Selenium, python

Comment télécharger une image sur une application Web avec l'outil de test Selenium? J'utilise python.

J'ai essayé beaucoup de choses, mais rien n'a fonctionné.

38
Filip

Télécharger le contrôle d'entrée ouvre une boîte de dialogue native (cela se fait par le navigateur). Un clic sur le bouton de contrôle ou de navigation via Selenium fera alors apparaître la boîte de dialogue et le test s'interrompra.

La solution de contournement consiste à définir la valeur de l'entrée de téléchargement via JavaScript (en Java, via JavascriptExecutor), puis de soumettre le formulaire.

Voir cette question pour un exemple en C #, je suis sûr qu’il existe également un moyen d’appeler JavaScript en Python, mais je n’ai jamais utilisé de liaisons Selenium Python.

4
Sergii Pozharov

Voici ce que je fais (assurez-vous que drv est une instance de webdriver):

drv.find_element_by_id("IdOfInputTypeFile").send_keys(os.getcwd()+"/image.png")

puis trouvez votre bouton d'envoi et cliquez dessus.

113
karloskar

Toutes ces approches ne fonctionneront pas avec les uploaders d’images modernes dans olx !!!

1. Automation of windows can be done using Autoit 
2. Install Autoit and SciTe Script editor 
3. Autoit code :(imageupload.au3)

WinActivate("File Upload");  for chrome use "open" that is the name of the window that pops 
send("D:\images\image1.png");  path of the file
Send("{ENTER}")

4. compile it to get an .exe file(imageupload.exe)
5. Now from python call the .exe file like

import os
import os.system('C:\images\imageupload.exe') #path of the .exe file
6
saravanan

J'ai ajouté une réponse à tous ceux qui cherchent à utiliser les désagréables msofiledialogs. Cela fonctionne avec la solution proposée par saravanan, mais plus détaillé pour Python.

J'ai eu un problème similaire avec un script sur lequel je travaille pour une entreprise du côté. J'essaie de télécharger des documents pour les clients d'une entreprise, mais en raison du fonctionnement de leur site, je ne pouvais pas utiliser send_keys pour envoyer directement le chemin. Je devais donc me fier à msofiledialog.

  1. Il vous suffit d'installer AutoIt https://pypi.python.org/pypi/PyAutoIt/0.3 ou tout simplement "pip install -U pyautoit" via l'écran cmd

  2. tapez "import autoit" sur votre page de script 

  3. Tapez ce qui suit avant que la boîte de dialogue de fichier ne s'affiche dans votre script:

    autoit.win_active ("Open") autoit.control_send ("Open", "Edit1", r "C:\Utilisateurs\uu\Desktop\TestUpload.txt") autoit.control_send ("Open", "Edit1", "{ENTER}")

Il va chercher la fenêtre de dialogue de fichier ouvert et le remplir et appuyer sur entrée . "Ouvrir" est le titre de mon écran de dialogue de fichier. Mettez le titre de votre titre à la place de "Ouvrir". Il existe des moyens plus créatifs d'utiliser les fonctions d'AutoIt, mais il s'agit d'un moyen simple et direct pour les débutants.

Edit: NE PAS. N'utilisez PAS control_send sur la plupart des choses si vous pouvez les éviter. Il y a un problème bien connu d'envoi de texte erroné. Dans mon cas, le côlon dans mon chemin de fichier était en train d'être transformé en point-virgule. Si vous devez envoyer des clés d’entrée, cela devrait aller. Cependant, si vous devez envoyer du texte, utilisez control_set_text. Il a la même syntaxe.

autoit.control_set_text("Open","Edit1",r"C:\Users\uu\Desktop\TestUpload.txt")
6
Noctsol

J'utilise fin-uploader , l'exécution des tests Selenium avec pytest et cela a fonctionné pour moi:

    Elm = driver.find_element_by_xpath("//input[@type='file']")
    Elm.send_keys(os.getcwd() + "/tests/sample_files/Figure1.tif")

Aucune soumission de formulaire ou touche Entrée n'est nécessaire dans mon cas.

Merci pour toutes les réponses! Cela a beaucoup aidé!

3
AnaPana
import win32com.client

Shell = win32com.client.Dispatch("WScript.Shell")   
Shell.Sendkeys("C:\text.txt")  
Shell.Sendkeys("~")

Va résoudre le problème

1
user1859723

Voici le code que j'ai utilisé:

Imagepath = "C:\User\Desktop\image.png" driver.find_element_by_xpath('//html/body/input').send_keys(Imagepath) driver.find_element_by_xpath('//html/body/button').click()

J'accepte la réponse de karloskar. Remarque Cela ne fonctionne pas pour FireFox (59). Et cela fonctionne uniquement avec Chrome Driver. 

0
Arun K

En utilisant des éclats: 

browser.attach_file ('file_chooser_id', chemin_fichier_qualifié_intelligent)

0
Anjan Dash

J'ai utilisé le format de script ci-dessous pour télécharger les images. Cela peut vous aider.

   Imagepath=os.path.abspath('.\\folder1\\subfolder2\file1.jpg')
   driver.find_element_by_id("Id of the element").clear()            
   driver.find_element_by_id("Id of the element").send_keys(Imagepath)

si vous ne possédez pas d'identifiant pour l'objet, vous pouvez utiliser le sélecteur xpath ou css en conséquence.

0
Tester P