selenium上传文件

测试链接:http://www.sahitest.com/demo/php/fileUpload.htm

1.第一种形式:

  input输入框上传文件:可以理解为普通的输入框输入,我们只要传入文件路径即可。

#普通input框上传文件
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = driver.find_element_by_id('file')
upload.send_keys(r'C:Usersxibo.zhuworkmyselfmyProjectdatapicture	est_picture.png')  # send_keys
print(upload.get_attribute('value') ) # check value
driver.quit()

2.第二种形式

  非input型上传:

大体上有以下几种解决方案:
 1.autoIT,借助外力,我们去调用其生成的au3或exe文件。
 2.Python pywin32库,识别对话框句柄,进而操作
 3.SendKeys库
 4.keybd_event,跟3类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v… 

2.win32gui

1 首先安装pywin32库(命令:pip install pywin32)

from selenium import webdriver
import win32gui
import win32con
import time

dr = webdriver.Chrome()
dr.get('http://localhost/test/fileupload.html')
upload = dr.find_element_by_id('file')
upload.click()
time.sleep(1)


def upload_file(filepath,multiple=None):

    '''
    非input输入框文件上传
    :param filepath: 上传文件的路径,如果传多个文件,文件路径格式为 '"d:\baidu.py" "d:\upload.py" "d:\1.html"'  中间用空格隔开
    :param multiple: 是否传递多个文件,默认传一个文件
    :return:
    '''
    try:
        # win32gui
        dialog = win32gui.FindWindow('#32770', '文件上传')  # 对话框
        ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
        ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
        Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)  # 上面三句依次寻找对象,直到找到输入框Edit对象的句柄
        button = win32gui.FindWindowEx(dialog, 0, 'Button', None)  # 确定按钮Button
        if multiple==None:
            win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, filepath)  # 往输入框输入绝对地址
            win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 按button
        else:
            win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, filepath)  # 往输入框输入绝对地址
            win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 按button
        return True
    except Exception as e:
        return False

3.# 对于非 input 标签实现的上传功能,我们通过模拟键盘敲击的方式实现

注意:1:文件路径过长的话,可能出现路径输入不全。 2:该方法不太稳定。

# 对于非 input 标签实现的上传功能,我们通过模拟键盘敲击的方式实现

# 触发文件上传的功能
driver.find_element_by_css_selector("figure.icon").click()
time.sleep(3)

# 模拟键盘敲击,会不管不顾的敲击,只要代码运行到这里,就敲
sh = win32com.client.Dispatch("WScript.shell")
sh.Sendkeys("D:\UserslenovoPycharmProjectsscriptstudyseleniumStuday4ele.png
")

# 注意:代码运行过程不要操作鼠标
# 输入法要保持英文输入的状态

具体见链接:https://www.jb51.net/article/92678.htm

原文地址:https://www.cnblogs.com/zhuxibo/p/14172153.html