對(duì)于自動(dòng)化測(cè)試過程中去實(shí)現(xiàn)文件上傳,我內(nèi)心是拒絕的。
目前網(wǎng)上很多資料談到文件上傳動(dòng)輒談 AutoIt,這是一款早期的 Windows 自動(dòng)化工具,用來模擬 Windows 上的操作。這款工具已經(jīng)十來年沒有更新過了。

先不談使用這些工具實(shí)現(xiàn)上傳是否靠譜,光說文件的上傳過程。文件上傳一般由如下過程構(gòu)成:
- 點(diǎn)擊某個(gè)按鈕,比如上傳、瀏覽等
- 瀏覽器會(huì)調(diào)用 Windows 的文件瀏覽對(duì)話框讓用戶選擇文件
- 用戶選擇文件,并點(diǎn)擊文件瀏覽對(duì)話框上的確定
- 頁(yè)面接受 Windows 文件瀏覽對(duì)話框回傳的文件路徑
- 根據(jù)該路徑去讀取文件并通過 HTTP 請(qǐng)求發(fā)送到服務(wù)器。
這中間的文件瀏覽對(duì)話框類,是調(diào)用 Windows 的 API 實(shí)現(xiàn)的。并非屬于瀏覽器的頁(yè)面結(jié)構(gòu),因此脫離于瀏覽器之外,不能通過我們的 Selenium 來操作。

就必須要借助其他的 Windows 界面測(cè)試工具,比如上面提到的
AutoIt, Python 相關(guān)庫(kù)pywin32,或者基于圖形圖像的測(cè)試工具 sikuli 等。
但是這些工具雖然可以完成,但是有一個(gè)共同的問題,無法與 CI 工具結(jié)合。目前自動(dòng)化測(cè)試如果不能參與持續(xù)集成的話,基本上用途不大。
所以我內(nèi)心是拒絕在自動(dòng)化測(cè)試中加入這些內(nèi)容,但是有些情況下又必須要上傳文件,比如流程中必須要上傳設(shè)計(jì)圖、合同掃描件等。那該如何處理呢?
如果非要使用文件上傳(需要好好掂量),可以使用 send_keys 和 requests 實(shí)現(xiàn)。
直接通過 send_keys 發(fā)送文件路徑
目前大部分的文件上傳是直接使用 HTML 中提供的 input[type="file"] 元素。比如:

可以直接找到該元素,并通過前面提到的 send_keys 即可實(shí)現(xiàn)上傳。
driver.find_element_by_id('file-image__upload').send_keys('d:\data\test.jpg')
部分頁(yè)面上有縮略圖,通過這種方法可能無法看到縮略圖。
通過 requests 實(shí)現(xiàn)文件上傳
上面的方式之所以能夠直接上傳文件,是因?yàn)橛玫氖?input 元素,本來就支持文本輸入,我們相當(dāng)于直接給它提供了本應(yīng)該從文件瀏覽對(duì)話框中選擇的文件路徑字符串。
如果不是 input 元素的話,send_keys 的發(fā)送方式就沒有效果了。這種時(shí)候就可以借助 requests 實(shí)現(xiàn)文件上傳。
具體請(qǐng)查看 Python接口測(cè)試教程- requests 文件上傳