上传文件是web比较常见的功能之一,但webdriver并没有提供专门用于上传的方法,因为上传一般意味着要与操作系统进行交互。比如点击"上传"按钮后,就会打开本地操作系统的窗口以供选择要上传的文件,而到这一步,webdriver是没有办法与之交互操作系统控件的。
在 Web 页面中一般通过以下两种方式实现文件上传。
- 普通上传:将本地文件路径作为一个值放在input 标签中,通过form 表单将这个值提交给服务器。
- 插件上传:一般是指基于Flash、JavaScript 或Ajax 等技术实现的上传功能。
对于通过 input 标签实现的上传功能,可以将其看作一个输入框,即通过send_keys()
指定本地文件路径的方式实现文件上传。
下面通过一个本地实例来演示通过表单上传的例子:
<html>
<head>
<meta charset="utf-8">
<title>上传表单</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
rel="stylesheet" >
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js">
</script>
</head>
<body>
<div class="jumbotron">
<form class="form-inline" role="form">
<div class="form-group">
<label class="sr-only" for="name">名称</label>
<input type="text" class="form-control" id="name"
placeholder="请输入名称">
</div>
<div class="form-group">
<label class="sr-only" for="inputfile">文件输入</label>
<input type="file" id="inputfile">
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
</div>
</body>
</html>
在浏览器中打开的效果如下:
import os
from selenium import webdriver
file_path = os.path.abspath('./files/')
driver = webdriver.Chrome()
upload_page = 'file:///' + file_path + 'upload.html'
driver.get(upload_page)
# 定位上传按钮,添加本地文件
driver.find_element_by_id("file").send_keys(file_path + 'test_up_load.txt')
这里测试的页面(upfile.html)和上传的文件(test.txt)位于与当前程序同目录的files/目录下。通过这种方式上传,就避免了操作Windows 控件。前提是如果能找到上传的input 标签,那么基本可以通过send_keys()方法输入一个本地文件路径实现上传。
对于插件上传的,可以通过AutoIt
这款开源软件来实现,其是专门用于Windows GUI实现自动化操作的。可以通过一系列步骤将自动化操作封装成脚本或.exe文件,然后再通过Python去调用,这样结合Selenium和AutoIt就可以实现web的上传文件功能。有兴趣的小伙伴可以自行去了解下,后续有机会的话我也会推出新文章介绍一下。