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

article/2025/9/21 10:44:12

前言

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

AutoIt介绍

AutoIt简单介绍下,AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys)。

实现原理:

使用AutoIt下的工具去定位页面外的元素属性值,其次再利用AutoIt下的工具编写合适的脚本,然后将脚本编译成可执行文件,最后在自动化实现时,直接调用此脚本实现文件的上传、下载等操作。

备注:定位元素、编写脚本和编译,需要借助AutoIt提供的工具,但是脚本编译成可执行文件后,可以直接使用。

AutoIt的下载与安装就不再赘述,下载地址如下:AutoIt Downloads - AutoIt

安装成功后会出现如下菜单:

AutoIt工具使用

1.AutoIt Window Info用来识别Windows控件,根据识别的控件信息编写脚本;x86为32位

2.SciTE Script Editor用来写脚本,并保存为au3格式,按F5可以调试代码,但需要是操作弹框(上传/下载/另存为弹框)开启的情况下

3.Complie Script to .exe, 将刚编写的脚本,编译成可执行文件;

4.编译后在Python代码中调用

想必介绍到这,或多或少有所了解了,对AutoIt工具下的功能点也清楚了,Run Script是运行脚本的,我们是要到Python代码中调用,所以此处就略过了。

实例讲解

接下来就用一个实例来讲解下AutoIt工具的具体使用,实例功能是:把百度首页中的百度图片另存为到本地或任意磁盘

在做这个事情的时候,我们要知道,步骤是先要选中图片,并右击,选择另存为,然后输入文件名以及保存的位置,最后点击保存。人工操作鼠标很简单,但现在是要使用代码来实现该功能,可细化分为四步,如下:

1.使用Selenium功能弹出右键菜单

2.利用win32api选择相关菜单

3.调用AutoIt实现另存为操作

4.到Python代码中调用

实现第一步,在浏览器中定位到图片元素,代码如下:

context = driver.find_element_by_css_selector(".index-logo-src")
ActionChains(driver).context_click(context).perform()

实现第二步,模拟键盘操作,鼠标移到另存为处,使用win32api操作,代码如下:

win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(13, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
win32api.keybd_event(40, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)

win32api的键盘码如下:

上面代码的13与40按键对应的是回车与下键,在键盘码的图片中很详细

实现上述两步代码后,会弹出如下所示框,让输入文件名以及保存路径,该对话框已经是页面外的元素了,使用普通的定位时定不到了,所以就需要使用AutoIt工具来实现。

实现第三步,操作如下:

①打开autoit工具包下的AutoIt Window Info(x64)工具,版本按自己电脑系统来,界面如下所示:

1.1鼠标点中Finder Tool并拖动到输入文件名处,操作如下所示,得到下图结果

1.2重复上述定位步骤,定位保存按钮,结果如下图所示

②元素定位到了,接下来就是使用AutoIt工具包下的SciTE Script Editor写脚本,并保存为au3格式,注意:此工具中;表注释

根据定位到的参数值,写如下脚本:

ControlFocus("另存为","","Edit1")
WinWait("[CLASS:#32770]","",10)
ControlSetText("另存为","", "Edit1", "G:\201801-\python_code\Demo\autoit\baidu.png")
Sleep(2000)
ControlClick("另存为","","Button2")

代码解释:

第一行:ControlFocus ( "title", "窗口文本", controlID) 设置输入焦点到指定窗口的某个控件上;

第二行:WinWait ( "title" , "窗口文本" , 超时时间 ) 暂停脚本的执行直至指定窗口存在(出现) 为止;

第三行:ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本;

第四行:Sleep ( 延迟 ) 使脚本暂停指定时间段;

第五行:ControlClick ( "title", "窗口文本", 控件ID , 按钮 , 点击次数 ) 向指定控件发送鼠标点击命令;

其中, title即AutoIt Window Info识别出的Title字段, controlID即AutoItWindow Info识别出的Class和Instance的拼接, 如上图拼接后的结果应为:Button2,也就是ClassnameNN的值。

③使用AutoIT工具包下的Complie Script to .exe工具把刚编写的脚本编译成可执行文件,操作如下:

执行上步骤后,会出现test.exe可执行文件,如下:

第四步,到Python代码中调用该可执行文件,操作代码如下:

import os
os.system(os.getcwd() + "\\autoit\\test.exe")

运行Python代码,在定义的路径下会看到已保存的百度图片,如下所示:

整体代码实现如下,仅供参考:

# coding=utf-8
from selenium import webdriver
# 鼠标操作需要导入ActionChains类,因为鼠标操作的方法封装在该类中
from selenium.webdriver.common.action_chains import ActionChains
import time
import os
import win32con
import win32api
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
# 鼠标右击操作,context_click()
context = driver.find_element_by_css_selector(".index-logo-src")
ActionChains(driver).context_click(context).perform()
time.sleep(3)
# 按下下键
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(40, 0, 0, 0)
time.sleep(1)
# 按下回车
win32api.keybd_event(13, 0, 0, 0)
time.sleep(1)
# 释放回车键
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
# 释放下键
win32api.keybd_event(40, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
os.system(os.getcwd() + "\\autoit\\test.exe")
# 调用exe文件后,延时3秒
time.sleep(3)
driver.quit()

 将百度首页中的图片另存为还有一个实现方法,不用win32api操作,直接在AutoIt编写脚本中发送个V,因为选择另存为和按V是一样的作用,AutoIt编写脚本代码如下:

send("v")
Sleep(1000)
ControlFocus("另存为","","Edit1")
WinWait("[CLASS:#32770]","",10)
ControlSetText("另存为","", "Edit1", "G:\201801-\python_code\Demo\autoit\baidu1.png")
Sleep(2000)
ControlClick("另存为","","Button2")

重复编译操作,然后在Pyhton代码中实现如下,仅供参考:

# coding=utf-8
from selenium import webdriver
# 鼠标操作需要导入ActionChains类,因为鼠标操作的方法封装在该类中
from selenium.webdriver.common.action_chains import ActionChains
import time
import os
import win32con
import win32apidriver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
# 鼠标右击操作,context_click()
context = driver.find_element_by_css_selector(".index-logo-src")
ActionChains(driver).context_click(context).perform()
time.sleep(3)
os.system(os.getcwd() + "\\autoit\\test1.exe")
time.sleep(3)
driver.quit()

运行代码后,图片保存成功,如下:

如上就是完整的将网页图片另存为的操作,上传/下载的操作一样,把另存为学会,其他两类也就迎刃而解了。

总结

在琢磨模拟键盘操作时,有两个错误点,而导致编写的代码与脚本总是运行不成功,后面自己仔细查找原因,以及百度,终于是给解决了,所以故记录下,也好看看自己的进步过程。

问题一

模拟按键操作,之前没选对操作方式,这是自己的Python基础薄弱,需要补充,后面找到win32api的方式,并找到键盘图,按键操作就完美解决。

问题二

编写autoit的脚本,定位后,controlID没有拼接,而是直接写的Edit,Button,而导致代码调用脚本,但没执行操作,controlID即AutoItWindow Info识别出的Class和Instance的拼接, 如上图拼接后的结果应为:Button2,也就是ClassnameNN的值。

问题三

在调用exe文件成功并执行操作后,还没点击保存按钮,浏览器就立马关闭了,后面一想,在调用exe文件后,加个延时就解决了,如果exe文件执行的内容多,延时需要长些,不然driver.quit()会很快关闭浏览器。


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

相关文章

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软件查询结果的对比 统计单位计算机基础信息或计算机资产信息,往往需要统计“操作系统,安装时间,硬盘序列号&…

命令行查看硬盘序列号

1.按WinR打开运行,输入cmd,回车: 2.在命令提示符中输入diskpart,点击回车来启动diskpart程序,通过这个程序来查看硬盘序列号: 3.接着输入并执行list disk, 也就是把电脑上的所有硬盘都罗列出来,图中只有一个硬盘&#…

查询硬盘序列号的方法

首先在开始菜单栏中输入cmd,如下图所示。接着点击程序CMD,如下图所示。然后输入diskpart并按下回车键,如下图所示接下来输入list disk,如下图所示。这样就可以看到我们的磁盘的相关信息了。5. 然后输入select disk 0并按下回车键,如下图所示 …

怎么查看计算机硬盘sn,硬盘序列号,教您怎么查看硬盘序列号

很多朋友不知道我们电脑上使用的硬盘是有序列号的,通过序列号我们可以查硬盘的真伪,那么怎么查看硬盘序列号呢?下面小编就来教您怎么查看硬盘序列号。 下面是查看硬盘序列号的步骤: 1.首先敲击键盘的“WINR”键,然后在…

查询硬盘序列号

1.首先,敲击键盘“WINR”,然后在打开的运行窗口里输入cmd,再点确定。 2.接着在打开的命令窗口中,输入diskpart,再敲下回车键。 3.下一步,输入list disk,再敲击回车键,就可以看到电脑…

不同操作系统查询硬盘序列号的方法

一、windows系统查询磁盘序列号 【步骤一】打开DOS命令行, 输入diskpart命令进入磁盘管理器图形用户界面,如下图: diskpart【步骤二】在磁盘管理器图形用户界面,输入list dask命令查看当前所有磁盘信息,如下图&#…

思科模拟器

#端口颜色:真实环境下,一般只有绿色和橙色,红色没有 #PC机里的terminal是超级终端,在这里配置console连着的设备 #PC机里的Command Prompt是控制台,相当于真实电脑里的cmd命令行 1、 设备连线(相同用交…