autoIT 自动化上传/下载文件图文详解【python selenium】

article/2025/9/21 10:22:34

情景:

      在用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去吧。

 

至于下载,过程和上传相反,稍后补充。

转载于:https://www.cnblogs.com/2niu/p/6134865.html


http://chatgpt.dhexx.cn/article/b85bWuaP.shtml

相关文章

AutoIt介绍

AutoIt的下载网址: https://www.autoitscript.com/site/autoit/downloads/ AutoIt在线文档:http://www.autoit3.cn/Doc/ AutoIt的优势: 简单易懂的类BASIC 表达式模拟键盘,鼠标动作事件操作窗口与进程直接与窗口的”标准控件”交互(设置/获…

AutoIt的应用

少数情况下需要操作系统级的弹窗,可以使用AutoIt。 AutoIt现在最新版是V3版本,这是一个类似BASIC脚本语言的免费软件,用于Windows GUI中进行自动化操作。利用模拟键盘按键,鼠标移动,窗口和控件的组合来实现自动化任务…

java 调用autoit_java和autoit连接

autoit可以实现本机文件的上传,修改,新建,也可以实现网页上文件下载到本地 连接步骤: (1)下载autoitx4java 包,地址在code.google.com/p/autoitx4java。解压后直接将jar包添加到工程里面。然后需要使用jacob包&#xf…

AutoIt在线使用手册地址

AutoIt 在线文档https://autoitx.com/Doc/

AutoIt3.0

autoIt主要用于窗口自动化,结合python,可解决web自动化,页面调出窗口的问题 autoIt脚本代码例子: 1.打开Windows 任务管理器 2.依次点击【应用程序、进程、服务、性能、联网、用户】按钮 3.再次点击应用程序按钮 4.点选第二个…

Python + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解

前言 在web页面中,可以使用selenium的定位方式来识别元素,从而来实现页面中的自动化,但对于页面中弹出的文件选择框,selenium就实现不了了,所以就需引用AutoIt工具来实现。 AutoIt介绍 AutoIt简单介绍下&#xff0c…

autoit 下载图片验证码

autoit 下载图片验证码 自动化测试中,我做了验证码识别的功能,那么接下来就是怎么获取验证码图片了,还好autoit 里面提供了一些方法。下面就介绍一下怎样利用autoit 下载验证码图片: 先说思路: 右键点击验证码 使用…

获取硬盘序列号的真正方法!!

最近要获取磁盘的序列号,在网上找了很久发现大部分都是通过diskpart来查询 这种查询方法只是查询的磁盘的id 真正查询磁盘序列号应该使用下面方法:wmic diskdrive get serialnumber 打开cmd后输入 serialNumber下面的就是硬盘序列号

如何查询硬盘序列号?百度基本都是错的,其实一条命令搞定!

百度上答案不知是不懂还是怎么着,都是通过diskpart -->detail disk查询,查出来的是磁盘ID,不是序列号! 其实查询磁盘序列号方式很简单: 1.Win R打开 “运行” ,在 运行 中输入“cmd”,然后…

手动查询硬盘序列号

win7旗舰版1. 开始-运行-输入:wbemtest 回车 2. 单击"连接", 输入:root\cimv2 回车; 或者ROOT\SecurityCenter 3. 单击"查询", 输入:select * from Win32_PhysicalMedia 应用,出来三个,我这第一…

怎么查询电脑的磁盘序列号和各种硬件信息(Windows系统)

之前实习时遇到过这种情况,听说国家保密局要统计高校领导办公电脑的磁盘信息,防止信息泄露,就让我和同事就统计磁盘的序列号,很简单,就是电脑太多,统计速度太慢啦,都是Windows系统,没…

查看硬盘序列号的方法 和查看设备序列号的方法

查看硬盘序列号 wmic diskdrive get serialnumber 显示的就是序列号了 查看设备序列号 wmic bios get serialnumber

怎么看计算机的硬盘牌子,硬盘序列号,详细教您怎么查看硬盘序列号

有的时候在一些非常时期,我们会需要知道硬盘的序列号,那么这个时候我们要怎么查看电脑的硬盘序列号呢?不慌,稳住。小编现在就带你们打破地方水晶!!接下来我就来告诉你们怎么查看电脑硬盘序列号。 小伙伴们&…

Windows查询计算机设备序列号、MAC地址和硬盘序列号

1 进入命令提示符 搜索cmd,以管理员身份打开命令提示符 2 查询设备序列号 输入命令 wmic bios get serialnumber返回的字符串即为设备序列号(SerialNumber) 3 查询MAC地址 输入命令 ipconfig /all 返回物理地址即为所需MAC地址 需要…

如何查看计算机的硬盘序列号,电脑硬盘序列号怎么查?一招查看硬盘序列号的简单方法...

好多网友想知道自己电脑硬盘序列号是多少?这该怎么查看?硬盘的序列号是一个唯一的识别号,我们安装一些大型的开发软件时都会用到。其实查看硬盘序列号的方法很简单,今天小编教大家一招查看电脑硬盘序列号的简单方法。 具体方法如下&#xff1…

硬盘序列号、设备序列等查询

1.硬盘序列号查询。 1)Windowsr,输入cmd 回车 2)输入diskpart,回车 3)输入list disk,回车 4)输入select disk *(可选),回车 5)输入detail disk,回车结束。 2.ip(mac)地…

windows10如何查看硬盘序列号

使用命令提示符 点击任务栏搜索框或搜索图标,搜索命令提示符并以管理员身份将其打开。 运行命令:wmic diskdrive get model,name,serialnumber ,按Enter键。您将看到列出的连接到计算机的所有硬盘驱动器的型号,名称和序列号。

磁盘序列号,磁盘ID,卷序列号的区别

1. 磁盘序列号 这个东西可以硬盘标签上看到,可查找SN字样,为厂家确定,类似mac地址,属于唯一属性,与OS无关,即使格式化硬盘也不会改变。 windows查看命令:wmic diskdrive get serialnumber 2…

windows查看硬盘序列号

目录 1、打开cmd命令提示,输入diskpart2、输入list disk,查看硬盘基本信息3、输入select disk 0、查看磁盘0信息4、输入detail disk,查看磁盘序列号 按下windowsr,输入cmd打开命令提示 1、打开cmd命令提示,输入diskpa…

cmd命令 查询硬盘序列号,设备序列号,MAC地址,操作系统及安装时间,以及与AIDA64软件的对比

cmd命令 查询硬盘序列号,设备序列号,MAC地址,操作系统及安装时间,以及与AIDA64软件查询结果的对比 统计单位计算机基础信息或计算机资产信息,往往需要统计“操作系统,安装时间,硬盘序列号&…