转自:https://blog.csdn.net/huilan_same/article/details/52439546
测试上传文件功能时,弹出文件选择框来选择正确的文件上传。本次用到的页面由于没有注意上传按钮的标签是input,因此查了大量关于非input上传的材料,在这里做个记录。
1.有input标签
这种比较简单,定位到元素后,直接sendkeys,输入要上传文件的绝对地址。
driver.find_element_by_xpath('/html/body/form/table/tbody/tr[1]/td[2]/input[1]').send_keys('E:\导入格式 -优先.xlsx')
2.非input标签
这种情况没有办法在网页来操作文件,只能通过os弹窗来处理,最常用的第三方工具是autoIT,借助外力。还有一种方法可以直接安装Python pywin32库,识别对话框句柄。个人觉得最好还是直接还是不靠第三方软件,因此选择安装pywin32.
dialog = win32gui.FindWindow('#32770',u'打开')
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
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, r'E:\导入格式 -优先.xlsx') # 往输入框输入绝对地址
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 按button
这里需要一个小工具,spy++,百度搜索下载。
使用方法,点击望远镜图标,,然后
拖拽到要操作的窗口,查找对应元素。
拓展:
简单介绍几个用到的:
win32gui.FindWindow(lpClassName=None, lpWindowName=None):
自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄。
lpClassName:类名,在Spy++里能够看到
lpWindowName:窗口名,标题栏上能看到的名字
代码示例里我们用来寻找上传窗口,你可以只用其中的一个,用classname定位容易被其他东西干扰,用windowname定位不稳定,不同的上传对话框可能window_name不同,怎么定位取决于你的情况。
win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。找不到就返回0。
hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。
hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。
lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。
lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
代码示例里我们用来层层寻找输入框和寻找确定按钮
win32gui.SendMessage(hWnd, Msg, wParam, lParam)
hWnd:整型,接收消息的窗体句柄
Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages)
wParam:整型,消息的wParam参数
lParam:整型,消息的lParam参数
代码示例里我们用来向输入框输入文件地址以及点击确定按钮