文件上传自动化:从研发角度来看,目前实现文件上传的几种方式:
① 利用<input type="file"/>标签实现的,鼻尖是传统的上传方式。
② 利用js+flash或Ajax等插件进行上传。
selenium也有两种方式去实现自动化测试:
【<input标签>】一种
①send_keys() 自动化上传
实现方法:只要有input标签,一般都可以通过对这个按钮进行定位再传路径。如driver.find_element_by_name('upload').send_keys('D:\filename.txt')
代码实现如下:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.sahitest.com/demo/php/fileUpload.htm')
# 定位 “选择文件”按钮
upload = driver.find_element_by_id('file')
upload.send_keys('C:\test1.txt')
# print(pload.get_attribute('value'))
time.sleep(3)
driver.find_element_by_xpath('//input[3]').click()
# driver.quit()
【非input型上传】三种
① selenium + autolt实现文件上传
通过Autolt插件去结合selenium一起来实现文件的自动上传。
② win32gui
注意:需要安装 pywin32-2 18.win-amd64-py2.7 exe
需要安装pypiwin32
③ 最方便的Sendkeys 前提是:需要先安装Sendkeys库 pip install Sendkeys
注意:浏览器用Chrome,可能会回不支持,最好用火狐浏览器
第二种 -- 代码实现如下:
import time
from selenium import webdriver
import win32gui
import win32con
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = driver.find_element_by_id('file')
upload.click()
time.sleep(1)
# win32gui
dialog = win32gui.FindWindow('#32770', '文件上传') # 对话框
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # 上面三句依次寻找对象,直到找到输入框Edit对象的句柄
button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 确定按钮Button
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'C:\test1.txt') # 往输入输入绝对地址
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 按button
print(upload.get_attribute('value'))
time.sleep(5)
driver.quit()
第三种 -- 代码实现如下:
from selenium import webdriver
import win32gui
import win32con
import time
dr = webdriver.Firefox()
dr.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = dr.find_element_by_id('file')
upload.click()
time.sleep(1)
# SendKeys
SendKeys.SendKeys("C:\test1.txt") # 发送文件地址
SendKeys.SendKeys("{ENTER}") # 发送回车键
print(upload.get_attribute('value'))
dr.quit()