• python+selenium的web自动化上传操作的实现


    一、关于上传操作

    上传有两种情况:

    如果是input可以直接输入路径的,那么直接使用send_keys(文件路径)输入路径即可;

    input标签的上传,则需要借助第三方工具:第三方库 pywin32、第三方工具pyautogui等等。

    那这里针对以上两种情况分别介绍一下具体的解决方法。

    二、input标签

    定位到元素,然后直接使用send_keys(文件路径)输入路径,比较简单。

    
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get("http://xxxx")
    driver.maximize_window()
     
    # 定位上传文件元素
    input_file = driver.find_element_by_id("xxx")
    # 上传文件
    input_file.send_keys(r"D:\learn\xx.txt")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、第三方库pywin32

    非input标签的上传,则需要借助第三方工具。pywin32就是这样的一个第三方库,主要是方便python开发者快速调用windows API的一个模块库,可以识别上传对话框句柄进而操作。

    安装命令:pip install pywin32。

    在这里插入图片描述
    从上面的上传窗口,及WinSpy工具窗口,可以得出控制关系图如下:

    在这里插入图片描述
    从上图可以看出:

    • 文件名输入框的路径为:上传窗口 - > comboBoxEx32 - >comboBox - > Edit,在第四级edit;

    • 按钮的路径为:上传窗口 - > button(打开按钮),在第二级。

    我们需要一步一步定位,从第一层开始往下去找,找到对应的窗口然后进行操作,步骤说明如下:

    • 第一步:先定位到第一层大窗口(即整个上传窗口),使用win32gui模块下的FindWindow(),它是专门用于查找大窗口的;

    • 第二步:在大窗口下查找子窗口,使用win32gui模块下的FindWindowEx(),查找大窗口以下的子窗口都是用这个方法;

    • 第三步:定位到最后要操作的窗口后,就开始要执行编辑、点击这个操作了,不管是编辑还是点击都是使用win32gui模块下的SendMessage()。

    以上三步的相关函数说明如下:

    • win32gui.FindWindow(IpClassName,IpWindowName):自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄IpClassName:类名,在Spy++里能够看到IpWindowName:窗口名,标题栏上能看到的名字

    • win32gui.FindWindowEx(hwndParent=0,hwndChildAfter=O,IpClassName=None,IpWindowName=None):搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄,找不到就返回0hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索IpClassName:字符型,是窗体的类名,这个可以在Spy++里能够看到IpWindowName:字符型,是窗口名,就是标题栏上能看到的名字

    • win32gui.SendMessage(hWnd, Msg, wParam, IParam):hWnd:整型,接收消息的窗体句柄Msg:整型,要发送的消息,这些消息都是windows预先定义好的wParam:整型,消息的wParam参数IParam:整型,消息的IParam参数

    以下是封装好的上传函数,因为window的上传窗口是固定不变的,我们只需要封装好一个类知道如何去调用即可,不需要理解它的处理细节,但如果你有兴趣可以深入了解一下。

    
    import win32gui
    import win32con
     
    # edit - combobox - comboBoxEx32 - #32770  编辑框在第四级
    # button - #32770  打开按钮在第二级
     
    # 前提:window上传窗口已经出现,最好sleep 1-2秒等待窗口出现
     
    def upload(filepath, browser_type="chrome"):
        if browser_type == "chrome":
            title = "打开"
        else:
            title = ""
        # 找元素
        # 从一级开始找,一级窗口“#32770”,“打开”
        dialog = win32gui.FindWindow("#32770", title)  # FindWindow用于找大窗口
     
        # 二级之后都用FindWindowEx,需要四个参数,
        # 1、元素的父亲,2、从第一个子代开始找元素,3、元素的类型名(class),4、元素的文本值
        comboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)  # 二级
        comBox = win32gui.FindWindowEx(comboBoxEx32, 0, "ComboBox", None)  # 三级
        # 编辑框
        edit = win32gui.FindWindowEx(comBox, 0, 'Edit', None)  # 四级
        # 打开按钮
        button = win32gui.FindWindowEx(dialog, 0, 'Button', '打开(&0)')  # 二级
     
        # 往编辑框输入文件路径
        win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filepath)  # 发送文件路径
        win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 点击打开按钮
    if __name__ == '__main__':
        upload('D:\\test.txt')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    四、第三方工具pyautogui

    还有一种更方便的方法,就是借助第三方工具pyautogui,pyautogui是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,并且支持多平台(Windows,OS X,Linux)。强烈推荐!

    下面以举例的html为例,需要先把该代码保存成html文件,后续直接访问这个本地html文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1> hello world </h1>
    <input type="file" name="mfile">
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    安装模块: pip install pyautogui,

    操作只需要两步:

    • 第一步:将要上传的文件路径写入到文件名的输入框内;

    • 第二步:敲回车,相当于点击【打开】按钮,注意回车presses要2次才能生效。

    import os
    import time
    import pyautogui as ui
    from selenium import webdriver
     
    driver = webdriver.Chrome()
    driver.implicitly_wait(20)      # 隐式等待
    dir = os.getcwd()
    html_dir = os.path.join(dir, 'demo.html')
    driver.get(html_dir)
     
    file_elem = driver.find_element_by_name('mfile')
    file_elem.click()
     
    # 系统之间要等待
    time.sleep(1)
    file_dir = os.path.join(dir, 'test.txt')  # 要上传的文件路径
    # 写入文件
    ui.write(file_dir)  # 直接调用写入
    time.sleep(0.5)
    # 输入回车键, presses表示按的次数,按一次不会生效,有可能是执行太快,建议presses=2
    ui.press('enter', presses=2)
    time.sleep(2)
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    不管是使用哪种上传方式,只要是操作系统的上传窗口,操作之前记得先等待一下。

    今天的文章就到这里了哟,到此这篇关于python+selenium的web自动化上传操作的实现的文章就介绍到这了。


    最后

    如果你想学习自动化测试,那么下面这套视频应该会帮到你很多

    如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖....

    最后我这里给你们分享一下我所积累和整理的一些文档和学习资料,有需要直接领取就可以了!


    以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

    ​​

    ​​​​

  • 相关阅读:
    90天,广告商单43张,小红书AI庭院风视频制作详解教程
    微信小程序4
    云原生爱好者周刊:Prometheus 推出 Agent 模式来适应新的使用场景
    C++ 修饰符类型
    哪里可提供低代码开源大数据解决方案?
    Linux cd 命令使用介绍
    PHP乱七八糟面试题
    13-H5新特性
    怎么对电脑屏幕进行远程控制
    跟我读CVPR 2022论文:基于场景文字知识挖掘的细粒度图像识别算法
  • 原文地址:https://blog.csdn.net/qq_56271699/article/details/133948586