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 相关文章推荐
python基础教程之Hello World!
Aug 29 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
python3学生名片管理v2.0版
Nov 29 Python
在python里面运用多继承方法详解
Jul 01 Python
Python SQLAlchemy入门教程(基本用法)
Nov 11 Python
python 实现图片批量压缩的示例
Dec 18 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 Python
深度学习详解之初试机器学习
Apr 14 Python
Python利用FlashText算法实现替换字符串
Mar 31 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
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
jupyter notebook实现显示行号
2020/04/13 Python
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
在C#中如何实现多态
2014/07/02 面试题
电子技术专业中专生的自我评价
2013/12/17 职场文书
商场促销活动策划方案
2014/08/18 职场文书
司考复习计划
2015/01/19 职场文书
总经理年会致辞
2015/07/29 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang