Selenium系列教程 - 文件上传_劫天的博客-程序员ITS304_selenium怎么上传本地文件

技术标签: selenium 快速入门系列  AutoIt上传文件  selenium  测试工具  文件上传  多文件上传  


在Web UI自动化测试中可能会遇到文件上传的场景,针对该场景我们要区分上传按钮的种类,大体上可以分为两种,一种是input框 <input type="file">,另外一种就比较复杂,通过js等实现。

一、通过send_keys方法(该方法只适用于input标签)

查看上传按钮的元素标签为input标签,调用send_keys方法传入文件路径即可,无需模拟弹出windows选择框且选择文件的过程。通过该方法可以简单、高效的实现选择文件的目的,避免将处理思路卡在如何选择文件这个问题上。
在这里插入图片描述
代码:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
driver.implicitly_wait(10)

driver.find_element_by_css_selector('form>#file').send_keys(r'C:\Users\Administrator\Desktop\1.txt')
driver.find_element_by_css_selector('form>input[type="submit"]').click()

time.sleep(3)
driver.quit()

二、通过AutoIt来处理上传文件(适用所有)

对于那些不是input框实现的上传怎么办,这种上传千奇百怪,有用a标签的,有用div的,有用button的,有用object的,我们没有办法通过直接在网页上处理掉这些上传,唯一的办法就是打开windows弹框,去处理弹框。

问题又来了,windows弹框涉及的层面已经不是selenium能解决的了,怎么办?很简单,使用AutoIt去处理呗。

关于AutoIt的使用方法我在另一篇博文中讲,请参见Selenium系列教程 - AutoIt命令行参数 。这里不再赘述。

  1. 由于不同的浏览器,获取到的弹窗标题不一样,所以要区分开,通过传参的方式判定,废话少说,直接上AutoIt的代码:
;first make sure the number of arguments passed into the scripts is more than 1
If $CmdLine[0]<2 Then Exit EndIf ;if parmas num <2 ,then break
;$CmdLine[0] ;参数的数量
;$CmdLine[1] ;第一个参数 (脚本名称后面)
;$CmdLine[2] ;第二个参数
;都是从cmd传入参数
handleUpload($CmdLine[1],$CmdLine[2])

;定义上传函数,有两个参数,第一个是浏览器名字,第二参数是文件路径
Func handleUpload($browser, $uploadfile)
   Dim $title                             ;定义一个title变量
   ;根据浏览器来判断弹窗的title来判断是什么
   If $browser="ie" Then                  ; 代表IE浏览器
	  $title="选择要加载的文件"
   ElseIf $browser="chrome" Then          ; 代表谷歌浏览器
	  $title="打开"
   ElseIf $browser="firefox" Then         ; 代表火狐浏览器
	  $title="文件上传"
   EndIf

   if WinWait($title,"",4) Then           ;等待弹出出现,最大等待时间是4秒
	  WinActivate($title)                 ;找到弹出窗口之后,激活当前窗口
	  ControlSetText($title,"","Edit1",$uploadfile)   ;把文件路径放入输入框,此”Edit1“是用FinderTool获取到的
	  Sleep(1000)
	  ControlClick($title,"","Button1")               ;点击保存或者打开或者上传按钮,此“Button1”使用FinderTool获取到的
   Else
	  Return False
   EndIf
EndFunc

  1. 将上面的代码编译为exe文件,以供代码调用。
    在这里插入图片描述
  2. 通过python代码调用编译的exe文件处理上传弹窗,使用什么浏览器就传什么参数。
import os
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
# 点击“选择文件”按钮
driver.find_element_by_css_selector('form>#file').click()
# 调用exe上传文件
command = "C:\\upload.exe" + " " + "chrome" + " " + " C:\\Users\\Administrator\\Desktop\\1.txt"
os.system(command)
time.sleep(3)
# 点击“Submit Single”按钮
driver.find_element_by_css_selector('form>input[type="submit"]').click()

time.sleep(3)
driver.quit()

由于AutoIt的代码中已经加了等待弹窗出现的时间,所以python中未加等待时间,必要的时候需要加时间等在,来降低脚本的出错率。

三、其他方法

1、pywin32库,识别对话框句柄,进而操作
2、SendKeys库,不稳定,不推荐
3、keybd_event,跟2类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v…

这些方法就不介绍了,如果想要研究,自己百度去学习吧。

四、多文件上传

接下来还有一种情况值得我们考虑,那就是多文件上传。如何上传多个文件,当然我们还是往输入框里输入文件路径,所以唯一要搞清楚的就是多文件上传时,文件路径是怎么写的。

多文件上传就是在文件路径框里用引号括起单个路径,然后用空格隔开多个路径,例如:
“D:\a.txt” “D:\b.txt”
但需要注意的是:只有多个文件在同一路径下,才能这样用,否则是会失败的(下面的写法是不可以的):
“C:\a.txt” “D:\b.txt”

在这里插入图片描述
可见,多文件上传并没有那么复杂,也很简单,唯一的区别就是输入的参数不同而已。

在这里插入图片描述


在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hwijew/article/details/122684313

智能推荐

Spry学习(二)----XML数据集及主从表显示 _majkandy的博客-程序员ITS304

页面代码:test.html 1head> 2    meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 3    title>Spry Exampletitle> 4     5    Link the Spry libraries--> 6    script type="text/javascript"

Apache Kafka 2.7.0 稳定版发布,有哪些值得关心的变化?_过往记忆的博客-程序员ITS304

Apache Kafka 2.7.0 于2020年12月21日正式发布,这个版本是目前 Kafka 最新稳定版本,大家可以根据需要自行决定是否需要升级到次版本,关于各个版本升级到 Apa...

How to sync a fork repo to keep it up-to-date with the upstream repo on Windows?_Benjamin_Xu的博客-程序员ITS304

In this article I'll introuduce how to sync a fork repo to keep it up-to-date with the upstream repo on Windows7 or other Win-OS.Because the sync's operation on Linux&&Unix is easier than on Windows

ChemDraw 16最新版本发布 更效率科研的首选_weixin_33958366的博客-程序员ITS304

ChemDraw一直是全球领先的科学绘图软件,致力于为科学家、教师以及学生提供最新的智能应用程序。ChemDraw 16版本相较于15版本做出了较大的改进,大大缩短科研时间,提高科研效率。扩展Name-to-Structure库, 完美兼容win10和Office 365、3D建模等。ChemDraw 16最新版体验地址:http://www.chemdraw.com.cn/xiazai.ht...

Spring Boot 引入Elasticsearch7_不会飞的鹰m的博客-程序员ITS304_elasticsearch7 springboot

Spring Boot 引入Elasticsearch7前置条件这里使用的Elasticsearch版本为7.26,之前有在ELK安装中有介绍过了具体安装方法。有想法的小伙伴可以去考古一下!在这里的使用场景需要将多个数据库的数据增量同步到ES中,使用到了Logstash导入数据库数据到ES,而到了这一步是为了去查询ES中存在的数据,并对数据进行处理统计。引入依赖&lt;!-- 这里使用的Spring boot 2.3.5.RELEASE 兼容 Elasticsearch7.* 其他版本请自行百度

第一次互联网实习面试经历_风中摇曳的叶子的博客-程序员ITS304

实习面试经历研一暑假今年八月初的时候找数据方向的实习面了几家互联网,很遗憾都挂在面试上了,但是失败也是能总结很多东西的,姑且当做是去取取经知道自己哪里不行。已经过去两个多月了一直觉得这个过程是非常值得写一写,给自己以后留用的。无奈当时并没有那个心思,还好当时记下了一些面试的问题。现在突然想整理一下了。【网易实习面试】数据挖掘岗位面试时间2017/8/3下午2:00面试形式:笔试+面

随便推点

VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到虚拟机: 系统找不到指定的文件。_蓝色小靴子的博客-程序员ITS304_vmware未能将管道连接到虚拟机:系统找不到指定的文件

今天碰到了VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到虚拟机: 系统找不到指定的文件问题,应该是上次关闭虚拟机时出现了问题。最终如下用如下方法解决:1.右键VMware选择属性,进入兼容性界面,把以管理员身份运行勾上2.再次打开虚拟机发现出现新错误:VMX进程已提前退出解决方案:打开开始菜单设置应用下拉找到VMware点击修改选择下一歩点击修复修复...

流媒体服务器(4)—— 流媒体协议系列之RTMP_Data-Mining的博客-程序员ITS304

RTMP一、总体介绍RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。RTMP工作在TCP之上,默认使用端口1935。工作原理:RTMP 的 message 会切分为 n 个 chunk,再通过TCP协议传输。为什么 rtmp 基于 tcp 协议,tcp 协议已经有化整为零的方式, rtmp 还需要将 message 划分更小的单元 chunk 呢?分析原...

全是干货--Linux安装及管理程序_大聪明胖胖龙的博客-程序员ITS304

一、Linux应用程序基础:1、应用程序与系统命令的关系:角色 系统命令 应用程序 文件位置 一般在/bin和/sbin目录中,或为shell内部指令 通常在/usr/bin和/usr/sbin目录中 主要用途 完成对系统的基本管理工作,例如ip配置工具 完成相对独立的其他辅助任务,例如网页浏览器 适用环境 一般只在字符操作界面中运行 根据实际需要,有些程序可在图形界面中运行 运行格式 一般包括命令字,命令选项和命令参数 通

用友T3自动备份不成功解决办法_qq37724861的博客-程序员ITS304

环境描述:操作系统:Windows Server 2008R2 SP1 / Windows Server 2012 R2数据库:SQL 2008 R2 SP3软件版本:T3-标准版10.8Plus2 with 最新增量补丁包问题描述:手工备份一切正常,设置自动备份计划任务,无任何备份数据,自动备份目录下,有的是没有任何文件夹,有的是只生成了ZT001\yyyymmdd之类的文件夹,里面没有备份文件

fisher分类器python代码,Fisher准则线性分类器的Python实现_哇塞5G的博客-程序员ITS304

Fisher准则线性分类器的Python实现Fisher准则线性分类器的Python实现选取的训练集与测试集分类决策与分类器代码测试集上的结果本节内容:本节内容是根据上学期所上的模式识别课程的作业整理而来,第二道题目是线性分类器设计,数据集是Iris(鸢尾花的数据集),根据前一题的Kmeans聚类得出的结果,分成训练集与测试集,进行比较。选取的训练集与测试集训练集:(选取上一题中的第一种结果:每一...

Swift3 根据日期获取当天零点的时间戳_Alan_xz的博客-程序员ITS304_swift 获取当天0点时间戳

func getMorningDate(date:Date) -> Date{ let calendar = NSCalendar.init(identifier: .chinese) let components = calendar?.components([.year,.month,.day], from: date) return (calen

推荐文章

热门文章

相关标签