autoIT 自动化上传/下载文件图文详解【python selenium】
情景:
在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图1所示

图1
这种情况超出了selenium的能力范围,需要借助其他工具来实现,这里介绍AutoIt这个工具:
1.下载并安装
进入AutoIt官网,选择AutoIt -> Downloads,如图2:

图2
然后选择Full Installation版本,里面包含了所需的所有工具,如图3:

图3
下载后直接安装即可。
2.探测控件
(1).首先从“开始”菜单里找到"Au3Info_x64.exe" 打开,如图4:

图4
(2).打开需要上传的页面,点击上传,弹出上传窗口,如上面图1所示
(3).在AutoIt上面,用鼠标按住Finder Tool不放(鼠标图标变成一个轮子的样子),移动到上传窗口的文本输入框中,然后松开,如图5

图5
松开后查看探测结果,如图6:

图6
主要关注图6中红色标注的信息:
窗口标题,即Title,图中是“文件上传”
窗口的class,图中是32770
控件的类型以及编号,图中类型是Edit,编号(Instance)是1,表明是窗口中第一个文本输入框
类似地,重复上面的一步,获取“打开”按钮的信息,图如7:

图7
由于是同一个窗口,因此标题和class都和上面的一样,不同的是,这里的"打开"按钮的类型是Button,编号为1(如果是“取消”按钮,编号就是2)。获取到这些必须信息后,就可以开始编写脚本了。
3.编写脚本
从开始菜单中打开SciTE Script Editor,编写如图8的内容:

图8
脚本内容如下,分号开头的是注释:
; 等待5秒钟,让上传窗口出现
WinWait("[CLASS:#32770]","",5)
;把输入焦点定位到上传输入文本框中,类型为Edit,编号为1,也就是上面获取到内容
ControlFocus("文件上传", "","Edit1")
;在文件名那里,输入需要上传的文件绝对路径
ControlSetText("文件上传", "", "Edit1", 'D:\files\file_name')
;等待上传时间,单位是毫秒 1秒 = 1000 毫秒,文件大的话需要设置长点
Sleep(5000)
;点击"打开"按钮,也就是上传,完成整个上传过程
ControlClick("文件上传", "","Button1");
保存为.au3脚本,然后在浏览器中点击上传,使上传窗口出现,如图1所示,然后在SciTe Scripts Editor里面选Tools -> Go (或直接按F5) 即可看到自动上传效果。
4.转换为exe文件
在开始菜单中打开"Compile sctrip to .exe x64"(32位的机器选x86),然后选择要装换的.au3文件和输出的exe文件路径和名称,最后点击下面的"Convert"即可,如图9:

图9
5.使用python调用
使用配Python调用是,首先用python控制selenium,打开上传窗口(图1),然后用
import os
os.system(r'C:\Users\dell\Desktop\no_argument.exe') #这里是保存的exe文件,根据自己的实际情况修改
然后跑python脚本,即可完成文件上传。
6.参数化
上面的过程虽然可以上传文件,但是路径、文件名都是写死在脚本里面的,如果要上传其它路径、其它文件,就要要重新修改脚本,编译成exe文件;如果上传多个文件,每个文件都要写个脚本然后转成exe
那岂不是很蛋疼? 参数化可以解决这个问题。
控件探测过程还和原来一样,脚本参数化只需要修改脚本,如图10:

图10
脚本内容如下,注意黄色背景的内容:
; 等待5秒钟,让上传窗口出现
WinWait("[CLASS:#32770]","",5)
;把输入焦点定位到上传输入文本框中
ControlFocus("文件上传", "","Edit1")
;判断是否有参数
IF $CmdLine[0] > 0 Then ;有参数
$file = $CmdLine[1]
;Else ;无参数,传递默认的文件
;$file = 'D:\work\1.png'
EndIf
;在文件名那里,使用参数
ControlSetText("文件上传", "", "Edit1", $file)
;等待上传时间,单位是毫秒 1秒 = 1000 毫秒
Sleep(5000)
;点击"打开"按钮,也就是上传
ControlClick("文件上传", "","Button1");
同样保存为.au3文件,然后打开上传窗口,按F5运行,成功后转换为exe文件
注意:
参数化之后,调用时需要传递参数,再用os.system(r'C:\Users\dell\Desktop\upload.exe 参数') 这种绝对路径调用,并不能生效,解决办法是把生成的exe文件,放到PATH里面,然后不带路径,直接调用
os.system('upload.exe upload_filename') 即可(过程中会有命令提示符窗口一闪而过,请无视)。
举一反三:如果连窗口id,文本输入框都变化,该怎么办?如果上传的文件比较到,需要等待较长时间怎么办?
提示:控件标识,比如类型、编号,等待时间,都可以参数化。下提供一个大体上通用(不敢说所有情况都适用)的脚本以及调用函数:
7.进一步参数化
把上面参数化的脚本修改为如图11的内容:

图11
其中第3~8行,分别对应的是:
windowTitle是上传窗口的标题,对应图6上面的Title,“文件上传” (这个跟浏览器有关,firefox可能叫做“上传文件”,chrome则可能是“打开”)
windowID是上传窗口的标识ID,对应图6上面的class,"#32770" (这个ID好像基本都是一样的,不过不是很肯定)
windowText是上传窗口的文本输入框,对应图6上面的class和instance,这里把他们合并到一起了
windowButton是上传窗口的“打开”按钮,这里把class和instance也合并到一起
uploadTime就是上传时等待的时间,如果上传的文件比较大或者网速比较慢,这个时间需要设置长一点,单位是秒
把这个脚本转换为exe文件,比如upload_file.exe,然后放入PATH中,
使用下面代码调用:
os.system('%s "%s" "%s" "%s" "%s" %d %s' % ('upload_file.exe','文件上传','32770','Edit1','Button1',2,r'D:\testfile\thefile'))
#注意上面这个写法中,除了uploadTime需要传递为整数之外,其他参数都要传递为字符串
下面提供一个现成的函数,有兴趣的话可以试试:

(别问我为什么只贴图不贴内容。 纸上得来终觉浅,绝知此事要躬行。手动敲一遍比看十遍学得都快!怎么样
!
说明:
第一个参数dirver是浏览器对象,第二个就是我们刚编译成的exe文件,第三个是要上传的文件所在的目录,第四个是要上传的文件,如果有多个,需要放在列表中,比如['file1','file2']
考虑到windows上大部分上传窗口都是一样的,后面几个采用了默认参数
需要注意的是,第17、18行获取上传按钮并点击,需要修改成具体的情况,而且上传一个文件后,之前获取到的upload_button这个元素句柄失效,必须重新用find_element获取一次
下面是调用的示例(ff是生成的浏览器对象,我用是firefox,叫做ff):
upload_files(ff,'upload_file.exe',r'D:\Work\测试图片','php.jpg') #上传单个文件
upload_files(ff,'upload_file.exe',r'D:\Work\测试图片','redhat.jpg')
upload_files(ff,'upload_file.exe',r'D:\Work\测试图片',['redhat.jpg','ubuntu.jpg','php.jpg','linux.png']) #上传多个文件
upload_files(ff,'upload_file.exe',r'D:\tmp','data.zip',uploadTime=30) #zip文件比较大,设置上传时间为30秒
upload_files(ff,'upload_file.exe',r'D:\tmp',['Git使用.docx','debian.jpg','vim.jpg'],uploadTime=1) #jpg文件比较小,设置上传时间1秒
当然,如果你的上传窗口跟这个完全不同,最完整的情况就是:
upload_files(ff,'upload_file.exe',r'D:\tmp',['Git使用.docx','debian.jpg','vim.jpg'],windowTitle="打开",windowID="12345",windowText="Edit100",windowButton="Btn100",uploadTime=1) #jpg文件比较小,设置上传时间1秒
不过你要是提供了所有的参数,大可以这样:
upload_files(ff,'upload_file.exe',r'D:\tmp',['Git使用.docx','debian.jpg','vim.jpg'],"打开","12345","Edit100","Btn100",1)
如果不知道为什么的话,补补Python去吧。
至于下载,过程和上传相反,稍后补充。
autoIT 自动化上传/下载文件图文详解【python selenium】的更多相关文章
- FasfDFS整合Java实现文件上传下载功能实例详解
https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...
- 【WCF】利用WCF实现上传下载文件服务
引言 前段时间,用WCF做了一个小项目,其中涉及到文件的上传下载.出于复习巩固的目的,今天简单梳理了一下,整理出来,下面展示如何一步步实现一个上传下载的WCF服务. 服务端 1.首先新建一个名 ...
- rz和sz上传下载文件工具lrzsz
######################### rz和sz上传下载文件工具lrzsz ####################################################### ...
- linux上很方便的上传下载文件工具rz和sz
linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- C#实现http协议支持上传下载文件的GET、POST请求
C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...
- HttpClient上传下载文件
HttpClient上传下载文件 java HttpClient Maven依赖 <dependency> <groupId>org.apache.httpcomponents ...
随机推荐
- 关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...
- 初试ubuntu14.4问题集锦
接触Linux系统也好长时间了,但每次都是浅尝则止.前几天突发兴趣,想认真地学习一下这个名扬天下的稳定的操作系统.于是试着装了一下炒作的最凶的Ubuntu. 安装的Ubuntu系统版本为14.04. ...
- 执行*.sh脚本时提示Permission denied
使用chmod修改.sh的权限 chmod u+x *.sh 再次执行
- javascript原型模式理解
传统的面向对象语言中,创建一个对象是通过使用类来创建一个对象的,比如通过类飞行器来创建一个对象,飞机. 而js这种没有类概念的动态设计语言中,创建对象是通过函数来创建的,所以通常也把js称为函数式语言 ...
- 初涉JavaScript模式 (1) : 简介
什么是模式? 广义上的模式是指 :在物体或事件上,产生的一种规律变化与自我重复的样式与过程.在模式之中,某些固定的元素不断以可预测的方式周期性重现.最基本而常见的模式,称为密铺,具备重复性以及周期性两 ...
- Why Doesn’t Drag-and-Drop work when my Application is Running Elevated? – A: Mandatory Integrity Control and UIPI(转载)
f you run notepad elevated (Right click | Run as Administrator), and you try and drag-and-drop a fil ...
- aix7安装was7、打补丁、更改访问端口、手动启动was、配置was7、部署项目
1:准备工作 首先了解下我们下面即将用到的aix命令,以及安装包.补丁安装工具.补丁 was7的安装包以及补丁工具都是压缩包形式并且以.tar.gz结尾的 安装包在800MB左右,通常为****_w ...
- impress.js学习总结
impress.js是一个很有趣的用来替代PPT的展示用的js工具,它的灵感来自prezi 如果你要学习使用它,这里有很好的演示模板 使用它的第一步,下载 impress.js,引入到你的代码里,并执 ...
- Start Your Django Project in Nginx with uWsgi
Step 0:Install A,B,C,blabla needed This can be seen in my another article in the blog.click here(una ...
- 省队集训Day3 light
[问题描述] “若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她一定也答不上来.” ...