上传操作有两种情况:
1、如果是input可以直接输入路径的,可以直接调用send_keys()输入路径,具体实现可以参照https://www.cnblogs.com/wsk1988/p/12705374.html
2、非input标签的上传,则需要借助第三方工具
2-1、AutoIt 我们去调用其生成的au3或者exe文件
2-2、SendKeys第三方库(目前只支持2.7版本)
2-3、Python pywin32库,识别对话框句柄,进行操作
2-4、pyatoit 如果操作非window控件 可以了解这个
使用工具:
pywin32和spy++
dialog=win32gui.FindWindow(lpClassName,lpWindowName)
自顶层创久开始寻找匹配条件的窗口,并返回这个窗口的句柄
lpClassName: 类名,在Spy++里能看到
lpWindowName: 窗口名,在标题栏上能看到的名字
comboBoxEx32=win32gui.FindWindowEx(hwndParent=0,hwndChildAfter=0,lpszClass=None,lpszWindow=None)
搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄,找不到就返回0
hwndParent: 若不为0,则搜索句柄为hwndParent窗体的子窗体
hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索
lpszClass:字符型,是窗体的类名,这个可以在spy++里找到
lpszWindow:字符型,是窗口名,也就是标题栏上你能看到的那个标题(spy中的text),没有传None
win32gui.SendMessage(hWnd,Msg,wParam,lParam)
hWnd:整型,接收消息的窗体句柄
Msg: 整型,要发送的消息,这些消息都是windows预先定义好的
wParam:整型,消息的wParam参数
lParam:整型,消息的lParam参数
代码实现如下:
1 import win32gui 2 import win32con 3 # 谷歌浏览器上传文件 4 def upload_file(filepath): 5 # 找到一级窗口,返回这个窗口的句柄 6 dialog=win32gui.FindWindow("#32770","打开") 7 # 找到二级窗口 8 comboBoxEx32=win32gui.FindWindowEx(dialog,0,"ComboBoxEx32",None) 9 # 找到三级窗口 10 comboBox=win32gui.FindWindowEx(comboBoxEx32,0,"ComboBox",None) 11 # 找到四级窗口 12 edit=win32gui.FindWindowEx(comboBox,0,"Edit",None) 13 # 找到打开窗口-二级窗口 14 button=win32gui.FindWindowEx(dialog,0,"Button","打开(&O)") 15 16 # 操作 17 # 输入文件地址 18 # 点击打开按钮,提交文件 19 win32gui.SendMessage(edit,win32con.WM_SETTEXT,None,filepath) #发送文件的路径 filepath上传的文件路径 20 win32gui.SendMessage(dialog,win32con.WM_COMMAND,1,button)
备注:
谷歌浏览器实现文件上传的方式,这个函数可以直接使用,如果是其他的浏览器只需要更改一下 dialog=win32gui.FindWindow("#32770","打开")改成对应的参数就可以了