selenium上传附件的两种方式(普通上传和借助AutoIt识别Windows上传窗口)
首先:下载AutoIt并安装,下载 官方网站:https://www.autoitscript.com/site/
原文:http://www.cnblogs.com/fnng/p/4188162.html
AutoIt简单介绍:AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动 化 操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。AutoIt Windows Info 用于帮助我们识Windows控件信息。 Compile Script to.exe 用于将AutoIt生成 exe 执行文件。Run Script 用于执行AutoIt脚本。SciTE Script Editor 用于编写AutoIt脚本。
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>upload_file</title> <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" /> </head> <body><div class="row-fluid"><div class="span6 well"><h3>upload_file</h3><input type="file" name="file" /></div></div> </body> <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script> </html>
将上面的html代码保存为uplad.html文件,通过浏览器打开,效果如下:
下面以操作upload.html上传弹出的窗口为例讲解AutoIt实现上传过程。
1、首先打开AutoIt Windows Info 工具,鼠标点击Finder Tool,鼠标将变成一个小风扇形状的图标,按住鼠标左键拖动到需要识别的控件上。
图4.14 AutoIt Windows Info识别“文件名”输入框控件
图4.15 AutoIt Windows Info识别“打开”按钮控件
如图4.14、4.15,通过AutoIt Windows Info 获得以下信息。
窗口的title为“选择要加载的文件”,标题的Class为“#32770”。
文件名输入框的class 为“Edit”,Instance为“1” ,所以ClassnameNN为“Edit1”。
打开按钮的class 为“Button”,Instance为“1” ,所以ClassnameNN为“Button1”。
2、根据AutoIt Windows Info 所识别到的控件信息打开SciTE Script Editor编辑器,编写脚本。
;ControlFocus("title","text",controlID) Edit1=Edit instance 1 ControlFocus("选择要加载的文件", "","Edit1") ;"这里选择要加载的文件"
; Wait 10 seconds for the Upload window to appear
WinWait("[CLASS:#32770]","",10)
; Set the File name text on the Edit field
ControlSetText(“选择要加载的文件”, “”, “Edit1”, “D:\upload_file.txt”)
Sleep(2000)
; Click on the Open button
ControlClick(“选择要加载的文件”, “”,“Button1”);
ControlFocus()方法用于识别Window窗口。WinWait()设置10秒钟用于等待窗口的显示,其用法与WebDriver 所提供的implicitly_wait()类似。ControlSetText()用于向“文件名”输入框内输入本地文件的路径。这里的Sleep()方法与Python中time模块提供的Sleep()方法用法一样,不过它是以毫秒为单位,Sleep(2000)表示固定休眠2000毫秒。ControlClick()用于点击上传窗口中的“打开”按钮。注意“选择要加载的文件”不是固定的,要看Windows窗口上显示的是什么。(我当初就是掉到了此坑)
AutoIt的脚本已经写好了,可以通过菜单栏“Tools”-->“Go” (或按键盘F5)来运行一个脚本吧!注意在运行时上传窗口当前处于打开状态。
3、脚本运行正常,将其保存为upfile.au3,这里保存的脚本可以通过Run Script 工具将其打开运行,但我们的目的是希望这个脚本被Python或Java程序调用,那么就需要将其生成exe程序。打开Compile Script to.exe工具,将其生成为exe可执行文件。如图4.16,
图4.16 Compile Script to.exe生成exe程序
点击“Browse”选择upfile.au3文件,点击“Convert”按钮将其生成为upfile.exe程序。
4、下面就是通过自动化测试脚本调用upfile.exe程序实现上传了。
#coding=utf-8 from selenium import webdriver import os
driver = webdriver.Firefox()
#打开上传功能页面
file_path = ‘file:///’ + os.path.abspath(‘upfile.html’)
driver.get(file_path)
#点击打开上传窗口
driver.find_element_by_name(“file”).click()
#调用upfile.exe上传程序
os.system(“D:\upfile.exe”)
driver.quit()
通过Python 的os模块的system()方法可以调用exe程序并执行。
了解了上传的实现过程,那么下载也是一样的。
关于Java调用EXE程序的方法:
driver1.findElement(By.xpath(".//*[@id='fileupload']/span[1]/input")).click(); //定位上传附件按钮
String[] open={"D:\\eclipse\\selenium\\up\\upfile.exe"}; //传给open exe程序的位置
try {
Runtime.getRuntime().exec(open); //调用exe程序
} catch (IOException e) {
e.printStackTrace();
}
另一种方式上传:原文:http://www.cnblogs.com/sylvia-liu/p/4431664.html
问题的难点在于selenium无法识别并操作Windows窗口,若我们可以绕过弹出框直接把文件信息上传给选择按钮,难点就解决了。
以下是常见页面形式:
分析HTML,发现无论是普通前台还是Extjs,他们的html有一个共同的特点,具有以下代码:
<input ..... type="file" ...../>
ok,只要我们使用selenium自带的sendkeys把文件路径(相对绝对无所谓)传给该元素,就可绕过选择窗口直接上传文件.
解决方案诞生了
driver.findElement(XXXXX).sendKeys("filePath");
Have a Try
博客园上传图片:driver.findElement(By.name("file")).sendKeys("C:\Users\123\Pictures\a.png");
QQ邮箱上传附件:driver.findElement(By.name("UploadFile")).sendKeys("C:\Users\123\Pictures\a.png");
定位元素根据情况而定,不一定用name;文件路径可以使相对路径,大家自行修改就好
注意:执行sendKeys的元素一定要符合input和 type="file"条件,否则就是你没找对上传文件的对象,会上传失败的。
像这样的,一定注意不要上传到前面的那个input上,否则会失败的
selenium上传附件的两种方式(普通上传和借助AutoIt识别Windows上传窗口)相关推荐
- django + python上传文件的两种方式
突然心血来潮,研究了下django+python上传文件的两种方式. 第一:直接采用文件读写的方式上传 1. settings.py文件中设置文件的存放路径和文件读取路径 MEDIA_ROOT = o ...
- ajax的data传参的两种方式
ajax的data传参的两种方式 本文为转载. 1.[javascript] view plaincopy /** * 订单取消 * @return {Boolean} 处理是否成功 */ fun ...
- Android之从网络上获取图片的两种方式讲解:thread+handle和AsyncTask方式
从网络上获取图片是一个比较耗时的操作,放在主线程会导致阻塞主线程,响应超时,所以我们不能把它放在主线程里操作,必须放在一个子线程里,我打算采用两种方式去实现.1.采用thread去获取图片,获取到后通 ...
- 【Vue】路由Router传参的两种方式(详解)
本文我们来介绍一下Vue中的 路由传参 问题,首先我们来准备一个基本路由的页面,如下: <!DOCTYPE html> <html lang="en"> & ...
- vue路由传参的两种方式
项目场景: 例如:点击table表格第一列进入详情页,这时候我们进行路由跳转就需要携带一些参数以便我们在详情页使用 跳转方式 一般我们有两种方式让路由携带参数 1.路由传参query(path是路由地 ...
- senchaTouch 给组件传参的两种方式
在senchaTouch 页面跳转中,有时我们需要将其前一个页面的相关参数传入到新的页面或者新的控件中,这是我们该如何传递参数进去呢,一下有两种方式: var arg;//定义将要 传入的参数 Ext ...
- vue 如何将参数放到连接上_通过Vue路由传参的两种方式及Vue组件中接收参数的方式...
1. Vue传参方式 1.1 通过动态路由传参 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那 ...
- vue前端实现上传文件的两种方式
1.使用form表单的形式 第一种方式就是使用FormData的方式进行上传 html代码: <el-form :model="upform" :rules="up ...
- LayUI upload上传组件上传文件的两种方式(手动上传、自动上传)
1 手动上传 上传文件分为两步,第一步选择文件,第二步上传文件. HTML代码: <input type='button' id='selectFile' value='选择文件'> &l ...
- WebUploader 上传文件的两种方式(手动上传,自动上传)
1 手动上传 上传文件分为两步,第一步选择文件,第二步上传文件. HTML代码: <input type='button' id='selectFile' value='选择文件'> &l ...
最新文章
- 面试题05-UI控件
- ELK 性能优化实践
- pybind opencv mat
- 2021广州黄冈中学高考成绩查询,黄冈中学广州学校2019高考成绩喜报、本科重本上线人数情况...
- Eigen datamap 问题
- vlookup使用步骤_使用vlookup出错,看看原因多为这几个!快来看看!
- vivo NEX 3探索5G手机极致新形态:99.6%瀑布屏让左右无界 未来无限
- fck2.6.3配置
- vb.net它SqlHelper制备及应用
- 老妈~老妈~我爱你~~~~~~~阿弥陀佛保佑你~~~~~~~
- S3C2440 LCD驱动(FrameBuffer)实例开发一(转)
- 长连接和短连接(转)
- php查重,知网查重时检测php之类的源码吗?【干货分享】
- beetl模板使用场景_Beetl使用指南
- 音王点歌系统怎么连接服务器,KTV音响设备怎么连接?点歌机怎么连接?学习下...
- linux命令测网速
- 前端开发中PC端和移动端网站的区别
- stm32-HY-SRF05 超声波模块-原理及代码解读
- 解决序列长期依赖的法宝——注意力机制
- 计算机毕业设计java基于ssm的企业工资管理系统
热门文章
- Roms版本、工具包及资料文档汇总
- Unity3D Webplayer Socket网络通信经验分享
- 内存测试拷机软件,烤机软件 OCCT 更新 9.0.0 版本,新增 CPU/内存跑分测试
- 统计推断——假设检验——检验的功效(势)
- 【Scratch考级99图】图36-等级考试scratch绘制复杂图形中间带凸点正方形花 少儿编程 scratch画图案例教程
- 解决jsp页面引入百度编辑器,出现xss漏洞
- ADO与ADO.NET的区别
- camera 自动对焦手动对焦
- TensorFlow镜像安装(Anaconda)
- HDU1172 猜数字