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

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

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

我们知道,Selenium里面,当我们获得一个 element 对象的时候,如果它是一个输入框,那么我们可以使用.send_keys()方法,模拟键盘按键,发送特定的字符串到输入框中,例如:

input_box = driver.find_element_by_xpath('//input[@class="xxx"]')
input_box.send_keys('账号 xxx')

但如果要说.send_keys()可以上传文件,你可能会非常吃惊吧。今天有个读者在问我的时候,我也非常吃惊,觉得这怎么可能:

结果我到 Selenium 的文档里面一看,发现send_keys()竟然真的可以上传文件: 8.5. How to upload files into file inputs ?[1]

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

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


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

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

from selenium.webdriver import Chrome
driver = Chrome('./chromedriver')
driver.get('http://127.0.0.1:5000')
file_input = driver.find_element_by_xpath('//input[@type="file"]')
file_input.send_keys('/Users/kingname/test_send_keys/target/x.txt')
submit = driver.find_element_by_xpath('//input[@type="submit"]')
submit.click()

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

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

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

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

假设在文件夹/Users/kingname/test_send_keys/target里面有多个文件,如下图所示:

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

代码可以写为:

import os
from selenium.webdriver import Chrome
folder = '/Users/kingname/test_send_keys/target'
file_name_list = os.listdir(folder)
path_list = [os.path.join(folder, x) for x in file_name_list]
path_split_by_newline = '\n'.join(path_list)
driver = Chrome('./chromedriver')
driver.get('http://127.0.0.1:5000')
file_input = driver.find_element_by_xpath('//input[@type="file"]')
file_input.send_keys(path_split_by_newline)
submit = driver.find_element_by_xpath('//input[@type="submit"]')
submit.click()

运行效果如下图所示:

成功上传多个文件。

目录
相关文章
|
6月前
|
Web App开发 Python
Python使用selenium的Chrome下载文件报错解决
Python使用selenium的Chrome下载文件报错解决
228 0
|
6月前
|
Web App开发 Python
python+selenium+Chrome 监测文件是否下载完毕
python+selenium+Chrome 监测文件是否下载完毕
207 0
|
6月前
|
Web App开发 Java 测试技术
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
【5月更文挑战第20天】本文介绍了自动化测试中如何实现无弹窗下载文件,主要针对Firefox浏览器。作者指出,通常的下载操作包括点击下载按钮,但这里讨论的是避免下载弹窗直接保存文件的方法。文章详细讲解了通过设置Firefox参数(如`browser.download.dir`、`browser.helperApps.neverAsk.saveToDisk`等)来实现这一功能,并给出了Java Selenium的示例代码,展示了如何创建FirefoxProfile并进行相关设置,以及如何启动浏览器和执行下载操作。
109 0
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
|
5月前
|
XML Java 测试技术
《手把手教你》系列技巧篇(六十七)-java+ selenium自动化测试 - 读写excel文件 - 中篇(详细教程)
【6月更文挑战第8天】本文介绍了Java中操作Excel的工具,包括POI和JXL。POI支持处理Office 2003及以下的OLE2格式(.xls)和2007以上的OOXML格式(.xlsx)。而JXL只能处理2003版本的Excel文件。文章详细讲解了如何下载和使用JXL库,并给出了一个简单的Java代码示例,展示如何读取2003版Excel文件中的数据。在实际项目中,由于JXL对新版本Excel的支持限制,通常推荐使用POI。
68 5
|
5月前
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
【6月更文挑战第9天】本文介绍了如何使用Java处理Excel文件中的不同数据类型,包括日期、数字、布尔值和标签(常规字符串)。文章提供了两个示例,分别使用JXL库和Apache POI库来读取Excel文件。
47 1
|
5月前
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)
【6月更文挑战第7天】本文介绍了在Java自动化测试中如何操作Excel数据。文章提到了当测试数据存储在Excel文件时,可以使用Apache的POI库来读写Excel。POI提供了对OLE2(.xls)和OOXML(.xlsx)格式的支持,比JXL库功能更全面。文章还详细讲解了如何下载和添加POI库到项目中,以及准备测试用的Excel文件。最后,给出了一个简单的Java代码示例,演示如何读取Excel文件的内容。
54 1
|
5月前
|
存储 Java 测试技术
《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)
【6月更文挑战第10天】本文介绍了如何在Java中读取CSV文件。首先解释了CSV是逗号分隔值的文本文件,常用于数据交换。接着,在项目实战部分,详细说明了如何通过下载并引入opencsv库来读取CSV文件:包括下载jar包、添加到Eclipse项目、创建CSV文件、编写Java代码读取文件内容,并展示了代码执行后的输出结果。文章以一个简单的代码示例展示了如何使用opencsv读取CSV文件中的数据。
42 0
|
6月前
|
Web App开发 Java 测试技术
《手把手教你》系列技巧篇(五十七)-java+ selenium自动化测试-下载文件-下篇(详细教程)
【5月更文挑战第21天】本文介绍了自动化测试中如何实现无弹窗下载文件,特别针对Chrome浏览器。通过设置`download.default_directory`和`profile.default_content_settings.popups`,可以避免下载弹窗并指定下载路径。示例代码展示了如何使用Java和Selenium实现这一功能,包括导入相关库、设置ChromeOptions和执行下载操作。最后,文章提到虽然没有介绍IE浏览器的下载方法,但已有Chrome和Firefox的方法已足够应对大多数需求。
216 0
|
6月前
|
Web App开发 前端开发 关系型数据库
检测selenium下载文件
检测selenium下载文件
45 1
|
数据采集 人工智能 JavaScript
python3爬虫:使用Selenium带Cookie登录并且模拟进行表单上传文件
前文再续,书接上一回,之前一篇文章我们尝试用百度api智能识别在线验证码进行模拟登录:[Python3.7爬虫:实时api(百度ai)检测验证码模拟登录(Selenium)页面](https://v3u.cn/a_id_134),这回老板又发话了,编辑利用脚本虽然登录成功了,但是有一些表单还是得手动上传,希望能改造成自动化流程。说实话,没毛病,机器能干的事,就没必要麻烦人了,拿人钱财,替人办事,开干。
python3爬虫:使用Selenium带Cookie登录并且模拟进行表单上传文件

热门文章

最新文章