English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Riassunto dei metodi di upload dei file di Python selenium

Il caricamento dei file è un problema che deve affrontare ogni test di automazione UI, oggi il blogger condivide la propria esperienza nel gestire il caricamento dei file, sperando di aiutare molti seleniumer intrappolati nel problema del caricamento dei file.

Prima di tutto, dobbiamo distinguere il tipo di pulsante di upload, in generale può essere diviso in due tipi, uno è il box input, l'altro è più complesso, realizzato tramite js, flash ecc., etichetta non input

Analizziamo entrambi questi:

1.Etichetta input

È noto a tutti che l'etichetta input può essere direttamente send_keys, non fa eccezione qui, vediamo l'esempio di codice:

Esempio di 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') # check value
driver.quit()

Risultato:

baidu.py

È chiaro che per l'upload input, send_keys è la soluzione più semplice.

2.Upload non input

Quindi la difficoltà deve essere aggiornata, cosa fare per quegli upload che non sono implementati come input box? Questo tipo di upload è molto vario, ci sono a etichette a, div, button, object, non possiamo rimuovere questi upload direttamente sulla pagina web, l'unica soluzione è aprire la finestra di avviso OS e gestire la finestra di avviso.

Ancora una volta, il livello di problemi che l'OS di avviso coinvolge non può essere risolto da selenium, cosa fare? È molto semplice, usare le operazioni di livello OS per gestirlo, a questo punto abbiamo基本上找到了问题的处理方法.

In generale ci sono le seguenti soluzioni:
 1.autoIT, con l'aiuto di forza esterna, chiamiamo il file au3 o exe generato.
 2.Biblioteca pywin32 di Python, riconosce l'handle del dialogo e quindi opera
 3.Biblioteca SendKeys
 4.keybd_event, simile al punto 3, ma è un'imitazione di tasti, ctrl+a, ctrl+c, ctrl+v... 

Al momento so solo delle quattro modalità menzionate sopra, se ci sono altri metodi, lasciate un messaggio per dirmi, così posso imparare.

Vediamo uno per uno:

1. autoIT

Ho già spiegato i metodi di upload di autoIT e parametrizzazione in un altro articolo, consulta selenium autoit command line parameters. Non ripeterò di nuovo.

2.win32gui

Non facciamo troppe chiacchiere, diamo un'occhiata al codice prima:

Esempio di 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'文件上传') # Dialogo
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) 
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # Cerca gli oggetti in sequenza, fino a trovare l'handle dell'oggetto di input Edit
button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # Determina il pulsante Button
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd:\\baidu.py') # Inserisci l'indirizzo assoluto nel campo di input
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # Clicca su button
print upload.get_attribute('value')
dr.quit()

Risultato:

baidu.py

Qui hai bisogno di uno strumento molto importante: Spy++, puoi trovarlo cercando su Baidu, ovviamente puoi anche usare gli strumenti integrati di autoIT, ma non è così utile, consiglio di scaricare un altro.

E, devi installare la libreria pywin32, puoi andare su:Ecco qui:Trova la libreria corrispondente alla tua versione di Python, presta attenzione a 32 bit o 64 bit devono corrispondere alla versione di Python installata.

Dopo l'installazione, vedrai la documentazione di PyWin32 nella cartella [Iniziare] > [Cartella Python] [Documentazione Python per Windows], dove puoi trovare le API corrispondenti.

Facciamo una breve introduzione a quelli utilizzati:

win32gui.FindWindow(lpClassName=None, lpWindowName=None):
 •Cerca la finestra che corrisponde ai criteri di ricerca partendo dalla finestra superiore e restituisci l'handle di questa finestra.
 •lpClassName: nome della classe, visibile in Spy++
 •lpWindowName: nome della finestra, il nome visibile nella barra del titolo
 •Nell'esempio di codice utilizziamo per trovare la finestra di upload, puoi usarne uno solo, utilizzare classname è facile essere interrotto da altre cose, utilizzare windowname è instabile, diversi dialoghi di upload potrebbero avere window_name diversi, come determinare dipende dalla tua situazione. 

win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
 •Cerca la finestra che corrisponde al nome della classe e del titolo, e restituisce l'handle di questa finestra. Se non trova nulla, restituisce 0.
 •hwndParent: se non è zero, cerca le finestre child dell'handle della finestra hwndParent.
 •hwndChildAfter: se non è zero, inizia a cercare le finestre child a partire da hwndChildAfter in base all'ordine di z-index, altrimenti inizia dalla prima finestra child.
 •lpClassName: tipo char, è il nome della classe della finestra, che può essere trovato in Spy++.
 •lpWindowName: tipo char, è il nome della finestra, ossia il titolo visibile nella barra del titolo.
 •Nell'esempio di codice utilizziamo per cercare gradualmente l'input e il pulsante conferma 

win32gui.SendMessage(hWnd, Msg, wParam, lParam)
 •hWnd: intero, l'handle della finestra che riceve il messaggio
 •Msg: intero, il messaggio da inviare, questi messaggi sono predefiniti da Windows, si può consultare i messaggi definiti dal sistema (System-Defined Messages)
 •wParam: intero, il parametro wParam del messaggio
 •lParam: intero, il parametro lParam del messaggio
 •Nell'esempio di codice utilizziamo per inserire l'indirizzo del file nell'input e cliccare sul pulsante conferma 

Riguardo al modulo win32api e altri metodi, non vengono descritti ulteriormente in questo contesto; per ulteriori informazioni, cercare su Baidu o consultare la documentazione di pywin32.

3.SendKeys

Prima di tutto, è necessario installare la libreria SendKeys, che può essere installata tramite pip

pip install SendKeys 

Esempio di codice:

Esempio di 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') # Invia l'indirizzo del file
SendKeys.SendKeys("{ENTER}") # Invia il tasto invio
print upload.get_attribute('value')
dr.quit()

Risultato:

baidu.py

可以通过SendKeys库直接向焦点中输入信息,但要注意在打开窗口时稍微等待一点时间,否则容易第一个字母send不进去(或者你可以在地址之前加一个无用字符),不过我觉得这种方法很不稳定,不推荐。

4.keybd_event

win32api fornisce un metodo keybd_event() per simulare tasti, ma questo metodo è piuttosto complicato e instabile, quindi non lo consiglio. Di seguito è fornito un esempio di parte di codice, se vuoi studiare, puoi cercare su Baidu.

# Trova un input box, inserisci l'indirizzo del file da caricare e incolla nella clipboard 
video.send_keys('C:\\Users\\Administrator\\Pictures\\04b20919fc78baf41fc993fd8ee2c5c9.jpg')
video.send_keys(Keys.CONTROL, 'a') # selenium's send_keys (ctrl+a)
video.send_keys(Keys.CONTROL, 'x') # (ctrl+x)
driver.find_element_by_id('uploadImage').click() # Clicca sul pulsante di upload per aprire la finestra di upload
# Incolla (ctrl + v)
win32api.keybd_event(17, 0, 0, 0) # Premi tasto ctrl
win32api.keybd_event(86, 0, 0, 0) # Premi tasto v
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) # Solleva tasto v
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # Solleva tasto ctrl
time.sleep(1)
# Invio (enter)
win32api.keybd_event(13, 0, 0, 0) # Premi tasto enter
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # Solleva tasto 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)
button = win32gui.FindWindowEx(dialog, 0, 'Button', None)
# Il codice è lo stesso dell'esempio precedente, ma i parametri sono diversi. Se lo desideri, puoi scrivere una funzione di caricamento per encapsulare la funzione di caricamento
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, '"d:\\baidu.py" "d:\\upload.py" "d:\\1.html"')
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
print dr.find_element_by_id('status_info').text
dr.quit()

Risultato:

Selezionati 3 file, peso totale 1.17KB.

Quindi, il caricamento di più file non è così complesso, né così semplice, la differenza principale è solo nei parametri di input. autoIT può farlo anche, se hai interesse, puoi provarlo da solo.

E possiamo notare un punto, ossia il codice della finestra sopra è quasi lo stesso del esempio precedente, il che significa che possiamo estrarre la parte di caricamento e scrivere una funzione, in modo che ogni volta che dobbiamo caricare, possiamo chiamare direttamente la funzione e passare i parametri.

Vedi, il caricamento è molto facile da gestire.

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento e che tu sostenga fortemente il tutorial di urla.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare