Selenium浏览器自动化如何上传文件


Posted in Python onApril 06, 2022

Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展,文件上传的方式越来越多样。而有一些文件上传的控件,要做自动化控制会更复杂一些,这篇文章主要讨论在复杂情况下,如何通过自动化完成文件上传。

1. input 元素上传文件

如果页面需要文件上传,那么在大多数情况下,都能在页面源代码中找到一个input的元素。

<input type="file" name="file_name">

如果能直接在页面当中看到这个input元素,那么通过 selenium 的 send_keys 方法就能完成文件的上传,在参数中传入本地文件的路径。

driver.get('<https://testpages.herokuapp.com/styled/file-upload-test.html>')

el = driver.find_element('id', "fileinput")
el.send_keys('/path/of/file.png')

2. input 元素隐藏

通过修改元素属性,把隐藏的元素属性改掉。

el = driver.find_element('xpath', '//input[@type="file"]')
driver.execute_script('arguments[0].style.visibility=\\'visible\\'', el)
el.send_keys(r'C:\\Users\\muji\\Desktop\\avatar.png')

比如可以通过这种方式实现百度的以图搜图。

driver.get('<http://www.baidu.com>')
driver.find_element('css selector', '.soutu-btn').click()
time.sleep(3)
el = driver.find_element('xpath', '//input[@type="file"]')
driver.execute_script('arguments[0].style.visibility=\\'visible\\'', el)
el.send_keys(r'C:\\Users\\muji\\Desktop\\avatar.png')

3. 文件选择对话框

对于有一些元素,直接通过 selenium 自带的 send_keys 方法上传文件并不会成功。如果不想对input元素进行过多的分析,那么比较直接的方式是采用文件上传对话框来处理。

一般来说,如果需要上传文件,那么当你点击这个元素之后,会出现一个文件上传的对话框,要求你选择文件,并点击确定。这个对话框是属于系统的,因此selenium 无法直接控制它。我们可以采用系统的自动化工具或者直接调用键盘来操作这种对话框。

在操作对话框之前,首先我们通过 selenium 点击文件上传的元素。

el = driver.find_element('id', "fileinput")
ActionChains(driver).click(el).perform()

input 元素并不能点击,所以不能用元素的 el.click() 方法,需要使用 ActionChains 下面的 click 方法。他们之间的区别在于元素的 el.click 方法更加严格,会对元素是否可见,是否可点击进行检测,在点击事件完全生效后,再执行下面的操作,如果不满足这些条件,可能会报错。 而 Action 下的 click 方法则粗暴得多,它几乎不对对元素进行检测,直接把鼠标移动到元素上方,执行点击操作,至于点击是否生效,根本不管。

4. 使用 pywinauto 上传文件

pywinauto 是Windows系统下的一个自动化工具,它可以直接获取到Windows系统下面的弹框,因此当文件上传的窗口出现之后,我们可以使用这个工具传入文件的路径,然后点击打开按钮。

from pywinauto import Desktop

app = Desktop()
dialog = app['打开']  # 根据名字找到弹出窗口
dialog["Edit"].type_keys('/path/of/file.md')  # 在输入框中输入值
dialog["Button"].click()

另一种系统自动化工具叫做 pyautogui。这个工具最大的特点在于使用坐标系统定位元素,可以轻而易举的做到跨平台。不管你是Windows,mac还是Linux,都可以使用这款工具实现自动化。

但是这款工具目前不支持中文的输入,因此我们需要借助剪切板来实现中输入。首先我们把对应的中文复制到剪切板当中,然后再通过 ctrl + v 热键粘贴到文件路径输入框当中。

5. pyautogui

import pyperclip

 pyperclip.copy('D:\\\\用户.html')
 pyautogui.hotkey('ctrl', 'v')
 pyautogui.press('enter', presses=2)

键盘

keyboard.write('C:\\\\Users\\\\muji\\\\Desktop\\\\avatar.png')
time.sleep(1)
keyboard.press('enter')

注意:百度以图搜图禁用了爬虫,所以在上传文件时会提示「图片上传失败,请重新上传」。

6. 并发问题

通过系统窗口上传文件简单粗暴,但是当你的程序需要并发执行时,使用这种方式实现文件上传就比较麻烦了。如果你的程序需要并发执行,最好还是通过控制input元素,使用 send_keys 方法实现文件上传。

到此这篇关于Selenium浏览器自动化如何上传文件的文章就介绍到这了,更多相关Selenium浏览器自动化上传文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python reduce 函数使用详解
Dec 05 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
Python从零开始创建区块链
Mar 06 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
python隐藏类中属性的3种实现方法
Dec 19 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
python numpy实现rolling滚动案例
Jun 08 Python
python安装sklearn模块的方法详解
Nov 28 Python
python 如何用terminal输入参数
May 25 Python
在Python 中将类对象序列化为JSON
Apr 06 #Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
You might like
写一个用户在线显示的程序
2006/10/09 PHP
php判断是否为json格式的方法
2014/03/04 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
2014/10/08 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python之PyMongo使用总结
2017/05/26 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
python pytest进阶之fixture详解
2019/06/27 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
C语言编程题
2015/03/09 面试题
网络安全方面的面试题
2016/01/07 面试题
致垒球运动员加油稿
2014/02/16 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
主要负责人任命书
2014/06/06 职场文书
2014年教师节寄语
2014/08/11 职场文书
验房委托书
2014/08/30 职场文书
金砖之国观后感
2015/06/11 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python