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

目录
  • 1. input 元素上传文件
  • 2. input 元素隐藏
  • 3. 文件选择对话框
  • 4. 使用 pywinauto 上传文件
  • 5. pyautogui
    • 键盘
  • 6. 并发问题

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浏览器自动化上传文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动态加载的图片该怎么爬取到. 分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. headers = { 'User-Agent':'Mozilla/5.0 (Win

  • Selenium 模拟浏览器动态加载页面的实现方法

    相信爬取大公司的数据时,常常会遇到页面信息动态加载的问题, 如果仅仅使用content = urllib2.urlopen(URL).read(),估计信息是获取不全的,这时候就需要模拟浏览器加载页面的过程, selenium提供了方便的方法,我也是菜鸟,试了很多种方式,下面提供觉得最靠谱的(已经证明对于爬取新浪微博的topic.twitter under topic完全没问题). 至于下面的browser变量是什么,看前面的几篇文章. 首先是请求对应的URL: right_URL = URL.

  • Selenium控制浏览器常见操作示例

    本文实例讲述了Selenium控制浏览器常见操作.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上.测试系统功能--创建回归测试检验软件功能和

  • 使用selenium自动控制浏览器找不到Chromedriver问题

    ChromeDriver 是 google 为网站开发人员提供的自动化测试接口,它是 selenium2 和 chrome浏览器 进行通信的桥梁.selenium 通过一套协议(JsonWireProtocol :https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol)和 ChromeDriver 进行通信,selenium 实质上是对这套协议的底层封装,同时提供外部 WebDriver 的上层调用类库. 下面看下解决使用sele

  • Python+selenium 获取浏览器窗口坐标、句柄的方法

    1.0 获取浏览器窗口坐标 python目录可找到Webdriver.py 文件定义了get_window_rect()函数,可获取窗口的坐标和大小(长宽),但出现"Command not found"的情况.set_window_rect()函数也一样. def get_window_rect(self): """ Gets the x, y coordinates of the window as well as height and width of

  • 解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题

    目前由于phantomjs已经不维护了,而新版的Chrome(59+)推出了Headless模式,对爬虫来说尤其是定时任务的爬虫截屏之类的是一大好事. 不过按照网络上的一些方法来写的话,会报下面的错误: 后来经过分析,他们运行python是在mac或者linux下进行的,win下由于高版本的chromedriver只能通过路径进行指定,所以会出现这类找不到驱动程序的错误. 经过比对常识网络上的各种代码,后来得出了win下可顺畅执行的driver的写法如下: from selenium impor

  • 浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)

    1.打开指定的网页地址 我们使用selenium进行自动化测试时,打开浏览器之后,第一步就是让浏览器访问我们指定的地址,可使用get方法实现 from selenium import webdriver driver = webdriver.Edge() driver.get('https://www.baidu.com/') # 本行用于访问指定的地址 2.获取当前页面url 我们在测试过程中,有时需要获取当前页面的url以判断是否跳转到指定页面,获取页面url的方法如下: from sele

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

    目录 1. input 元素上传文件 2. input 元素隐藏 3. 文件选择对话框 4. 使用 pywinauto 上传文件 5. pyautogui 键盘 6. 并发问题 Selenium 封装了现成的文件上传操作.但是随着现代前端框架的发展,文件上传的方式越来越多样.而有一些文件上传的控件,要做自动化控制会更复杂一些,这篇文章主要讨论在复杂情况下,如何通过自动化完成文件上传. 1. input 元素上传文件 如果页面需要文件上传,那么在大多数情况下,都能在页面源代码中找到一个input的

  • php使用curl模拟浏览器表单上传文件或者图片的方法

    前言 在浏览器使用html中的input框我们可以实现文件的上传,表单元素选用 <input type="file"> 控件,form 表单需要设置 enctype="multipart/form-data" 属性.比如: <body> <form action="UploadFile.php" method="post" enctype="multipart/form-data&quo

  • python通过http上传文件思路详解

    这里主要是解决multipart/form-data这种格式的文件上传,基本现在http协议上传文件基本上都是通过这种格式上传 1 思路 一般情况下,如果我们往一个地址上传文件,则必须要登陆,登陆成功后,拿到cookies,然后在上传文件的请求携带这个cookies. 然后我们就需要通过浏览器在网站上传文件,这个时候我们需要打开浏览器的开发者工具或者fiddler,然后按照抓到包组装我们的上传文件的post请求 大家把握一个原则就是:在post请求中,用files参数来接受文件对象相关的参数,通

  • Java selenium上传文件的实现

    目录 下载和安装AutoIt 1.打开AutoIt的官网下载 下载和安装AutoIt 文件上传是自动化中棘手的部分,目前selenium并没有提供上传的实现api,所以知道借助外力来完成,如AutoIt.sikuli. AutoIt , 这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)的自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务; 1.打开AutoIt的官网下载 AutoIt下载链接:https://www.autoit

  • Python中Selenium上传文件的几种方式

    目录 1. input 元素上传文件 2. input 元素隐藏 3. 文件选择对话框 4. 使用 pywinauto 上传文件 5. pyautogui 6. 并发问题 Selenium 封装了现成的文件上传操作.但是随着现代前端框架的发展,文件上传的方式越来越多样.而有一些文件上传的控件,要做自动化控制会更复杂一些,这篇文章主要讨论在复杂情况下,如何通过自动化完成文件上传. 1. input 元素上传文件 如果页面需要文件上传,那么在大多数情况下,都能在页面源代码中找到一个input的元素.

  • FireFox浏览器使用Javascript上传大文件

    本程序是利用3.x的Firefox浏览器可以读取本地文件的特性,实现通过xmlHttPRequest上传大文件功能,并在可以上传过程中动态显示上传进度.略加修改,并与服务器端配合,可以实现断点续传等诸多功能.本例主要是研究FireFox的file-input节点的一些特性,其他客户端应用,如Flash.Sliverlight等,在实现客户端大文件上传时,在数据传输与服务器端存储等方面,与本例的思路基本一致.注意:文件体积似乎有临界点,但这个临界点是多少尚未确认.建议不要用此方法上传超过100M的

  • JS文件/图片从电脑里面拖拽到浏览器上传文件/图片

    1.效果展示 2.html 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="./upload.js"></script> <style> #drop img{width: 100px;he

  • Python SELENIUM上传文件或图片实现过程

    逛网站的时候经常会遇到需要上传图片的操作,这里主要来说下selenium操作上传文件的操作. 前提条件:定位的元素必须是type 属性是file类型.即type="file",如下图: 详细用法: 参考代码: from selenium import webdriver import time driver = webdriver.Chrome() def test_open_page(): '''打开界面''' driver.maximize_window() driver.get(

  • Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)

    http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的. multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体. multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要

  • 通过Ajax使用FormData对象无刷新上传文件方法

    写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比较敏感的网站慎用. 在工作中遇到了一个问题:在一个页面中,有4块内容,每块内容都包含一个图片上传功能,希望可以实现一键把这四块内容都上传上去. 我没有用插件实现上传功能,就是用的input[type=file],因此就遇到一个问题就是: ①传统的form表单会导致页面刷新,无法实现上述功能 ②把表单

随机推荐