系列導(dǎo)讀
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)站選擇一張圖片上傳為例归园。
首先,需要安裝依賴庫(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碉渡,打開文件路徑搜索框
然后聚谁,利用 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)擊操作,打開選擇文件的窗口熏迹。
接著利用 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)擊打開按鈕
同理焚刺,利用 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)期待~