selenium+webdriver 实现上传文件,方法有三种,

今天遇到了自动化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进行元素提出的方法,目前尚未去研究,有兴趣的能够进行研究下,

相关文章
相关标签/搜索