天天看点

input上传文件_现场打脸:如何使用Selenium批量上传文件?

input上传文件_现场打脸:如何使用Selenium批量上传文件?

摄影:产品经理 霸王餐里面的牛蛙

我们知道,Selenium里面,当我们获得一个 element 对象的时候,如果它是一个输入框,那么我们可以使用

.send_keys()

方法,模拟键盘按键,发送特定的字符串到输入框中,例如:

但如果要说

.send_keys()

可以上传文件,你可能会非常吃惊吧。今天有个读者在问我的时候,我也非常吃惊,觉得这怎么可能:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

结果我到 Selenium 的文档里面一看,发现

send_keys()

竟然真的可以上传文件: 8.5. How to upload files into file inputs ?[1]

input上传文件_现场打脸:如何使用Selenium批量上传文件?
input上传文件_现场打脸:如何使用Selenium批量上传文件?

为了验证这个说法,我们使用 Flask 手写一个支持上传功能的简陋网站。网站代码如下:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

网站运行效果如下图所示:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

点击“选择文件”按钮,在弹出的对话框里面选中一个文件,然后点击“Upload”按钮,就会把文件上传到代码里面的

uploads

文件夹中,如下图所示:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

现在我们在 Selenium 里面进行测试:

经过测试,发现确实可以正常上传文件。如下图所示:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

这样一来,既然

.send_keys()

能够正常工作,那么就可以反向推测出,浏览器上传文件的原理,选择文件的对话框实际上提供给浏览器的仅仅是一个文件路径。当我们点击了上传按钮以后,浏览器会根据这个路径去读硬盘,找到这个文件然后上传。由于文件路径本质上就是一个字符串,所以用

.send_keys()

本质上就是直接替代了选择文件对话框生成的文件路径,直接把这个路径上传给了文件输入表单。

那么如何一次性上传多个文件呢?

只要网站支持同时上传多个文件,那么我们可以把多个文件的路径拼接到一个长字符串中,路径与路径之间使用换行符

\n

来进行分割。

假设在文件夹

/Users/kingname/test_send_keys/target

里面有多个文件,如下图所示:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

我们需要一次性全部上传。那么,可以使用换行符把每一个文件的路径拼接起来:

代码可以写为:

运行效果如下图所示:

input上传文件_现场打脸:如何使用Selenium批量上传文件?

成功上传多个文件。

参考资料

[1]

8.5. How to upload files into file inputs ?: https://selenium-python.readthedocs.io/faq.html?highlight=send_keys#how-to-upload-files-into-file-inputs

input上传文件_现场打脸:如何使用Selenium批量上传文件?

继续阅读