對于自動化測試過程中去實現(xiàn)文件上傳,我內心是拒絕的。
目前網(wǎng)上很多資料談到文件上傳動輒談 AutoIt,這是一款早期的 Windows 自動化工具,用來模擬 Windows 上的操作。這款工具已經(jīng)十來年沒有更新過了。
先不談使用這些工具實現(xiàn)上傳是否靠譜,光說文件的上傳過程。文件上傳一般由如下過程構成:
- 點擊某個按鈕,比如上傳、瀏覽等
- 瀏覽器會調用 Windows 的文件瀏覽對話框讓用戶選擇文件
- 用戶選擇文件,并點擊文件瀏覽對話框上的確定
- 頁面接受 Windows 文件瀏覽對話框回傳的文件路徑
- 根據(jù)該路徑去讀取文件并通過 HTTP 請求發(fā)送到服務器。
這中間的文件瀏覽對話框類,是調用 Windows 的 API 實現(xiàn)的。并非屬于瀏覽器的頁面結構,因此脫離于瀏覽器之外,不能通過我們的 Selenium 來操作。
就必須要借助其他的 Windows 界面測試工具,比如上面提到的
AutoIt
, Python 相關庫pywin32
,或者基于圖形圖像的測試工具 sikuli 等。
但是這些工具雖然可以完成,但是有一個共同的問題,無法與 CI 工具結合。目前自動化測試如果不能參與持續(xù)集成的話,基本上用途不大。
所以我內心是拒絕在自動化測試中加入這些內容,但是有些情況下又必須要上傳文件,比如流程中必須要上傳設計圖、合同掃描件等。那該如何處理呢?
如果非要使用文件上傳(需要好好掂量),可以使用 send_keys 和 requests 實現(xiàn)。
直接通過 send_keys 發(fā)送文件路徑
目前大部分的文件上傳是直接使用 HTML 中提供的 input[type="file"] 元素。比如:
可以直接找到該元素,并通過前面提到的 send_keys 即可實現(xiàn)上傳。
driver.find_element_by_id('file-image__upload').send_keys('d:\data\test.jpg')
部分頁面上有縮略圖,通過這種方法可能無法看到縮略圖。
通過 requests 實現(xiàn)文件上傳
上面的方式之所以能夠直接上傳文件,是因為用的是 input 元素,本來就支持文本輸入,我們相當于直接給它提供了本應該從文件瀏覽對話框中選擇的文件路徑字符串。
如果不是 input 元素的話,send_keys 的發(fā)送方式就沒有效果了。這種時候就可以借助 requests 實現(xiàn)文件上傳。