今天遇到了自動化ui頁面須要上傳文件的問題,以前有用type="file"類型的input元素進行查找,python
今天發如今頁面上沒法找個input,他被隱藏在了div下,就致使以前的上傳文件方法用不了了,web
針對這個,本身單獨記錄一下windows
方法一,當input類型是type="file"類型時,能夠直接使用api
driver.find_element_by_xpath('//*[@class="soutu-btn"]').sendkeys('c:\\user\pc\desktop\00.png')
這個能夠直接講本地的文件上傳。ui
狀況二,當input類型是type=「file」類型,可是在一個button下面時,要是定位這個按鈕是沒法上傳的,定位這個input回報錯依然沒法上傳,那就須要使用spa
input = driver.find_element_by_xpath('//*[@class="ant-upload"]/input') input.sendkeys('c:\\user\\pc\\desktop\\00.png')
使用這個方法也是能夠解決這個問題code
狀況三,存在其餘狀況,看到了一個模擬鍵盤操做的方法blog
具體不講了,看代碼事件
建立模擬按鍵ip
win32Key.py文件
import win32api import win32con class KeyboardKeys(object): #模擬鍵盤按鍵類 VK_CODE={ 'enter':0x0D, 'ctrl':0x11, 'v':0x56 } @staticmethod def keyDown(keyName): #按下按鍵 win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,0,0) @staticmethod def keyUp(keyName): #釋放按鍵 win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,win32con.KEYEVENTF_KEYUP,0) @staticmethod def oneKey(key): #模擬單個按鍵 KeyboardKeys.keyDown(key) KeyboardKeys.keyUp(key) @staticmethod def twoKeys(key1,key2): #模擬兩個組合鍵 KeyboardKeys.keyDown(key1) KeyboardKeys.keyDown(key2) KeyboardKeys.keyUp(key2) KeyboardKeys.keyUp(key1)
建立按鍵事件文件
win32Model.py
import win32clipboard as w import win32con class Clipboard(object): #模擬windows設置剪貼板 #讀取剪貼板 @staticmethod def getText(): #打開剪貼板 w.OpenClipboard() #獲取剪貼板中的數據 d=w.GetClipboardData(win32con.CF_TEXT) #關閉剪貼板 w.CloseClipboard() #返回剪貼板數據給調用者 return d #設置剪貼板內容 @staticmethod def setText(aString): #打開剪貼板 w.OpenClipboard() #清空剪貼板 w.EmptyClipboard() #將數據aString寫入剪貼板 w.SetClipboardData(win32con.CF_UNICODETEXT,aString) #關閉剪貼板 w.CloseClipboard()
進行文件上傳
upload.py
from selenium import webdriver from time import sleep from win32Model import Clipboard from win32Key import KeyboardKeys def upload(path): Clipboard.setText(path) sleep(1) KeyboardKeys.twoKeys('ctrl','v') KeyboardKeys.oneKey('enter') # 模擬回車 driver = webdriver.Chrome() driver.get('xxxxx') driver.maximize_window() driver.find_element_by_xpath('xxxxxxx').click() sleep(2) upload(r'xxxxxx') sleep(2)
替換本身的地址,元素,上傳文件地址,就能夠用了。
總之呢,最後這種方法雖然能夠解決大部分問題,可是並非最完美的,在論壇(https://dev.to/razgandeanu/how-to-upload-files-with-selenium-3gj3)上有執行JavaScript進行元素提出的方法,目前尚未去研究,有興趣的能夠進行研究下,