Selenium 系列篇(五):文件篇

image

系列導(dǎo)讀

01. Selenium 系列篇(一):準(zhǔn)備篇

02. Selenium 系列篇(二):元素定位

03. Selenium 系列篇(三):窗口篇

04. Selenium 系列篇(四):JS 篇

1. 前言

文件操作是 Web 端自動(dòng)化中比較常用的一個(gè)操作炕舵,一般文件操作包含:上傳、下載

WebDriver 僅僅提供了下載文件相關(guān)的 API攻人,上傳文件的 API 并沒實(shí)現(xiàn)补箍,需要我們自己去實(shí)現(xiàn)俊嗽;而且上傳文件需要同時(shí)兼容 Win 和Mac OSX 兩套操作系統(tǒng)

本篇文章就這這幾個(gè)問題展開聊聊。

2. 普通上傳

普通上傳是指頁(yè)面輸入框由一個(gè) input 標(biāo)簽組成,最后通過 form 表單將選擇的文件路徑傳給服務(wù)器倚聚。

這種方式最簡(jiǎn)單夕吻,只需要使用 WebDriver 定位到輸入框元素诲锹,然后把文件完整路徑設(shè)置進(jìn)去即可。

# 找到元素
element_input = driver.findElement_by_id("element_id")

# 設(shè)置文件路徑
element_input.send_keys(文件路徑)

常見的上傳方式是利用 Ajax 或者插件進(jìn)行上傳涉馅。

3. Mac OSX 上傳

以下面這個(gè)網(wǎng)站選擇一張圖片上傳為例归园。

image

首先,需要安裝依賴庫(kù):PyUserInput控漠,這個(gè)庫(kù)提供了 API 方便我們模擬鍵盤操作蔓倍。

# 安裝依賴庫(kù)
pip install PyUserInput

Selenium 打開目標(biāo)網(wǎng)站之后,點(diǎn)擊上圖的按鈕盐捷,打開選擇文件界面偶翅。

# 打開網(wǎng)站
self.driver.get("https://www.iloveimg.com/zh-cn/convert-to-jpg/gif-to-jpg")

# 點(diǎn)擊上傳按鈕,打開選擇文件界面
self.driver.find_element_by_class_name("uploader__btn").click()

接著模擬執(zhí)行 MAC 上的快捷鍵:Command+Shift+G碉渡,打開文件路徑搜索框

image

然后聚谁,利用 type_string() 方法將待上傳的文件路徑設(shè)置到輸入框內(nèi)

最后,再模擬按壓鍵盤上的兩次 Enter鍵滞诺,即能選中目標(biāo)文件

# 打開文件路徑搜索框
self.keyboard.press_keys(['Command', 'Shift', 'G'])

sleep(2)

# 粘貼到搜索框內(nèi)
self.keyboard.press_keys(['Command', 'V'])

sleep(2)

# 設(shè)置文件路徑到輸入框內(nèi)
self.keyboard.type_string(file_path2)

sleep(2)

# 模擬兩次Enter鍵形导,選擇文件
self.keyboard.press_key('Return')

sleep(2)
print('第二次點(diǎn)擊Enter')
self.keyboard.press_key('Return')

通過上面的這些操作,即完成了 Mac OSX 上的文件選擇操作习霹。

4. Win 上傳

Win 系統(tǒng)上的文件上傳可以使用 AutoIt 這個(gè)工具朵耕。

AutoIt是 PC 端的一種可以模擬鼠標(biāo)、鍵盤操作的類 BASIC 腳本語言淋叶,支持 Win 下的標(biāo)準(zhǔn)控件阎曹。

對(duì)AutoIt不了解的小伙伴可以參考之前寫的這篇文章:

自動(dòng)化篇 | PC 端這款黑科技錄制腳本,完爆按 X 精靈!

和上面的操作步驟類似处嫌,我們首先要利用 Selenium 找到按鈕元素栅贴,指定點(diǎn)擊操作,打開選擇文件的窗口熏迹。

image

接著利用 AutoIt 捕獲到窗口中的輸入框檐薯,拿到窗口 Title 及輸入框的標(biāo)識(shí),然后利用 AutoIt Script Editor 編寫腳本注暗。

腳本內(nèi)容分 4 步完成坛缕,具體如下:

第 1 步:激活選擇文件的窗口

;激活選擇文件的窗口
$handle = WinGetHandle("打開","")
WinActivate($handle)

第 2 步:點(diǎn)擊輸入框,激活輸入框

; 點(diǎn)擊輸入框元素友存,激活輸入框
ControlClick($handle,"","Edit1")

;停頓1秒
Sleep(1000)

第 3 步:設(shè)置文件完整路徑到輸入框內(nèi)

需要注意的是祷膳,由于文件路徑是一個(gè)變量,可以從傳參中讀嚷帕ⅰ直晨;其中,第 1 個(gè)參數(shù)是參數(shù)的總個(gè)數(shù)膨俐,第 2 個(gè)參數(shù)代表文件的完整路徑勇皇。

;設(shè)置文件
;ControlSetText($handle,"","Edit1","C:\Users\Administrator.Win7-2019DMRHYY\Desktop\4866277-6ec08ab76e991bfa.png")

;讀取第一個(gè)參數(shù)
ControlSetText($handle,"","Edit1", $CmdLine[1])

第 4 步,模擬點(diǎn)擊打開按鈕

image

同理焚刺,利用 Autoit Window Info 捕獲到「 打開按鈕 」的元素屬性敛摘,執(zhí)行點(diǎn)擊操作就能成功選擇一個(gè)文件

;點(diǎn)擊打開按鈕
ControlClick($handle,"","Button1")

最后,利用 Aut2Exe 工具將 au3 文件轉(zhuǎn)換為 exe 可執(zhí)行文件乳愉,利用 Python 調(diào)用即可以完成整個(gè)文件選擇操作兄淫。

?# 預(yù)先準(zhǔn)備一個(gè)文件的完整路徑
file_path = 'C:\\Users\\Administrator.Win7-2019DMRHYY\\Desktop\\4866277-6ec08ab76e991bfa.png'

# win下選擇文件(使用autoit)
os.system('D:\\python_workspace\\autoit\\upload.exe '+file_path)

5. 下載

WebDriver 針對(duì)下載功能提供了 API,方便我們對(duì)下載文件的配置蔓姚,包含:下載路徑捕虽、下載文件路徑、是否容許彈窗等坡脐,并且主流瀏覽器的設(shè)置方式還存在一些差異泄私。

以指定下載路徑為例,說說 Chrome 和 FireFox 瀏覽器的配置备闲。

Chrome 中的 ChromeOptions 類晌端,可以設(shè)置下載的配置文件,最后在 WebDriver 實(shí)例化的時(shí)候恬砂,將這些配置設(shè)置進(jìn)去咧纠。

?import os

from selenium import webdriver

opt = webdriver.ChromeOptions()

# 下載的配置文件
# 文件下載路徑
download_settings = {
    'download.default_directory': os.getcwd()
}

opt.add_experimental_option("prefs", download_settings)

# 實(shí)例化
webdriver = webdriver.Chrome(chrome_options=opt)

webdriver.get("url")

# 點(diǎn)擊一個(gè)元素,下載文件
webdriver.find_element_by_id("element_id").click()

如果是 FireFox泻骤,使用 FirefoxProfile 實(shí)例化一個(gè)對(duì)象惧盹,然后利用 set_preference()設(shè)置下載配置文件乳幸,最后利用 WebDriver 設(shè)置進(jìn)去。

?# 下載路徑(全英文)
download_path = '/Users/xingag/Desktop/test'

fp = webdriver.FirefoxProfile()

# 2:下載到指定目錄
fp.set_preference("browser.download.folderList", 2)

# 指定下載目錄
fp.set_preference("browser.download.dir", download_path)

# binary/octet-stream:表示二進(jìn)制文件
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "binary/octet-stream")

# WebDriver 實(shí)例化
driver = webdriver.Firefox(firefox_profile=fp)

# 打開一個(gè)網(wǎng)站
driver.get("https://pypi.org/project/selenium/#files")

# 下載文件
driver.find_element_by_id("element_id").click()

6. 其他

通過前面 4 篇講解钧椰,加上本篇,Selenium 自動(dòng)化系列篇已完結(jié)符欠。

本文首發(fā)于微信公眾號(hào)「 Python自動(dòng)化社區(qū) 」嫡霞,文章中所有的代碼我已上傳到公眾號(hào)后臺(tái),回復(fù)關(guān)鍵字「 Selenium文件 」獲取文中出現(xiàn)的完整代碼希柿。

后面將聊聊移動(dòng)端的自動(dòng)化及一些自動(dòng)化測(cè)試框架诊沪,敬請(qǐng)期待~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曾撤,隨后出現(xiàn)的幾起案子端姚,更是在濱河造成了極大的恐慌,老刑警劉巖挤悉,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渐裸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡装悲,警方通過查閱死者的電腦和手機(jī)昏鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诀诊,“玉大人洞渤,你說我怎么就攤上這事∈舭辏” “怎么了载迄?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抡蛙。 經(jīng)常有香客問我护昧,道長(zhǎng),這世上最難降的妖魔是什么溜畅? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任捏卓,我火速辦了婚禮,結(jié)果婚禮上慈格,老公的妹妹穿的比我還像新娘怠晴。我一直安慰自己,他們只是感情好浴捆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布蒜田。 她就那樣靜靜地躺著,像睡著了一般选泻。 火紅的嫁衣襯著肌膚如雪冲粤。 梳的紋絲不亂的頭發(fā)上美莫,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音梯捕,去河邊找鬼厢呵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛傀顾,可吹牛的內(nèi)容都是我干的襟铭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼短曾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寒砖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫉拐,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤哩都,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后婉徘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漠嵌,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年判哥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了献雅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塌计,死狀恐怖挺身,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锌仅,我是刑警寧澤章钾,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站热芹,受9級(jí)特大地震影響贱傀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伊脓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一府寒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧报腔,春花似錦株搔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至翻诉,卻和暖如春炮姨,著一層夾襖步出監(jiān)牢的瞬間捌刮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工舒岸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绅作,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓蛾派,卻偏偏與公主長(zhǎng)得像棚蓄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碍脏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容