前言

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

AutoIt介绍

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

实现原理:

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

备注:定位元素、编写脚本和编译,需要借助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-8from selenium import webdriver# 鼠标操作需要导入ActionChains类,因为鼠标操作的方法封装在该类中from selenium.webdriver.common.action_chains import ActionChainsimport timeimport osimport win32conimport 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-8from selenium import webdriver# 鼠标操作需要导入ActionChains类,因为鼠标操作的方法封装在该类中from selenium.webdriver.common.action_chains import ActionChainsimport timeimport osimport win32conimport 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)

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()会很快关闭浏览器。

好了,说了这么多,自己需要努力的还有很多,明天中秋,祝大家中秋节快乐啦!

在python中使用autoit_Python + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解...相关推荐

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

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

  2. 站长在线Python精讲:Python中集合的交集、并集、差集和对称差集运算方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中集合的交集.并集.差集和对称差集运算方法详解>.主要讲的是集合运算的相关的概念,及运算方法,包括:集合的交集. ...

  3. java IO流进阶 模拟上传头像系统详解

    目录 一.前言: 二.思路: PS:直接看代码中的注释也可以. ①分析: ②总结: 三.代码: ①准备工作: ②代码演示: ③运行效果: 四.撒❀: 一.前言: 这篇文章是对之前java IO流基础 ...

  4. 在python中使用autoit_Python调用autoit

    1. 安装pywin32模块,地址:http://sourceforge.net/projects/pywin32/  选择对应的版本下载 2.从autoit3\AutoItX下找到AutoItX3_ ...

  5. selenium+python自动化测试系列(二):AutoIt工具实现本地文件上传

    AutoIt使用简单说明 AutoIt的安装这里就不在啰嗦,可以参考AutoIt安装或者自行搜索解决. 第一步:定位上传文件路径的文本框 这里举例说明,如何定位?如图 这里我们看到上传文件的类型是bu ...

  6. python中使用函数的优点_Python基础之函数基本用法与进阶详解

    本文实例讲述了Python基础之函数基本用法与进阶.分享给大家供大家参考,具体如下: 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数 ...

  7. python中common在哪个模块导入_python的常用模块之collections模块详解

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  8. python中所有元素必须为相同类型的数据_Python之常用数据类型详解

    tuple 元组 1 #定义 2 temp = (2, ) #规范定义,单个元素的元组 3 tem = 2, #可行,但不规范定义 4 tep = () #空元组 5 6 tp = (1, 'ss', ...

  9. python中quad_python用quad、dblquad实现一维二维积分的实例详解

    背景: python函数库scipy的quad.dblquad实现一维二维积分的范例.需要注意dblquad的积分顺序问题. 代码: import numpy as np from scipy imp ...

  10. SpringBoot中使用yml配置文件以及配置类实现文件上传下载路径的修改

    场景 SpringBoot+thymeleaf实现文件下载或者实现文件上传需要配置文件上传路径的地方, 不要写为固定路径,在配置文件中指定文件路径,代码中直接引用. 避免以后文件路径修改后需要修改业务 ...

最新文章

  1. 变态跳台阶,很难很难,终于想出来了,附推导过程,为自己鼓掌
  2. c++ pipe 同步 互斥_数一数Linux中有多少种线程同步策略-『Linux 源码解析(二)』...
  3. docker笔记1_安装及常用命令
  4. u盘复制不进去东西_禁止U盘拷贝,再也不让别人复制你电脑里的东西了!
  5. spark 源码分析之二十 -- Stage的提交
  6. CMD-NET命令详解、NET命令大全(转)
  7. 关于深度探索C++对象模型笔记
  8. 广东IPTV机顶盒安装第三方应用
  9. 如何修改VsCode的背景图片
  10. 两种常见的台式计算机,win7电脑定时关机的两种最常用方法【图文】
  11. 什么是友情链接?友情链接的好处及写法(图文)
  12. Method annotated with @Bean is called directly. Use dependency injection instead.
  13. Android Canvas绘制丘比特之箭
  14. C语言常见问题(10):Sections of code should not be commented out
  15. ubuntu系统文件清理
  16. 基于JAVA+SpringMVC+Mybatis+MYSQL的快递代收系统
  17. 【数据结构机试复习2】 赛马 猴子选大王
  18. mysql安装问题:由于找不到MSVCR120.dIl,无法继续执行代码。
  19. 微信小程序消息通知简单Demo
  20. 基于SpringBOOT的订餐系统

热门文章

  1. Juniper防火墙无法登陆的问题解决
  2. juniper防火墙基于路由的IPsec ***配置
  3. 使用fpdf2将txt文本转可编辑pdf报错解决办法
  4. dns污染怎么快速清除解决
  5. 配置 DNS over HTTPS阻止DNS污染
  6. J2SDK1.5-J2SDK5.0,哈哈
  7. 仙剑永恒的经典──仙剑诗集
  8. (六)CRAFT----2019CVPR论文解读
  9. 关于学期结束的一些题目的记录
  10. 大数据创造智慧城市的未来之光!