上傳操作有兩種情況:
第一種:如果是 input 可以直接輸入路徑的,那么直接調send_ keys輸入路徑
第二種:非 inpat 標簽的上傳,則需要借助第三方工具,有一下三種方法
2.1 Autolt 我們去調用其生成的 au3 或 exe 文件;
2.2 SendKeys 第 三方庫(目前只支持到2.7版本),目前因為這個庫不在維護,需要要使用的話需要更改源代碼,所以我們不用這種方法
網址: https://pypi.org/project/SendKeys/
2.3 Python 的 pywin32庫,識別對話框句柄,進而操作;如果針對 Autolt 的時候也可以使用 Python 中的 pyautoit 庫來實現;
今天我們來學習下使用 Python 的 pywin32 庫來實現上傳操作;前兩種不考慮有點復雜,我們要達到的目的就是可以上傳文件即可。
前提:Python 安裝 pywin32 庫
# cmd 豆瓣地址安裝 pip install -i https://pypi.douban.com/simple pywin32
pywin32 庫實現上傳操作需要借助 WinSpy 工具輔助來定位;
文件上傳工具下載地址:
百度網盤鏈接:https://pan.baidu.com/s/1zxsR6kOTsG4_GrBwFh6v4A 提取碼:z3y
說明:
- 1、WinSpy-1.0.2.7z 解壓即可。
- 2、pywin32的exe程序,根據自己安裝的python版本來選擇。 雙擊安裝即可。
- 3、如果第2步執行不成功,或者沒有匹配的版本,從以下命令中選一個安裝:
- 命令1:pip install pypiwin32
- 命令2:python -m pip install pypiwin32
winspy工具的定位方法采用的是絕對路徑定位,即:根路徑為點擊上傳按鈕后的彈出框的整個窗口頁面,一般根據Text文本值和Class屬性來定位,如圖所示:
- Handle:句柄,每次會變的
- text:文本內容
- Class:類別
我們先直接定位“整個彈窗”的 Text 文本值為“打開”,Class屬性值為“#32770”
在winspy工具左上角有個聚焦按鈕,通過拖動的方式拖動到上傳彈出框的對應位置(如文件路徑輸入框)后松開,winspy界面會顯示當前定位的Text文本值(此處為空)和Class屬性值( Edit ), 在windows的窗口下,Parent屬性的值中,括號里面的就表示它上一層元素的Class屬性值,可以通過點擊Parent屬性值跳到上一元素,最終我們定位到文件路徑輸入框的Class屬性路徑為: Edit - combox - comboBoxEx32 - #32770.
那么同理,“打開” 按鈕通過同樣的絕對路徑方式定位,得到它的Class屬性路徑為: button - #32770。
通過借助winspy工具定位出了對應元素的路徑,就可以通過pywin32庫來實現上傳操作啦!
pywin32的實現步驟為:
1、找到絕對路徑輸入框和"打開”按鈕的元素;
2、輸入絕對路徑,點擊打開
在頁面實現的前提條件為: windows.上傳窗已經出現,可以sleep1~ 2秒等待上傳的彈框出現。
各個瀏覽器中的彈窗名都不同,如火狐----谷歌--IE同理;所以代碼中需要判斷是哪個瀏覽器
封裝:使用 pywin32 庫當中的 wendousi 方法實現的;
步驟1、找到輸入框和打開按鈕 2、輸入路徑地址,點擊打開
# 需要使用這兩個庫
import win32gui import win32con def upload(filePath, browser_type="chrome"): ''' 通過pywin32模塊實現文件上傳的操作 :param filePath: 文件的絕對路徑 :param browser_type: 瀏覽器類型(默認值為chrome) :return: ''' if browser_type.lower() == "chrome": title = "打開" elif browser_type.lower() == "firefox": title = "文件上傳" elif browser_type.lower() == "ie": title = "選擇要加載的文件" else: title = "" # 這里根據其它不同瀏覽器類型來修改 # 找元素 # 一級窗口"#32770","打開";找到窗口,在根據不同瀏覽器傳入 title dialog = win32gui.FindWindow("#32770", title) # 向下傳遞 ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None) # 二級 comboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None) # 三級 # 編輯按鈕 edit = win32gui.FindWindowEx(comboBox, 0, 'Edit', None) # 四級 # 打開按鈕 button = win32gui.FindWindowEx(dialog, 0, 'Button', "打開(&O)") # 二級 # 輸入文件的絕對路徑,點擊“打開”按鈕 win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath) # 發送文件路徑 win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 點擊打開按鈕
如何使用:
# 打開彈窗的之前操作省略。。。。。。。 # 在打開上傳彈窗后,直接調用 upload 類,傳需要上傳文件的絕對路徑即可 upload("D:\\文件的絕對路徑") # 傳入之前使用 time。sleep(2)等待兩秒
尊重原創:該篇文章摘自作者:小公瑾 出處為:https://www.cnblogs.com/xiaogongjin/