我们在使用selenium做web自动化测试的时候也许会碰到需要上传文件或者图片的需求。那么下面给大家介绍一下,selenium是怎么实现文件上传和哪些情况不能直接上传。

一、上传控件标签为input

请看以百度首页的文件上传为例:

点击小相机后弹出文件上传窗口

我们通过源码可以看出,这个"本地上传图片"的控件标签是input

这时候我们可以直接使用seleniumAPI进行文件上传,代码实现如下:

#coding=utf-8
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("https://www.baidu.com/")
#点击百度首页小相机按钮
browser.find_element_by_class_name("soutu-btn").click()
#通过send_keys发送文件的绝对路径,文件在我本机的C盘目录下
browser.find_element_by_class_name("upload-pic").send_keys(r"C:\test.png")
#我们这里已经实现了文件上传,至于百度返回404不用管它

二、上传控件标签为非input

当控件标签非input时,这种情况我们不能直接使用上面的方法了,我们可以借助第三方工具:Autolt

AutoIt

AutoIt v3是一种免费BASIC-like脚本语言为Windows的GUI自动化设计和通用脚本。它使用的组合模拟键盘,鼠标移动和窗口/控制操纵,以自动化任务的方式不可能或可靠的与其他语言(如VBScript和SendKeys)。

现在已经出到v3.3版本,更多介绍可以到下面的官网查看。

下载地址:https://www.autoitscript.com/site/autoit/downloads/

图2.1

通过图2.1的导引安装完后可以看到如下组件,图2.2

图2.2

这几个组件的功能介绍:

AutoIt Windows Info   用于帮助我们识Windows控件信息。

Compile Script to.exe 用于将AutoIt生成 exe 执行文件。

Run Script            用于执行AutoIt脚本。

SciTE Script Editor   用于编写AutoIt脚本。

1.通过AutoIt Windows Info 获取我们要操作的对象,以火狐浏览器为例,因为每个浏览器弹出来的窗口名字可能不一样。如图2.3 和 图2.4

图2.3

图2.4

通过上面两个图AutoIt Windows Info中Control页面 获得以下信息。

窗口的title为“文件上传”,标题的Class为“#32770”。

文件名输入框的class 为“Edit”,Instance为“1” ,ClassnameNN为“Edit1”。

打开按钮的class 为“Button”,Instance为“1” ,ClassnameNN为“Button1”。

2.根据AutoIt Windows Info 所识别到的控件信息,接下来我们打开SciTE Script Editor编辑器,编写脚本。

;ControlFocus()方法用于识别Window窗口
ControlFocus("文件上传", "","Edit1") ; WinWait()设置1秒钟用于等待窗口的显示
WinWait("[CLASS:#32770]","",1) ; ControlSetText()用于向“文件名”输入框内输入本地文件的路径,如果是在桌面第三个参数直接写文件名
ControlSetText("文件上传", "", "Edit1", "C:\selenium.png")
Sleep(1000) ; ControlClick()用于点击上传窗口中的“打开”按钮 ControlClick("文件上传", "","Button1");  

3.写好脚本之后我们可以在浏览器已经大家文件上传窗口的情况按F5运行,看看脚本效果,如下图

图2.5

4.脚本运行正常,我们将它保存为upfile.au3文件,这里保存的脚本可以通过Run Script 工具将其打开运行,但我们的目的是希望这个脚本被Python程序调用,那么就需要将其生成exe程序。打开Compile Script to.exe工具,将其生成为exe可执行文件

5.生成了upfile.exe后,我们把它放在C盘根目录,我们再用python脚本实现借用它来上传文件:

#coding=utf-8
from selenium import webdriver
import os
browser = webdriver.Firefox()
browser.get("https://www.baidu.com/")
#点击百度首页小相机按钮
browser.find_element_by_class_name("soutu-btn").click()
#打开文件上传窗口
browser.find_element_by_class_name("upload-pic").click()
#调用upfile.exe实现文件上传
os.system(r"C:\upfile.exe")

用过os.system()方法可以进行调用,模拟在cmd里面输入:C:\upfile.exe

selenium2之文件上传的更多相关文章

  1. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  2. Selenium2+python自动化-文件上传

    前言 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单. 一般分两个场景:一种是input标签,这种可以用selenium提供的send_keys()方法轻松解决:另外一种非 ...

  3. selenium2用AutoIt上传文件

    1.标签是input,如下图所示: WebElement e1= driver.findElement(By.id("load"));//输入要上传文件的地址e1.sendKeys ...

  4. Selenium常用API用法示例集----下拉框、文本域及富文本框、弹窗、JS、frame、文件上传和下载

    元素识别方法.一组元素定位.鼠标操作.多窗口处理.下拉框.文本域及富文本框.弹窗.JS.frame.文件上传和下载 元素识别方法: driver.find_element_by_id() driver ...

  5. Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载

    元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...

  6. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  7. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  8. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  9. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

随机推荐

  1. shell网络客户端

    需要把线上的access日志发送到另一个程序接收 开始想着用python实现,虽然python也有实现类似tail -F的方式,但太麻烦,而且效率也有折扣 偶然发现了shell可以实现网络client ...

  2. Hibernate 案例

    搭建一个Hibernate环境,开发步骤: 1. 下载源码 版本:hibernate-distribution-3.6.0.Final 2. 引入jar文件          hibernate3.j ...

  3. javascript 生成 uuid

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  4. WPF Dashboard仪表盘控件的实现

    1.确定控件应该继承的基类 从表面上看,目前WPF自带常用控件中,没有一个是接近这个表盘控件的,但将该控件拆分就能够发现,该控件的每个子部分都是在WPF中存在的,因此我们需要将各个子控件组合才能形成这 ...

  5. gawk的用法

        GNU gawk工具的功能是将指定文件中符合指定模式(pattern)的行按指定的动作(action)进行格式化处理 语法:gawk [options] [program] [file-lis ...

  6. 2~62位任意进制转换(c++)

    进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最 ...

  7. 高效率遍历Map以及在循环过程中移除 remove指定key

    //高效率遍历Map以及在循环过程中移除 remove指定key //使用iter循环的时候 可以在循环中移除key,for在循环的过程中移除会报错哦 //本方法效率高 Iterator iter = ...

  8. Redis 内存管理与事件处理

    1 Redis内存管理 Redis内存管理相关文件为zmalloc.c/zmalloc.h,其只是对C中内存管理函数做了简单的封装,屏蔽了底层平台的差异,并增加了内存使用情况统计的功能. void * ...

  9. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  10. H3CNE实验:通过Console端口本地访问H3C设备

    连接好Console线后,将交换机开机,在SecureCRT上会显示如下信息: Starting...... RAMLine.....OK System is booting............. ...