该文章会同步更新于我的个人网站 CaveOfSpongeBob ,欢迎大家关注我的网站!!!
在日常测试过程中,我们也许会遇到这样一个常见,就是需要我们通过弹窗选择文件上传,而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在页面点点点~