Selenium系列教程 - 文件上传

2023-11-10


在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”

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

在这里插入图片描述


在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium系列教程 - 文件上传 的相关文章

随机推荐

  • Python连接Hive

    1 Hiveserver1 HiveServer2 1 1 HiveServer1 HiveServer是一个可选的服务 能够允许远程客户端使用各种编程语言向hive提交请求并检索结果 Hiveserver是建立在Apache Thrift
  • 什么是DFX设计?

    DFX是面向产品生命周期各环节的设计 其中X代表产品生命周期的某一个环节或特性 它是一种新的设计技术 在设计阶段尽可能早地考虑产品的性能 质量 可制造性 可装配性 可测试性 产品服务和价格等因素 对产品进行优化设计或再设计 常见的DFX主要
  • pandas(三)数据查询

    数值 列表 区间 条件 函数 Pandas查询数据的几种方法 df loc方法 根据行 列的标签值查询 df iloc方法 根据行 列的数字位置查询 df where方法 df query方法 loc既能查询 又能覆盖写入 强烈推荐 Pan
  • 发电机机房设计规范_柴油发电机房建筑防火与消防设施要求!

    来源 消防资源网 如有侵权 请联系删除 一 布置在民用建筑内的柴油发电机房应符合下列规定 5 4 13 1 宜布置在首层或地下一 二层 2 不应布置在人员密集场所的上一层 下一层或贴邻 3 应采用耐火极限不低于2 00h的防火隔墙和1 50
  • 【Python】python中列表元素的删除方法

    python中列表元素的删除方法 1 删除指定位置的值 pop 函数 可以结合 a b c d a e
  • LeetCode 344 反转字符串 --s[:]=s[::-1]和s[:]=s[::-1]的不同

    编写一个函数 其作用是将输入的字符串反转过来 输入字符串以字符数组 char 的形式给出 不要给另外的数组分配额外的空间 你必须原地修改输入数组 使用 O 1 的额外空间解决这一问题 你可以假设数组中的所有字符都是 ASCII 码表中的可打
  • 滤波方法总结

    经典滤波方法主要有低通 高通 带通 带阻滤波 相关滤波 限幅滤波 中值滤波 基于拉依达准则的奇异数据滤波 基于中值数绝对偏差的决策滤波 算术平均滤波 滑动平均滤波 加权滑动平均滤波 一价滞后滤波 加权递推平均滤波 消抖滤波 限幅消抖滤波 维
  • soamanager 弹不出浏览器

    https www cnblogs com WACBZWY p 11970420 html 输入SOAMANGER左下角提示正在启动 一闪而过 并没有弹出浏览器 se24 将 CL GUI HTML VIEWER类中 方法 DETACH U
  • 00 SD卡知识简介

    具体可见如下文章 源地址 SD卡介绍
  • ZooKeeper之(六)应用实例

    6 1 Java API 客户端要连接 Zookeeper服务器可以通过创建 org apache zookeeper ZooKeeper 的一个实例对象 然后调用这个类提供的接口来和服务器交互 ZooKeeper 主要是用来维护和监控一个
  • pybind11传输文件

    python open之后的bytes 加长度 c 接收string 需要时pBuffer c str 和长度就ok了 c 别用char 在linux下有时会报错 代码 c using namespace std int add perso
  • 毕业设计(基于TensorFlow的深度学习与研究)之总结概述篇

    阅读本文大概需要 10 分钟 前言 今天是2020 07 30 距离我答辩已经过去1个月时间 距离我完成论文初稿并在paperpass上查重已经过去4个月时间 经过这么长时间的思考 沉淀 我将在本文中主要涉及3个方面的内容 希望能够给即将进
  • Pandas数据的导入与导出

    Excel格式数据导入 文件格式 读取方法 Excel文件 read excel CSV文件 read csv txt文件 read table Json文件 read json MySQL文件 read sql table 对于上述这些方
  • 圆形电子围栏检测嵌入式C实现

    js代码 fileoverview GeoUtils类提供若干几何算法 用来帮助用户判断点与矩形 圆形 多边形线 多边形面的关系 并提供计算折线长度和多边形的面积的公式 主入口类是 a href symbols BMapLib GeoUti
  • linux修改时区 修正时间

    1 tzselect 2 选择Asia 3 选择china 4 选择beijing 5 最后执行TZ Asia Shanghai export TZ 6 重启
  • html弹窗口并获取返回值,Js 弹出框口并返回值的两种常用方法

    1 window showModalDialog url args dialogattrs 参数说明 url 弹出页面地址 agrs 主窗口传给对话框的参数 可以是任意类型 数组也可以 dialogattrs 弹出窗口的样式参数 模式对话框
  • 【面试精讲】Java:Exception 和 Error 有什么区别?

    前言 众所周知 没有 BUG 的程序只会出现在程序员的梦里 异常情况如影随形地纠缠着我们 只有正确处理好意外情况 才能保证程序的可靠性 Java 语言在设计之初就提供了相对完善的异常处理机制 这也是 Java 得以大行其道的原因之一 因为这
  • NVIDIA GPU 算力表

    来自nvidia官方 https developer nvidia com cuda gpus
  • 线程同步

    线程同步 作者 buaawhl 我们可以在计算机上运行各种计算机软件程序 每一个运行的程序可能包括多个独立运行的线程 Thread 线程 Thread 是一份独立运行的程序 有自己专用的运行栈 线程有可能和其他线程共享一些资源 比如 内存
  • Selenium系列教程 - 文件上传

    主要内容 一 通过send keys方法 该方法只适用于input标签 二 通过AutoIt来处理上传文件 适用所有 三 其他方法 四 多文件上传 在Web UI自动化测试中可能会遇到文件上传的场景 针对该场景我们要区分上传按钮的种类 大体