English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Le téléchargement de fichiers est un problème difficile que doivent affronter tous les tests d'automatisation des interfaces utilisateur. Aujourd'hui, le blogueur partage ici son expérience dans la gestion du téléchargement de fichiers, dans l'espoir de pouvoir aider les nombreux Seleniumers piégés par le téléchargement de fichiers.
Tout d'abord, nous devons distinguer les types de boutons de téléchargement, qui peuvent être généralement divisés en deux catégories : l'une est le champ input, et l'autre est plus complexe, implémentée par des technologies comme JavaScript, Flash, etc., et ne porte pas le tag input
Nous allons analyser ces deux types separately :
1.balise input
Il est bien connu que les balises input peuvent être directement utilisées avec send_keys, ce qui n'est pas une exception ici. Voici un exemple de code :
Exemple d'URL: http://www.sahitest.com/demo/php/fileUpload.htm
代码:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.get('http:')//sahitest.com/demo/php/fileUpload.htm') upload = driver.find_element_by_id('file') upload.send_keys('d:\\baidu.py') # send_keys print upload.get_attribute('value') # vérifier la valeur driver.quit()
Résultat :
baidu.py
Il est évident que pour l'envoi input, send_keys est la solution la plus simple.
2.Upload non input
Ensuite, la difficulté doit être augmentée, que faire pour ceux qui ne sont pas des zones de saisie input ? Ce type de téléchargement est très varié, il y a des a tags, des div, des boutons, des objects, nous ne pouvons pas supprimer ces téléchargements directement sur la page web, la seule solution est d'ouvrir la boîte de dialogue OS, pour traiter la boîte de dialogue.
Encore une fois, le problème avec la boîte de dialogue OS n'est plus résolu par selenium, que faire ? Très simple, utilisez des opérations au niveau OS pour le traiter, à ce stade, nous avons基本上找到了问题的处理方法.
Il y a généralement les solutions suivantes :
1.autoIT, avec l'aide d'autres forces, nous appelons l'au généré par3ou fichier exe.
2.Python pywin32library, reconnaître le handle de la boîte de dialogue, puis opérer
3.SendKeys library
4.keybd_event, avec3similaire, mais il s'agit de simuler des touches, ctrl+a, ctrl+c, ctrl+v…
Je ne connais que les quatre méthodes ci-dessus, si vous en connaissez d'autres, laissez un message pour me le faire savoir, afin que je puisse apprendre.
Voyons les un par un :
1. autoIT
Je parle déjà de la méthode d'envoi et de paramétrage autoIT dans un autre article de blog, veuillez consulter selenium autoit commande en ligne . Je ne vais pas répéter ici.
2.win32gui
Ne perdez pas de temps, mettons-nous au code d'abord :
Exemple d'URL: http://www.sahitest.com/demo/php/fileUpload.htm
代码:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://sahitest.com/demo/php/fileUpload.htm') upload = dr.find_element_by_id('file') upload.click() time.sleep(1) # win32gui dialog = win32gui.FindWindow('#32770', u'Envoi de fichier') # Boîte de dialogue ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None) Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # Rechercher les objets en succession, jusqu'à trouver le handle de l'objet zone de saisie Edit bouton = win32gui.FindWindowEx(dialog, 0, 'Button', None) # Identifier le bouton Button win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd:\\baidu.py') # Entrer l'adresse absolue dans la zone de saisie win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # Appuyer sur le bouton print upload.get_attribute('value') dr.quit()
Résultat :
baidu.py
Ici, vous avez besoin d'un petit outil très important : Spy++Il y a beaucoup de résultats sur Baidu, bien sûr, vous pouvez également utiliser l'outil intégré à autoIT, mais il n'est pas aussi utile, je recommande de télécharger un autre.
et, vous devez installer pywin32de la bibliothèque, vous pouvez aller àiciTrouvez la bibliothèque correspondant à votre version de Python, notez32doit être64doit correspondre à la version de Python que vous avez installée.
Après l'installation, vous pouvez voir PyWin dans le dossier 【Menu DémarrerPython】32de la documentation 【Documentation de Python pour Windows】,vous pouvez y trouver les API correspondantes des méthodes.
Brève présentation de ceux utilisés :
win32gui.FindWindow(lpClassName=None, lpWindowName=None):
•Recherche des fenêtres correspondant aux conditions de match à partir de la fenêtre en haut de la pile et retourne le handle de cette fenêtre.
•lpClassName : nom de la classe, dans Spy++y voir
•lpWindowName : nom de la fenêtre, le nom que vous pouvez voir dans la barre de titre
•Exemple de code pour trouver la fenêtre de téléchargement, vous pouvez n'utiliser qu'une partie, le classname est facilement perturbé par d'autres éléments, le windowname n'est pas stable, les boîtes de dialogue de téléchargement différentes peuvent avoir un window_name différent, la méthode de localisation dépend de votre situation.
win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
•Recherche des fenêtres dont le nom de classe et le nom de fenêtre correspondent et retourne le handle de cette fenêtre. Si elle ne trouve pas, elle retourne 0.
•hwndParent : si ce n'est pas 0, il recherche les sous-fenêtres de la fenêtre hwndParent.
•hwndChildAfter : si ce n'est pas 0, il suit l'ordre z-l'ordre de l'index commence par hwndChildAfter, sinon il commence par le premier sous-fenêtre.
•lpClassName : type de caractères, c'est le nom de la classe de la fenêtre, cela peut être vérifié dans Spy++y trouver.
•lpWindowName : type de caractères, c'est le nom de la fenêtre, c'est-à-dire le titre que vous pouvez voir dans la barre de titre.
•Exemple de code pour trouver la zone de saisie et le bouton OK de manière itérative
win32gui.SendMessage(hWnd, Msg, wParam, lParam)
•hWnd : entier, handle de la fenêtre recevant le message
•Msg : entier, message à envoyer, ces messages sont prédefinis par Windows, voir les messages définis par le système (System-Messages définis)
•wParam : entier, paramètre wParam du message
•lParam : entier, paramètre lParam du message
•Exemple de code pour saisir l'adresse du fichier dans la zone de saisie et cliquer sur le bouton OK
En ce qui concerne win32Le module api et d'autres méthodes, ici ne sont pas décrits en détail, ceux qui veulent en savoir plus peuvent chercher sur Baidu ou consulter pywin32Documentation.
3.SendKeys
Il faut d'abord installer la bibliothèque SendKeys, qui peut être installée via pip
pip install SendKeys
Exemple de code:
Exemple d'URL: http://www.sahitest.com/demo/php/fileUpload.htm
代码:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://sahitest.com/demo/php/fileUpload.htm') upload = dr.find_element_by_id('file') upload.click() time.sleep(1) # SendKeys SendKeys.SendKeys('D:\\baidu.py') # Envoyer l'adresse du fichier SendKeys.SendKeys("{ENTER}") # Envoyer la touche Entrée print upload.get_attribute('value') dr.quit()
Résultat :
baidu.py
SendKeys peut directement entrer des informations dans le point de focus, mais il faut noter qu'il faut un peu de temps d'attente après l'ouverture de la fenêtre, sinon il est facile de ne pas envoyer le premier caractère (ou vous pouvez ajouter un caractère inutile avant l'adresse), mais je pense que cette méthode est instable et n'est pas recommandée.
4.keybd_event
win32api fournit une méthode keybd_event() pour simuler les touches, mais cette méthode est assez difficile et instable, donc elle n'est pas recommandée. Voici quelques exemples de code, si vous souhaitez en savoir plus, cherchez sur Baidu.
# Trouver d'abord une case d'entrée, saisir l'adresse du fichier à télécharger, le couper dans le presse-papiers video.send_keys('C:\\Users\\Administrator\\Pictures\\04b20919fc78baf41fc993fd8ee2c5c9.jpg') video.send_keys(Keys.CONTROL, 'a') # selenium.send_keys (ctrl+a) video.send_keys(Keys.CONTROL, 'x') # (ctrl+x) driver.find_element_by_id('uploadImage').click() # Cliquez sur le bouton de téléchargement pour ouvrir la boîte de dialogue de téléchargement # Coller (ctrl + v) win32api.keybd_event(17, 0, 0, 0) # Appuyer sur le bouton ctrl win32api.keybd_event(86, 0, 0, 0) # Appuyer sur le bouton v win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) # Lever de bouton v win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按键 ctrl time.sleep(1) # 回车(enter) win32api.keybd_event(13, 0, 0, 0) # 按下按键 enter win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按键 enter ...
是不是很麻烦,当然,你甚至可以用按键把整个路径输入进去,不过,我想没人愿意这么做的。而且在此过程中你不能随意移动鼠标,不能使用剪贴板,太不稳定了,所以非常不建议你用这种办法。。
3.多文件上传
接下来还有一种情况值得我们考虑,那就是多文件上传。如何上传多个文件,当然我们还是往输入框里输入文件路径,所以唯一要搞清楚的就是多文件上传时,文件路径是怎么写的。
我来告诉你吧,多文件上传就是在文件路径框里用引号括起单个路径,然后用逗号隔开多个路径,就是这么简单,例如:
"D:\a.txt" "D:\b.txt"
但需要注意的是:只有多个文件在同一路径下,才能这样用,否则是会失败的(下面的写法是不可以的):
"C:\a.txt" "D:\b.txt"
接下里找一个例子试试:
示例网址:http://www.sucaijiayuan.com/api/demo.php?url=/demo/20150128-1
代码:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://www.sucaijiayuan.com/api/demo.php?url=/demo/20150128-1) dr.switch_to.frame('iframe') # 一定要注意frame dr.find_element_by_class_name('filePicker').click() time.sleep(1) dialog = win32gui.FindWindow('#32770', None) ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None) Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) bouton = win32gui.FindWindowEx(dialog, 0, 'Button', None) # Le code est le même que dans l'exemple précédent, mais ici les paramètres sont différents. Si vous le souhaitez, vous pouvez écrire une fonction de téléversement pour encapsuler la fonctionnalité de téléversement win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, '"d:\\baidu.py" "d:\\upload.py" "d:\\1.html"') win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, bouton) print dr.find_element_by_id('status_info').text dr.quit()
Résultat :
Sélectionné3Fichier, au total1.17KB。
Il est évident que le téléversement de plusieurs fichiers n'est pas aussi complexe, et c'est aussi simple, la seule différence étant les paramètres d'entrée.
Et nous pouvons constater qu'un point, c'est que le code de cette fenêtre est fondamentalement le même que dans les exemples précédents, ce qui signifie que nous pouvons extraire la partie de téléversement, écrire une fonction, de sorte que chaque fois que nous devons téléverser, nous appelons simplement la fonction et transmettons les paramètres.
Voyez, le téléversement est en fait très facile à gérer.
C'est tout pour cet article. J'espère que cela vous aidera dans vos études, et que vous continuerez à soutenir le tutoriel Yell.
Déclaration : le contenu de cet article est来源于网络,et appartient aux auteurs originaux. Le contenu est apporté par les utilisateurs d'Internet et téléchargé spontanément. Ce site n'appartient pas à la propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu présumé de violation de droits d'auteur, vous êtes invité à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu présumé de violation de droits d'auteur.)