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? Je suis à l'aide de python.

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

33
demandé sur Nemo 2011-12-29 11:27:01

9 réponses

Upload input control ouvre un dialogue natif (il est fait par le navigateur) donc en cliquant sur le bouton de contrôle ou de navigation via Selenium va juste pop la boîte de dialogue et le test sera suspendu.

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

Voir cette question pour des exemples en C#, je suis sûr qu'il y a aussi une façon de faire des appels JavaScript dans Python mais je n'ai jamais utilisé de fixations Python au sélénium

4
répondu Sergii Pozharov 2017-05-23 12:26:03

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

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

et ensuite trouver votre bouton Soumettre et cliquez dessus.

101
répondu karloskar 2012-05-06 17:16:15

toutes ces approches ne fonctionneront pas avec des chargeurs d'image modernes en olx !!! Approche Alternative (uniquement pour windows )

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
répondu saravanan 2014-06-09 05:43:51

j'ai ajouté une réponse pour quiconque cherche à utiliser deal avec les fastidieux msofiledialogs. Cela fonctionne à partir de la solution proposée par saravanan, mais plus étoffé pour Python.

j'ai eu un problème similaire avec un script, je travaille pour une entreprise sur le côté. J'essaie de télécharger des documents pour les clients d'une entreprise, mais en raison de la façon dont leur site a fonctionné, Je ne pouvais pas utiliser send_keys pour envoyer directement le chemin, donc j'ai dû compter sur msofiledialog.

  1. vous n'avez qu'à installer AutoIt https://pypi.python.org/pypi/PyAutoIt/0.3 ou tout simplement "pip install-U pyautoit" à travers l'écran cmd

  2. type "d'importation autoit" sur votre page script

  3. tapez ce qui suit avant que la boîte de dialogue file apparaisse dans votre script:

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

il cherchera la fenêtre de dialogue Ouvrir le fichier et la remplira et pressera enter. "Ouvrir" est le titre de l'écran de dialogue de mon fichier. Mettez votre titre à la place de"ouvert". Il existe des façons plus créatives d'utiliser les fonctions D'AutoIt, mais c'est une façon simple et simple pour les débutants.

Edit: DO NOT. N'utilisez pas control_send sur la plupart des choses si vous pouvez l'éviter. Il a bien connue de la question de l'envoi erronée du texte. Dans mon cas, le côlon de mon chemin de fichier était transformé en un semi-côlon. Si vous avez besoin d'envoyer des touches d'entrée, il devrait être bon, mais si vous avez besoin d'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")
3
répondu Noctsol 2018-03-06 01:19:39
import win32com.client

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

résoudre le problème

1
répondu user1859723 2016-09-30 15:37:35

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 n'avez pas l'ID de l'objet ,vous pouvez utiliser xpath ou sélecteur css en conséquence.

0
répondu Tester P 2015-11-27 13:37:58

j'utilise fine-uploader , essais de sélénium 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")

dans mon cas, il n'est pas nécessaire de soumettre un formulaire ou D'entrer la clé.

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

0
répondu AnaPana 2017-10-02 15:42:02

utilisant splinter:

du navigateur.attach_file ("file_chooser_id", fully_qualified_file_path)

0
répondu Anjan Dash 2017-12-07 07:18:19

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 Il n'est pas de travail pour FireFox (59). Et cela fonctionne uniquement avec Chrome Driver.

0
répondu Arun K 2018-03-15 05:14:23