python+selenium的web自动化之针对上传操作的实现方案

201 篇文章 0 订阅
199 篇文章 0 订阅
一、关于上传操作

​ 上传有两种情况:

  • 如果是input可以直接输入路径的,那么直接使用send_keys(文件路径)输入路径即可;
  • 非input标签的上传,则需要借助第三方工具:第三方库 pywin32、第三方工具pyautogui等等。

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

二、input标签

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

  1. from selenium import webdriver

  2. driver = webdriver.Chrome()

  3. driver.get("http://xxxx")

  4. driver.maximize_window()

  5. # 定位上传文件元素

  6. input_file = driver.find_element_by_id("xxx")

  7. # 上传文件

  8. input_file.send_keys(r"D:\learn\xx.txt")

三、第三方库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的上传窗口是固定不变的,我们只需要封装好一个类知道如何去调用即可,不需要理解它的处理细节,但如果你有兴趣可以深入了解一下。

  1. import win32gui

  2. import win32con

  3. # edit - combobox - comboBoxEx32 - #32770 编辑框在第四级

  4. # button - #32770 打开按钮在第二级

  5. # 前提:window上传窗口已经出现,最好sleep 1-2秒等待窗口出现

  6. def upload(filepath, browser_type="chrome"):

  7. if browser_type == "chrome":

  8. title = "打开"

  9. else:

  10. title = ""

  11. # 找元素

  12. # 从一级开始找,一级窗口“#32770”,“打开”

  13. dialog = win32gui.FindWindow("#32770", title) # FindWindow用于找大窗口

  14. # 二级之后都用FindWindowEx,需要四个参数,

  15. # 1、元素的父亲,2、从第一个子代开始找元素,3、元素的类型名(class),4、元素的文本值

  16. comboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None) # 二级

  17. comBox = win32gui.FindWindowEx(comboBoxEx32, 0, "ComboBox", None) # 三级

  18. # 编辑框

  19. edit = win32gui.FindWindowEx(comBox, 0, 'Edit', None) # 四级

  20. # 打开按钮

  21. button = win32gui.FindWindowEx(dialog, 0, 'Button', '打开(&0)') # 二级

  22. # 往编辑框输入文件路径

  23. win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filepath) # 发送文件路径

  24. win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 点击打开按钮

  25. if __name__ == '__main__':

  26. upload('D:\\test.txt')

四、第三方工具pyautogui

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

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

  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <title>Title</title>

  6. </head>

  7. <body>

  8. <h1> hello world </h1>

  9. <input type="file" name="mfile">

  10. </body>

  11. </html>

​ 安装模块: pip install pyautogui,操作只需要两步:

  • 第一步:将要上传的文件路径写入到文件名的输入框内;
  • 第二步:敲回车,相当于点击【打开】按钮,注意回车presses要2次才能生效。
  1. import os

  2. import time

  3. import pyautogui as ui

  4. from selenium import webdriver

  5. driver = webdriver.Chrome()

  6. driver.implicitly_wait(20) # 隐式等待

  7. dir = os.getcwd()

  8. html_dir = os.path.join(dir, 'demo.html')

  9. driver.get(html_dir)

  10. file_elem = driver.find_element_by_name('mfile')

  11. file_elem.click()

  12. # 系统之间要等待

  13. time.sleep(1)

  14. file_dir = os.path.join(dir, 'test.txt') # 要上传的文件路径

  15. # 写入文件

  16. ui.write(file_dir) # 直接调用写入

  17. time.sleep(0.5)

  18. # 输入回车键, presses表示按的次数,按一次不会生效,有可能是执行太快,建议presses=2

  19. ui.press('enter', presses=2)

  20. time.sleep(2)

  21. driver.quit()

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

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值