文件上傳是所有UI自動化測試都要面對的一個頭疼問題,今天博主在這里給大家分享下自己處理文件上傳的經驗,希望能夠幫助到廣大被文件上傳坑住的seleniumer。
首先,我們要區分出上傳按鈕的種類,大體上可以分為兩種,一種是input框,另外一種就比較復雜,通過js、flash等實現,標簽非input
我們分別對這兩種進行分析:
1.input標簽
眾所周知,input標簽是可以直接send_keys的,這里也不例外,來看代碼示例:
代碼:
# -*- coding: utf-8 -*-from selenium import webdriverdriver = 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_keysprint upload.get_attribute('value') # check valuedriver.quit()
結果:
baidu.py
很明顯,對于input上傳,直接send_keys是最簡單的解決方案。
2.非input型上傳
接下來難度要升級了,對于那些不是input框實現的上傳怎么辦,這種上傳千奇百怪,有用a標簽的,有用div的,有用button的,有用object的,我們沒有辦法通過直接在網頁上處理掉這些上傳,唯一的辦法就是打開OS彈框,去處理彈框。
問題又來了,OS彈框涉及的層面已經不是selenium能解決的了,怎么辦?很簡單,用OS層面的操作去處理唄,到這里我們基本找到了問題的處理方法。
大體上有以下幾種解決方案:
目前我只知道以上四種辦法,有其他方法的請留言告訴我,讓我學習一下。
我們依次看一下:
1. autoIT
關于autoIT上傳以及參數化的方法我已經在另一篇博文中講過了,請參見selenium之 autoit命令行參數 。這里不再贅述。
2.win32gui
廢話不多說,上代碼先:
代碼:
# -*- coding: utf-8 -*-from selenium import webdriverimport win32guiimport win32conimport timedr = webdriver.Firefox()dr.get('http://sahitest.com/demo/php/fileUpload.htm')upload = dr.find_element_by_id('file')upload.click()time.sleep(1)# win32guidialog = win32gui.FindWindow('#32770', u'文件上傳') # 對話框ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # 上面三句依次尋找對象,直到找到輸入框Edit對象的句柄button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 確定按鈕Buttonwin32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd://baidu.py') # 往輸入框輸入絕對地址win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 按buttonprint upload.get_attribute('value')dr.quit()
新聞熱點
疑難解答