Python + Selenium(二十一)文件上傳

對於自動化測試過程中去實現文件上傳,我內心是拒絕的。

目前網上很多資料談到文件上傳動輒談 AutoIt,這是一款早期的 Windows 自動化工具,用來模擬 Windows 上的操作。這款工具已經十來年沒有更新過了。

先不談使用這些工具實現上傳是否靠譜,光說文件的上傳過程。文件上傳一般由如下過程構成:

  1. 點擊某個按鈕,比如上傳、瀏覽等
  2. 瀏覽器會調用 Windows 的文件瀏覽對話框讓用戶選擇文件
  3. 用戶選擇文件,並點擊文件瀏覽對話框上的確定
  4. 頁面接受 Windows 文件瀏覽對話框回傳的文件路徑
  5. 根據該路徑去讀取文件並通過 HTTP 請求發送到服務器。

這中間的文件瀏覽對話框類,是調用 Windows 的 API 實現的。並非屬於瀏覽器的頁面結構,因此脫離於瀏覽器之外,不能通過我們的 Selenium 來操作。

就必須要藉助其他的 Windows 界面測試工具,比如上面提到的 AutoIt, Python 相關庫pywin32,或者基於圖形圖像的測試工具 sikuli 等。

但是這些工具雖然可以完成,但是有一個共同的問題,無法與 CI 工具結合。目前自動化測試如果不能參與持續集成的話,基本上用途不大。

所以我內心是拒絕在自動化測試中加入這些內容,但是有些情況下又必須要上傳文件,比如流程中必須要上傳設計圖、合同掃描件等。那該如何處理呢?

如果非要使用文件上傳(需要好好掂量),可以使用 send_keys 和 requests 實現。

直接通過 send_keys 發送文件路徑

目前大部分的文件上傳是直接使用 HTML 中提供的 input[type=“file”] 元素。比如:

可以直接找到該元素,並通過前面提到的 send_keys 即可實現上傳。

driver.find_element_by_id('file-image__upload').send_keys('d:\data\test.jpg')

部分頁面上有縮略圖,通過這種方法可能無法看到縮略圖。

通過 requests 實現文件上傳

上面的方式之所以能夠直接上傳文件,是因爲用的是 input 元素,本來就支持文本輸入,我們相當於直接給它提供了本應該從文件瀏覽對話框中選擇的文件路徑字符串。

如果不是 input 元素的話,send_keys 的發送方式就沒有效果了。這種時候就可以藉助 requests 實現文件上傳。

詳見Python接口測試教程- requests 文件上傳

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章