web自动化文件上传--Pywin32库和WinSpy工具

一、前言

在做web自动化,遇见上传文件一般有两种情况:

1、如果是input可以直接输入路径的,那么直接调用send_keys输入路径。

2、非input标签的上传,则需要借助第三发工具。如Pywin32库和WinSpy工具

二、input标签上传文件

大致思路:以百度首页上传图片为例,首席点击图像元素,弹出选择文件按钮,再次往选择文件按钮直接输入文件路径,此时图片就上床成功了。

 

import time
from selenium import webdriver
from lesson_文件上传 import UploadFile

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.maximize_window()
driver.implicitly_wait(5)

# 1、定位图像元素
driver.find_element('xpath',"//span[@class='soutu-btn']").click()
# 2、文件路径
img_path = r"C:\Users\老王\Pictures\Sunrise.jpg"
# 2、定位选择文件,input标签直接输入
driver.find_element('xpath',"//input[@class='upload-pic']").send_keys(img_path)
time.sleep(3)
driver.quit()

三、非input标签上传文件

1、工具:pip install pywin32    和   下载WinSpy

2、WinSpy工具为识别windows控件的工具,pywin32需要一层一层往里面找到要操作的文件输入框和打开按钮。

 谷歌浏览器中上传窗口如下:

 文件输入框的路径为:上传窗口--ComboBoxEx32--ComboBox--Edit

按钮路径为:上传窗口--Button

在pywin32中,查找一层窗口的方法为:win32gui模块下的FindWindow

在某窗口查找子窗口的方法为:win32gui模块下的FindWindowEx

执行编辑、点击操作的方法为:win32gui模块下的SendMessage

以下是函数的说明;

pywin32用到的函数说明:

1、dialog = win32gui.FindWindow('#32770', title) --自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄。

IpClassName:类名,在spy中可以看到(上面截图中-拖到打开二字就可以了) 

IpWindowName:窗口名,标题栏上能看到的名字

2、ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)--搜索类型和窗体名匹配的窗体,并返回这个窗体的句柄,找不到就返回0.

hwndParent:若不为o,则搜索句柄为hwndParent窗体的子窗体。

hwndChildAfter:若不为0,则安装z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。我们代码中传的参数为0 

IpClassName:类名,在spy中可以看到() 

IpWindowName:窗口名,标题栏上能看到的名字    注意 定位三四级窗口一样的原理

3、win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filepath)--输入文件的路径

hWnd:整型,接收消息的窗体句柄

Msg:整型,要发送的信息,这些消息都是windows预先定义好的

wParam:整型,消息的wParam参数

IParam:整型,消息的IParam参数

下面分享代码示例:以element为例,上传文件成功

import time
from selenium import webdriver
from lesson_文件上传 import UploadFile

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)

driver.get('https://element.eleme.cn/#/zh-CN/component/upload')

# 1、定位elemnt组件上传按钮元素
driver.find_element('xpath',"(//span[text()='点击上传'])[1]").click()
time.sleep(1)
filePath = r"C:\Users\老王\Pictures\james.jpg"
# 2、调用封装好的方法
UploadFile().upload_file(filepath=filePath,title='打开')
time.sleep(3)

谷歌浏览器与windows窗口的上传窗口交互,代码如下:

import win32con
import win32gui


class UploadFile:

    def upload_file(self, filepath, title):
        '''
         windows窗口上传文件的操作
        :param filepath: 需要上传文件路径
        :param title: 打开的windows上传文件窗口的名称,不同浏览器的名称不同
        :return:None
        '''
        # 根据spy++工具判断需要上传文件的窗口为几级窗口,输入文件路径的文本框有四级目录
        # 先定位到一级窗口,即弹出的Windows界面
        dialog = win32gui.FindWindow('#32770', title)
        # 定位到二级窗口,由于二级窗口无文本内容,则第四位参数为None
        ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
        # 定位到三级窗口
        ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
        # 定位到四级窗口,文本框输入框
        edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)

        # 定位打开按钮,打开按钮只有两级,第一级为dialog=win32gui.FindWindow('#32770','打开')
        button = win32gui.FindWindowEx(dialog, 0, 'Button', '打开(&O)')

        # 输入传入文件的路径
        win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filepath)
        # 点击打开按钮
        win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)

if __name__ == '__main__':
    filePath = r"C:\Users\老王\Pictures\james.jpg"
    UploadFile().upload_file(filepath=filePath, title='打开')

ps;在进行debug时,只需要用谷歌浏览器点开一个上传文件的窗口,然后运行代码,就可以看到文件上传成功。其他浏览器参照以上代码,修改相应的参数即可。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试小白00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值