上传文件和下载文件
之前在项目中有遇到上传文件和下载文件操作,再此整理记录一下,便于以后查找
下载文件
- 由于手动下载文件时可能会选择文件存储路径(和浏览器的下载设置有关),为了避免这种情况,可设置下载文件的默认存储地址,将文件自动下载到设置的目录
- 以下是chrome浏览器的实现:
def download_file(url,loc):
'''
url:访问的url地址
loc:下载按钮元素
'''
option = webdriver.ChromeOptions()
# 获取当前工作路径
cwd=os.getcwd()
wpath = path.join(cwd,"download") #当前工作路径下的download文件夹
if not path.exists(wpath): 判断是否存在此目录,不存在则创建
os.makedirs(wpath)
profile = {'profile.default_content_settings.popups': 0, 'download.default_directory': wpath} #设置下载文件的默认路径
option.add_experimental_option('prefs', profile)
driver = webdriver.Chrome(options=option)
driver.get(url)
downFileEle=driver.find_element(*loc) #获取下载按钮元素
downFileEle.click() #进行点击下载
driver.quit()
上传文件
- 上传文件会涉及到打开windows选择文件,比较通用的方式是通过autoIT和pywin32实现
- 对于上传标签是input的话,直接用send_keys(“文件路径”)更方便
- 对于autoIt需要生成exe文件,然后调用执行,因此对于上传这个操作是否操作完成不太可控
input标签,send_keys上传文件
-
找到上传按钮的input标签,然后send_keys(“文件”)
file="d:\sc.exe" #需要上传文件在本地存放的路径 upload = driver.find_element(By.XPATH,'//input[@type="file"]') #定位上传控件 upload.send_keys(file)
autoIT
autoIT可以操作windows gui,用basic语法编写
-
安装autoIT后在其编辑器中编写上传的代码
;等待窗口打开 WinWait("CLASS:#32770]","",5) ;识别windows窗口 ControlFocus("打开","","Edit1") ;想输入框中输入需要上传的地址 ControlSetText("打开", "", "Edit1", "d:\sc.exe") Sleep(2000) ;点击[打开】按钮 ControlClick("打开", "","Button1");
-
在autoit的编辑器中
tools->go
运行查看是否编写的是否正确 -
点击
tools->complie
在脚本同目录下会编译成exe文件,使用os.system()执行文件即可
file="d:\sc.exe" #上传操作编译后的exe文件
upload = driver.find_element(*loc) #定位到上传按钮
upload.click() # 打开文件选择框
os.system(file)
win32
需要先通过pip install pywin32
来安装pywin32模块,来操作windows gui,实现上传文件操作
-
上传文件代码
import win32gui import win32con upload = driver.find_element(*loc) #定位上传按钮 upload.click() #打开上传文件的选择框 time.sleep(1) dialog = win32gui.FindWindow('#32770', u'打开') # 选择文件对话框 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, file) #输入框输入文件的绝对地址 win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 按button
-
通过
winspy++
找到窗口层级关系,如图所示
-
winspy++
下载后直接运行exe文件即可不需要安装
选中按钮后,点击右下角的locate
即可查看到层级关系