1. 程式人生 > >23、Selenium + Python 實現 UI 自動化測試-檔案上傳

23、Selenium + Python 實現 UI 自動化測試-檔案上傳

首先,我們要區分出上傳按鈕的種類,大體上可以分為兩種,一種是input框,另外一種就比較複雜,通過js、flash等實現,標籤非input

一、input 標籤

示例網址:http://sahitest.com/demo/php/fileUpload.htm

網頁如下:


程式碼如下:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(20)
driver.get("http://sahitest.com/demo/php/fileUpload.htm")
driver.find_element_by_id('file'
).send_keys('e:\python\\test1\day1\\1.txt') time.sleep(10) driver.quit()
send_keys 處,寫要上傳的檔案絕對路徑,注意轉義。

二、非input 型上傳檔案 (參考灰藍部落格:http://blog.csdn.net/huilan_same/article/details/52439546)

對於那些不是input框實現的上傳怎麼辦,這種上傳千奇百怪,有用a標籤的,有用div的,有用button的,有用object的,我們沒有辦法通過直接在網頁上處理掉這些上傳,唯一的辦法就是開啟OS彈框,去處理彈框。

而對於OS彈框涉及的層面已經不是selenium能解決的了,怎麼辦?很簡單,用OS層面的操作去處理,到這裡我們基本找到了問題的處理方法。

原文作者大概講解了以下幾種方案:

  1. autoIT,藉助外力,我們去呼叫其生成的au3或exe檔案。
  2. Python pywin32庫,識別對話方塊控制代碼,進而操作
  3. SendKeys庫
  4. keybd_event,跟3類似,不過是模擬按鍵,ctrl+a,ctrl+c, ctrl+v…

但是2、3、4作者說不太穩定,而AutoIT在前面我們又學過,所以,暫時研究其他方案,感興趣的請看灰藍部落格。下面來看下AutoIT的實現方法。


driver.find_element_by_name('file').click()
sleep(5)
os.system("sc.exe")

三、多檔案上傳

如果html 網頁中,有multiple屬性,則代表一次可以選擇多個檔案上傳

<input type="file" name="file" multiple>
如何用Selenium 實現控制上傳多個檔案呢?

1、一個一個上傳,試驗失敗(想想確實不應該成功,畢竟手動點選的時候,上傳第二個檔案會把第一個檔案覆蓋掉,這個邏輯本身就這樣)

from selenium import webdriver
from time import sleep


driver = webdriver.Chrome()
driver.get(r'file:///E:\python\test1\day1\test0.html')

driver.find_element_by_name('file').send_keys('e:\python\\test1\day1\\1.txt')
sleep(5)
driver.find_element_by_name('file').send_keys('e:\python\\test1\day1\\storm.jpg')
sleep(5)
driver.quit()

2、一次上傳多個檔案,用逗號分隔

driver.find_element_by_name('file').send_keys("e:\python\\test1\day1\\1.txt","e:\python\\test1\day1\\storm.jpg")
試驗失敗,只會將最後一個檔案上傳

3、換成列表上傳呢?

files = ["e:\python\\test1\day1\\1.txt","e:\python\\test1\day1\\storm.jpg"]
driver.find_element_by_name('file').send_keys(files)
失敗,只傳了最後一個檔案

經搜尋,通過sendkeys,並不能一次傳多個檔案。

如果有該需求的話,請參考灰藍win32 用法。

小結:

遇到上傳檔案控制元件,看看是否是input標籤,如果是,那恭喜你,用sendkeys解決;如果不巧碰到了div類的,用AutoIT實現也不難。如果還想驗證同時上傳多個檔案,那麼則只能採用pywin32 實現。