UI自动化进行文件上传,其实本质就是将所需上传的文件路径,传递给后端服务即可,至于读取文件的过程,其实开发人员已经在后端服务中完成了。所以我们要做的就是:拿到文件路径 -> 传出去。那么这里呢,其实是涉及到几种情况:
1. 浏览器input标签上传的,那么直接使用selenium就可以完成
2. 非浏览器input标签呢,又分为两种情况:
(1) windows,自然就是要调用 windows 文件上传弹窗进行操作;
(2) mac,我不用mac,所以没做过,后续有时间再找资料给大家补充一下。;
1.input标签
这是最简单的情况,直接使⽤ send_keys() 方法,写入文件上传路径即可,代码如下:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('替换为url')
# 顺便提一嘴,定位元素并进行操作的两种方式,建议实际实现中,可以将所有的元素定位进行整合调用,这样便于其他地方可以直接引用定位好的元素
# 写法一
location = driver.find_element_by_xpath('xxxx') # 定位到元素
location.send_keys('替换为所需上传的文件路径') # 输入文件路径
# 写法二
driver.find_element(By.XPATH,'xxxx').send_keys('替换为所需上传的文件路径')
# 备注:文件上传需要时间,一般建议根据实际业务场景进行睡眠等待
2.非input标签
2.1 windows
windows系统下,该情况一般都需要操作 windows 系统的文件上传弹窗,非浏览器元素,所以无法 selenium 直接定位上传,但我们可以借助三方工具完成上传
步骤如下:
2.1.1 安装 pywinauto
- 键盘win+R,输入cmd
- 敲击回车打开命令行
- 安装 pywinauto
pip install pywinauto
备注:
1.如果安装了多版本python,可以通过在命令前面加 'py -版本号 -m ’ 使用
2.如果下载失败,可以在命令后加 ‘-i 镜像地址’ 替换国内镜像使用
国内常用镜像地址,可以收藏使用,以备不时之需:
2.1.2 引用 pywinauto
引入 pywinauto 完成文件上传的代码如下:
from selenium import webdriver
# 引入 send_keys 方法
from pywinauto.keyboard import send_keys
driver = webdriver.Chrome()
driver.get('替换为url')
# 定位到元素
location = driver.find_element_by_xpath('xxxx')
# 点击元素,打开上传文件弹窗
location.click()
time.sleep(2) # 建议强制等待2秒,等待系统弹窗就绪
# 通过引入的 send_keys 方法,输入文件路径
send_keys('替换为所需上传的文件路径')
# 敲击回车键
send_keys("{VK_RETURN}")
2.2 mac(待补充)