在給web頁面做自動化的時候蔫骂,文件上傳是很常見的操作,例如基本的用戶頭像上傳或者一些涉及到文件傳輸和儲存的地方都需要先進(jìn)行上傳文件的操作,那么惨奕,該如何通過selenium完成文件上傳自動化的實(shí)現(xiàn)呢?
首先馆匿,我們從研發(fā)角度來看一下抑胎,目前實(shí)現(xiàn)文件上傳的幾種方式:
1.利用<input type="file"/>標(biāo)簽實(shí)現(xiàn)的畢竟傳統(tǒng)的上傳方式;
2.利用js+flash或Ajax等插件進(jìn)行上傳甜熔;
基于上面的兩種類別的研發(fā)方式圆恤,selenium也有兩種方式去實(shí)現(xiàn)自動化測試:
send_keys()自動化上傳
簡單的input標(biāo)簽上傳方式要使用自動化上傳不難,先定位到上傳按鈕腔稀,然后send_keys把路徑作為值給傳進(jìn)去就好了盆昙。
例如我們找到那個控制上傳的input標(biāo)簽,例如<input type="file" name="upload">這樣的焊虏,然后對這個按鈕進(jìn)行定位再傳路徑:
driver.find_element_by_name("upload").send_keys('D:\filename.txt')
這種方式很簡單淡喜,只要有input標(biāo)簽一般都可以通過這種方式簡單的一條語句就可以實(shí)現(xiàn)。
Selenium+Autolt實(shí)現(xiàn)文件上傳
有的時候當(dāng)我們發(fā)現(xiàn)網(wǎng)頁實(shí)現(xiàn)上傳的方式比較復(fù)雜诵闭,不能夠通過send_keys()去傳路徑實(shí)現(xiàn)炼团,就可以用到Autolt插件去結(jié)合selenium一起來實(shí)現(xiàn)文件的自動上傳了。
首先在在官網(wǎng)下載Autolt進(jìn)行安裝疏尿,安裝后在win菜單欄下可以看到這個目錄:
這里面主要包含了這幾個組件瘟芝,我們先了解一下作用:
AutoIt Windows Info 用于識別Windows控件信息
SciTE Script Editor 用于編寫Autolt腳本
Run Script 用于執(zhí)行Autolt腳本
Compile Script to.exe 用于將Autolt腳本文件轉(zhuǎn)化為exe執(zhí)行文件
接下來就要開始實(shí)現(xiàn)自動上傳腳本的編寫了:
1.打開要實(shí)現(xiàn)自動上傳的網(wǎng)頁,點(diǎn)開上傳的按鈕褥琐,待出現(xiàn)選擇文件的windows窗口后锌俱,打開Autolt Windows Info,拖動那個“小風(fēng)扇”至文件名輸入框中敌呈,得到窗口標(biāo)題Title為 文件上傳贸宏,窗口標(biāo)題Class為 #32770,同時得到文件名輸入框的類型為 Edit磕洪,Instance為 1吭练。
2.還是這個操作,把“小風(fēng)扇”拖動到打開按鈕上析显,得到打開按鈕的類型為 Button鲫咽,Instance為 1。需要注意的是谷异,這兩步操作抓取的這幾個屬性是和瀏覽器相關(guān)的浑侥,不同瀏覽器獲取到的窗口標(biāo)題不同,我這里用的是火狐瀏覽器晰绎,標(biāo)題是文件上傳寓落,谷歌的是打開,ie也不一樣荞下,具體要以Autolt Windows Info抓取到的值為準(zhǔn)伶选。
3.總結(jié)一下上面獲取到的幾個有用屬性:
title: 文件上傳
title_class: #32770
文件名輸入框的ClassnameNN(類型+Instance): Edit1(類型+Instance)
打開按鈕的ClassnameNN(類型+Instance): Button1
4.打開SciTE Script Editor史飞,開始編寫Autolt腳本:
ControlFocus("文件上傳","","Edit1");
WinWait("[CLASS:#32770]","",10)
ControlSetText("文件上傳","","Edit1","D:\picture.PNG");
Sleep(2000);
ControlClick("文件上傳","","Button1");
注(* ̄(oo) ̄)諾是chrome瀏覽器則是:‘打開’ 而不是 ‘文件上傳’
ControlFocus()方法用于識別Window窗口。WinWait()設(shè)置10秒鐘用于等待窗口的顯示仰税,其用法與WebDriver所提供的implicitly_wait()類似构资。ControlSetText()用于向“文件名”輸入框內(nèi)輸入本地文件的路徑。這里的 Sleep()方法與 Python 中 time 模塊提供的 Sleep()方法用法一樣陨簇,不過它是以毫秒為單位吐绵,Sleep(2000)表示固定休眠 2000 毫秒。ControlClick()用于點(diǎn)擊上傳窗口中的“打開”按鈕河绽。這是我的腳本己单,涉及到上面的幾個屬性的地方都需要填寫自己獲取的,直接復(fù)制粘貼可是跑不通的哦~
寫好之后耙饰,點(diǎn)擊文件上傳的按鈕纹笼,在出現(xiàn)Windows的文件選擇窗口后,在菜單欄中點(diǎn)擊Tools -> Go苟跪,試運(yùn)行一下廷痘,能夠成功沒有報(bào)錯就可以保存了(保存為.au3格式)。
5.打開Compile Script to.exe件已,選擇之前保存好的au3格式的文件笋额,再為即將生成的.exe文件選擇好保存路徑,點(diǎn)擊Convert生成就好了篷扩。
6.最后一步就是通過selenium調(diào)用這個生成好的exe文件去執(zhí)行自動上傳啦鳞陨。定位到上傳按鈕,然后.click()進(jìn)行點(diǎn)擊瞻惋,接下來就是調(diào)用了,具體語句如下:
import os
upload = driver.find_element_by_xpath("http://div[@id='picker']/div[2]/label")
upload.click()
os.system("C:\\Users\admin\Desktop\Autolt3\ptest.exe")
這樣就完成了文件的自動上傳功能~
從這個例子來看援岩,我們在autolt腳本中寫入了具體要上傳的文件的路徑:"D:\picture.PNG"歼狼,所以在執(zhí)行自動上傳的時候自然就是自動上傳這一個文件,如果需要執(zhí)行批量上傳該如何操作呢享怀?感興趣的可以先自己查資料思考一下羽峰,我會在下篇博客展示具體方法。
轉(zhuǎn)自https://blog.csdn.net/qq_32897143/article/details/82014603