文件上传是所有UI自动化测试人员都要面临的一个比较头疼的文件, 今天就给大家分享一下几个处理文件上传的经验, 希望能给大家带来帮助, 避免掉到坑中.
首选我们需要区分出上传按钮的类型, 大体可以分为两种, 一种是input标签, 另一种就比较负载, 通过js, flash等实现.
我们分别对这两种进行分析:
1.input标签
input标签相信大家都非常清楚, 是可以直接通过send_keys()进行文件上传的.
来看代码案例:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://localhost/fileUpload.htm')
file_upload = driver.find_element(By.ID, 'file') # 定位上传文件input标签
file_upload.send_keys('d:\\test_imgage.png') # 输入上传的文件
print(upload.get_attribute('value')) # 验证文件上传是否成功
driver.quit()
输出结果为: test_imgage.png
因此, 大家可以通过输出的内容直观的观察看到, 对于input标签, 直接send_keys()是最简单的解决方案.
2.非input类型上传
对于这样的类型来说,难度就要升级一下了, 对于那些不是input标签实现的上传, 这种上传有些是使用a标签, 有用div的, 有用button的, 有用object的, 我们没有办法通过直接在网页上处理掉上传, 唯一的办法就是在打开系统弹窗, 去处理它.
系统弹窗设计的层面已经不是selenium能解决的了, 怎么进行处理呢? 很简单, 可以借助于能够实现系统弹窗的方式来进行处理.
那么常用的解决方案有那些呢?
1.pywinauto来控制windwos上的空间实现自动化操作.
2.SendKeys库
3.pywin32, 识别对话框句柄, 再进行后续操作
4.keybd_event
5.AutoIt 第三方识别
下面我们推荐两种案例:
1.使用pywinauto来控制实现上传:
首先安装pywinauto: pip install pywinauto
来看代码案例:
from selenium import webdriver
import time
import pywinauto
driver = webdriver.Chrome()
driver.get('https://localhost/fileUplaod.html')
driver.switch_to.frame("iframe")
driver.find_element(By.NAME, 'addImg').click()
time.sleep(2)
# 通过窗口打开
program = pywinauto.Desktop()
# 通过弹框名称进入控件中
window = program['打开']
# 输入上传图片的地址
window['Edit'].type_keys(r'd:\test_imgage.png')
#点击打开按钮
window['Button'].click()
2.SendKeys库实现文件上传
首先安装SendKeys: pip install SendKeys
来看代码案例:
from selenium import webdriver
import time
import SendKeys
driver = webdriver.Chrome()
driver.get('https://localhost/fileUplaod.html')
file_upload = driver.find_element(By.ID, 'file')
file_upload.click()
time.sleep(1)
# SendKeys
SendKeys.SendKeys(r'd:\test_imgage.png') # 发送文件地址
SendKeys.SendKeys("{ENTER}") # 发送回车键
print(file_upload.get_attribute('value'))
driver.quit()
通过SendKeys库可直接向焦点输入内容, 需要注意添加等待时间.
3.pywin32库实现文件上传
首先安装pywin32: pip install pywin32
安装完成后, 在python环境目录下Lib\site-packages\win32 目录中, 可以看到所有的API模块.
如果对pywin32的使用不是非常清楚, 可以查看pywin32.CHM就可以.
来看代码案例:
import win32gui
import win32con
# 一级窗口
no1 = win32gui.FindWindow("#32770","打开")
# 二级窗口,4个参数:父级;从父级的第几个儿子开始检索,0表示第一个;自身类名;文本内容,没有则None
combo_box_ex32 = win32gui.FindWindowEx(no1, 0, "ComboBoxEx32", None)
# 3级窗口
combo_box = win32gui.FindWindowEx(combo_box_ex32,0,"ComboBox",None)
# 4级窗口
edit = win32gui.FindWindowEx(combo_box,0,"Edit",None)
# 二级打开按钮
btn = win32gui.FindWindowEx(no1, 0, "Button", "打开(&O)")
# 输入文件地址
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, r'd:\test_imgage.png')
# 点击打开按钮 提交文件
win32gui.SendMessage(no1, win32con.WM_COMMAND, 1, btn)
4.autoIT介绍
1.AutoIT是一个类似脚本语言的软件,利用此软件我们可以方便的实现模拟键盘、鼠标、窗口等操作,实现自动化。
2、使用特点
利用AutoIT编写合适的脚本,然后将脚本编译成可执行文件,在自动化实现时,直接调用此脚本实现文件上传。
备注:编写脚本和编译,需要借助AutoIT提供的工具,但是脚本编译成可执行文件后,可以直接使用,不再需要安装AutoIT。
从官网上面下载AutoItv3并安装,安装好了之后可以在开始菜单看到AutoIt的各种工具。
其中分为几类,
AutoIT Window Info用来识别Windows控件,根据识别的控件信息编写脚本;
Complie Script to .exe,用来将利用AutoIt编写的脚本,编译成可执行文件;
Run Script 用来执行AutoIT的脚本信息;
SciTE Script Editor用来编写AutoIt脚本。
接下来就是利用以上四种工具,来编写AutoIT脚本,然后编译成可执行文件。
更多关于软件测试培训的问题,欢迎咨询千锋教育在线名师,如果想要了解我们的师资、课程、项目实操的话可以点击咨询课程顾问,获取试听资格来试听我们的课程,在线零距离接触千锋教育大咖名师,让你轻松从入门到精通。