上传附件是我们在测试BS系统的时候经常遇到的功能,然而在处理上传附件的自动化代码并不总是有效的,因此需要掌握多种上传附件的手段,本节笔者将介绍几种上传附件的方法,应该可以满足绝大多数的情况。
被测页面
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>上传文件</title>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>选择文件</h3>
<input type="file" name="fileupload" />
</div>
</div>
</body>
</html>
测试代码
def test_upload_by_sendkeys(self):
chrome_driver = webdriver.Chrome()
chrome_driver.get("file:///C:/Users/Administrator/Desktop/fileupload.html")
chrome_driver.find_element_by_name("fileupload").send_keys("E:\\test_upload_file.txt")
time.sleep(10)
chrome_driver.quit()
借助AutoIt实现上传
如果页面标签非input类型,可以通过第三方工具来完成上传操作。
- 首先第一步下载AutoIt工具,浏览器访问https://www.autoitscript.com/files/autoit3/autoit-v3-setup.exe,即可直接下载,下载完成后双击autoit-v3-setup.exe文件,默认选项安装即可,安装完成后,在操作系统的开始菜单中能看到相关菜单项
- 用浏览器打开上一小节创建的fileupload.html文件,然后在打开的页面中点击“选择文件”此时选择文件的窗口将弹出
- 在开始菜单中点击AutoIt Window Info,改程序存在两个版本(x86)表示32位版本,(x64)表示64位版本,读者朋友根据自己的操作系统版本启动相应的AutoIt版本即可,启动成功后
- 在AutoIt Window Info窗口中间部分有几个标签,然后拖拽Finder Tool到“打开”按钮上,便可获取该控件的窗口信息
- 启动SciTE Script Editor,在开始菜单AutoIt v3路径里的可以找到他
- 编写脚本,在SciTE Script Editor中写入如下内容,然后在选择文件的窗口打开的情况下,在SciTE Script Editor窗口按键盘上F5键,执行脚本,脚本运行正常,即可保存到我们PO项目下的Util路径中,命名为upload_file,保存成功后,会生成一个upload_file.au3的文件
; ControlFocus("title", "text", "ClassnameNN") ControlFocus函数的用法
ControlFocus("打开", "", "Edit1")
; 等待10秒
WinWait("[CLASS:#32770]", "", 10)
; 在文件名控件里设置要上传的文件全路径
ControlSetText("打开", "", "Edit1", "E:\test_upload_file.txt")
Sleep(2000)
; 点击打开按钮
ControlClick("打开", "", "Button1")
- 然而这个upload_file.au3文件并不能被Python执行,需要将其编译成.exe文件以供Python调用,启动Compile Script to .exe,在开始菜单Auto v3路径里可以找到它,启动(x86)或者(x64)根据自己的操作系统版本对应选择即可
- 选择之前保存的au3文件,点击Convert按钮,将其转换为.exe文件
- Python脚本调用该.exe完成文件的上传
import os # 引入os模块用于调用.exe文件执行
def test_upload_by_autoit(self): # 定义测试方法
chrome_driver = webdriver.Chrome() # 启动浏览器
#打开我们的html文件
chrome_driver.get("file:///C:/Users/Administrator/Desktop/fileupload.html")
chrome_driver.find_element_by_name("fileupload").click()
os.system("E:\\PO\\Util\\upload_file.exe") # 调用我们编译好的.exe文件
time.sleep(10) # 强制等待10秒
chrome_driver.quit()
模拟键盘实现上传
封装操作剪切板方法
# encoding = utf-8
import win32clipboard as wc
import win32con
class Simulate_Clipboard:
# 读取剪切板
@staticmethod
def get_clipboard():
# 打开剪切板
wc.OpenClipboard()
# 获取剪切板中的数据
data = wc.GetClipboardData(win32con.CF_TEXT)
# 关闭剪切板
wc.CloseClipboard()
# 返回剪切板数据给调用者
return data
# 设置剪切板内容
@staticmethod
def set_clipboard(content):
# 打开剪切板
wc.OpenClipboard()
# 清空剪切板
wc.EmptyClipboard()
# 将数据astring写入剪切板
wc.SetClipboardData(win32con.CF_UNICODETEXT, content)
# 关闭剪切板
wc.CloseClipboard()
方法调用
# 将模拟剪切板的类引入到测试代码文件中
from Util.Clipboard_Simulation import Simulate_Clipboard
def test_simulate_clipboard(self): # 定义测试方法
Simulate_Clipboard.set_clipboard("set clipboard") # 设置剪切板内容
str = Simulate_Clipboard.get_clipboard() # 获取剪切板内容并赋给str
print(str) # 将剪切板内容打印到控制台
截切板配合键盘实现上传
def test_upload_by_simulation(self): # 定义测试方法
# 设置剪切板内容,将文件全路径放到剪切板中
Simulate_Clipboard.set_clipboard("E:\\test_upload_file.txt")
chrome_driver = webdriver.Chrome() # 启动浏览器
# 打开我们的html文件
chrome_driver.get("file:///C:/Users/Administrator/Desktop/fileupload.html")
chrome_driver.find_element_by_name("fileupload").click()
time.sleep(5)
Simulate_Keyboard.click_twokey('ctrl', 'v') # 模拟键盘Ctrl+V组合键,黏贴剪切板内容
time.sleep(5)
Simulate_Keyboard.click_onekey('enter') # 模拟键盘回车键
time.sleep(20)