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 strip lstrip rstrip使用方法
Sep 06 Python
python client使用http post 到server端的代码
Feb 10 Python
Python数据结构之Array用法实例
Oct 09 Python
Ubuntu下安装PyV8
Mar 13 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
python中类的属性和方法介绍
Nov 27 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
Python基于httpx模块实现发送请求
Jul 07 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
PHP中实现进程间通讯
2006/10/09 PHP
PHP详细彻底学习Smarty
2008/03/27 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
PDO::exec讲解
2019/01/28 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
Python递归函数实例讲解
2019/02/27 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
python要安装在哪个盘
2020/06/15 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
家佳咖啡店创业计划书
2013/12/27 职场文书
《雪儿》教学反思
2014/04/17 职场文书
解放思想演讲稿
2014/09/11 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
MySQL基础(一)
2021/04/05 MySQL
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
Win11软件图标固定到任务栏
2022/04/19 数码科技
mybatis 获取更新记录的id
2022/05/20 Java/Android