在日常测试过程中,我们也许会遇到这样一个常见,就是需要我们通过弹窗选择文件上传,而selenium的操作范围只是我们的阅览器,打开的弹窗属于电脑操作系统,selenium这时就无能为力啦,只能通过pywin32库提供的操作系统交互接口完成我们的需求。现在我就复现一个上传文件的过程,抛砖引玉,希望对大家有所帮助。

1.场景描述

  • 首先,点击上传按钮,我们会看到windows文件系统的弹窗
  • 选择我们需要上传的文件路径
  • 最后点击确认按钮上传 请添加图片描述

2.核心功能代码

选择指定目录下更新时间最新或者最旧的文件,其返回的文件的绝对路径

    def selectLastestOrOldestfile(folderPath,listFlag=0):
        filesList = os.listdir(folderPath)
        print(filesList)
        filesList.sort(key=lambda fn:os.path.getmtime(folderPath + "\\" + fn))  # 按时间排序
        if listFlag == 1 : 
            file_path = os.path.join(folderPath,filesList[0]) # 获取最老的文件保存到file_path
        else :
            file_path = os.path.join(folderPath,filesList[-1]) # 获取最新的文件保存到file_path
        return file_path

该函数将selectLastestOrOldestfile的返回值作为入参,完成上传确认

    def inputFileWithWindow(filePath):
        iRetVal = 0
        try:
            dialog = win32gui.FindWindow('#32770', 'Open')  # 对话框
            if dialog:
                ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
                ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
                Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)  # 上面三句依次寻找对象,直到找到输入框Edit对象的句柄
                if Edit:
                    button = win32gui.FindWindowEx(dialog, 0, 'Button', None)  # 确定按钮Button
                    if button : 
                        #win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'D:\\ProjectCode\\other-Installation-selenium\\lib\\IMX8-2.2.27.2.zip')  # 往输入框输入绝对地址
                        win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, filePath)
                        time.sleep(5)
                        win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 按button
                    else:   
                        print("error: 上传文件失败后确认失败")
                        iRetVal = -4                           
                else :
                    print("error: 未找到弹窗的输入框")
                    iRetVal = -3
            else :
                print("error:没有找到文件系统弹窗")
                iRetVal = -2
        except:
            print("error:上传文件失败")
            iRetVal = -1
        return iRetVal

至于其他操作就是通过selenium在页面点点点~