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

對(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)成:

  1. 點(diǎn)擊某個(gè)按鈕,比如上傳、瀏覽等
  2. 瀏覽器會(huì)調(diào)用 Windows 的文件瀏覽對(duì)話框讓用戶選擇文件
  3. 用戶選擇文件,并點(diǎn)擊文件瀏覽對(duì)話框上的確定
  4. 頁(yè)面接受 Windows 文件瀏覽對(duì)話框回傳的文件路徑
  5. 根據(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 文件上傳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容