Python中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 方法实现文件上传。

到此这篇关于Python中Selenium上传文件的几种方式的文章就介绍到这了,更多相关Python Selenium上传文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • selenium+python实现文件上传操作的方法实例

    前言 selenium处理文件上传大致会有两种情况,一种是文件上传使用的是input标签元素,即<input type="file">,那么对这个input标签元素使用sendkeys方法输入文件的路径就可以完成上传,另一种是调用windows系统完成文件上传,即文件上传会弹出windows弹窗,此时则需要借助Autoit这样一个小工具结合selenium完成. 方法如下 1.文件上传使用的是input标签元素,selenium+python代码示例参考如下: import

  • 基于python的selenium两种文件上传操作实现详解

    方法一.input标签上传 如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操作方法. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情况: 1.AutoIt 去调用它生成的au3或者exe格式的文件 2.SendKeys第三方库(目前只支持到2.7版本) 网址:https://pypi.python.org/pypi/SendKeys/ 3.Python的pywin32库,通过识别对话框句柄来进行操作

  • python+selenium+autoit实现文件上传功能

    问题 在做web端ui层自动化的时候会碰到文件上传的操作,经常有朋友问到,这里总结一下 解决方案 第一种:type=file的上传文件,类似如下的 使用类似这样的代码就可以完成: driver.find_element('name','file').send_keys('./小强测试品牌.png') 第二种:就是第一种除外的,实现起来较为麻烦,这里用到了autoit,大致步骤如下: 1.下载并安装autoit,之后在开始菜单可以看到如下 AutoIt Windows Info 用于识别Windo

  • Python爬虫中Selenium实现文件上传

    前言:大部分的文件上传功能都是用input标签实现,这样就完全可以把它看作一个输入框,可以通过send_keys()指定文件进行上传了. 本章中用到的关键方法如下: send_keys():上传文件或者输入文本 from selenium import webdriver import time driver = webdriver.Chrome() driver.get('http://file.yiyuen.com/file/') # 定位上传按钮,添加本地文件 driver.find_el

  • Python selenium文件上传方法汇总

    文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家分享下自己处理文件上传的经验,希望能够帮助到广大被文件上传坑住的seleniumer. 首先,我们要区分出上传按钮的种类,大体上可以分为两种,一种是input框,另外一种就比较复杂,通过js.flash等实现,标签非input 我们分别对这两种进行分析: 1.input标签 众所周知,input标签是可以直接send_keys的,这里也不例外,来看代码示例: 示例网址:http://www.sahitest.com/demo

  • 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(

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

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

  • Python selenium文件上传下载功能代码实例

    上传 html文件内容如下:操作步骤 <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>upload_file</title> <script type="text/javascript" async="" src="htt

  • Python中selenium实现文件上传所有方法整理总结

    文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家分享下自己处理文件上传的经验,希望能够帮助到广大被文件上传坑住的seleniumer. 首先,我们要区分出上传按钮的种类,大体上可以分为两种,一种是input框,另外一种就比较复杂,通过js.flash等实现,标签非input 我们分别对这两种进行分析: 1.input标签 众所周知,input标签是可以直接send_keys的,这里也不例外,来看代码示例: 代码: # -*- coding: utf-8 -*- from

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

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

  • django上传文件的三种方式

    Django文件上传需要考虑的重要事项 文件或图片一般通过表单进行.用户在前端点击文件上传,然后以POST方式将数据和文件提交到服务器.服务器在接收到POST请求后需要将其存储在服务器上的某个地方.Django默认的存储地址是相对于根目录的/media/文件夹,存储的默认文件名就是文件本来的名字.上传的文件如果不大于2.5MB,会先存入服务器内存中,然后再写入磁盘.如果上传的文件很大,Django会把文件先存入临时文件,再写入磁盘. Django默认处理方式会出现一个问题,所有文件都存储在一个文

  • 简述Java异步上传文件的三种方式

    本文为大家分享了三种Java异步上传文件方式,供大家参考,具体内容如下 用第三方控件,如Flash,ActiveX等浏览器插件上传. 使用隐藏的iframe模拟异步上传. 使用XMLHttpRequest2来实现异步上传. 第一种使用浏览器插件上传,需要一定的底层编码功底,在这里我就不讲了,以免误人子弟,提出这点大家可以自行百度. 第二种使用隐藏的iframe模拟异步上传.为什么在这里说的是模拟呢?因为我们其实是将返回结果放在了一个隐藏的iframe中,所以才没有使当前页面跳转,感觉就像是异步操

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

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

  • 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

  • 定制FileField中的上传文件名称实例

    FileField中的upload_to属性可以设定上传文件的存储目录和名称,它可以是个字符串,也可以是个callable,比如一个方法. 当upload_to的值设为一个方法时,就可以对上传文件的名称进行修改了.方法需要两个参数,instance与filename,instance为此FileField所属的Model实例,filename为上传文件的名称. 举例: def user_directory_path(instance, filename): # file will be uplo

  • Python实现FTP上传文件或文件夹实例(递归)

    本文实例讲述了Python实现FTP上传文件或文件夹实例.分享给大家供大家参考.具体如下: import sys import os import json from ftplib import FTP _XFER_FILE = 'FILE' _XFER_DIR = 'DIR' class Xfer(object): ''''' @note: upload local file or dirs recursively to ftp server ''' def __init__(self): s

  • 关于定制FileField中的上传文件名称问题

    FileField中的upload_to属性可以设定上传文件的存储目录和名称,它可以是个字符串,也可以是个callable,比如一个方法. 当upload_to的值设为一个方法时,就可以对上传文件的名称进行修改了.方法需要两个参数,instance与filename,instance为此FileField所属的Model实例,filename为上传文件的名称. 举例: def user_directory_path(instance, filename): # file will be uplo

  • vue中实现上传文件给后台实例详解

    FormData 对象的使用: 1.用一些键值对来模拟一系列表单控件:即把form中所有表单元素的name与value组装成 一个queryString 2. 异步上传二进制文件. (ps:说白了就是不使用form表单实现form表单提交数据或文件,如果还是不懂,请自行百度) 实现过程 1.使用type类型为file的input框实现选择文件(顺便记录一下修改input框的默认样式) 2.修改input框的默认样式 3.通过选择文件拿到数据 4.请求接口 以上就是本次关于vue中实现上传文件给后

随机推荐