对于自动化测试过程中去实现文件上传,我内心是拒绝的。
目前网上很多资料谈到文件上传动辄谈 AutoIt,这是一款早期的 Windows 自动化工具,用来模拟 Windows 上的操作。这款工具已经十来年没有更新过了。
先不谈使用这些工具实现上传是否靠谱,光说文件的上传过程。文件上传一般由如下过程构成:
- 点击某个按钮,比如上传、浏览等
- 浏览器会调用 Windows 的文件浏览对话框让用户选择文件
- 用户选择文件,并点击文件浏览对话框上的确定
- 页面接受 Windows 文件浏览对话框回传的文件路径
- 根据该路径去读取文件并通过 HTTP 请求发送到服务器。
这中间的文件浏览对话框类,是调用 Windows 的 API 实现的。并非属于浏览器的页面结构,因此脱离于浏览器之外,不能通过我们的 Selenium 来操作。
就必须要借助其他的 Windows 界面测试工具,比如上面提到的
AutoIt
, Python 相关库pywin32
,或者基于图形图像的测试工具 sikuli 等。
但是这些工具虽然可以完成,但是有一个共同的问题,无法与 CI 工具结合。目前自动化测试如果不能参与持续集成的话,基本上用途不大。
所以我内心是拒绝在自动化测试中加入这些内容,但是有些情况下又必须要上传文件,比如流程中必须要上传设计图、合同扫描件等。那该如何处理呢?
如果非要使用文件上传(需要好好掂量),可以使用 send_keys 和 requests 实现。
直接通过 send_keys 发送文件路径
目前大部分的文件上传是直接使用 HTML 中提供的 input[type="file"] 元素。比如:
可以直接找到该元素,并通过前面提到的 send_keys 即可实现上传。
driver.find_element_by_id('file-image__upload').send_keys('d:\data\test.jpg')
部分页面上有缩略图,通过这种方法可能无法看到缩略图。
通过 requests 实现文件上传
上面的方式之所以能够直接上传文件,是因为用的是 input 元素,本来就支持文本输入,我们相当于直接给它提供了本应该从文件浏览对话框中选择的文件路径字符串。
如果不是 input 元素的话,send_keys 的发送方式就没有效果了。这种时候就可以借助 requests 实现文件上传。
具体请查看 Python接口测试教程- requests 文件上传