前言

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

AutoIt介绍

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

实现原理:

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

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

AutoIt的下载与安装就不再赘述,下载地址如下:https://www.autoitscript.com/site/autoit/downloads/

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

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 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 + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解的更多相关文章

  1. Python+Selenium自动化-模拟键盘操作

    Python+Selenium自动化-模拟键盘操作   0.导入键盘类Keys() selenium中的Keys()类提供了大部分的键盘操作方法:通过send_keys()方法来模拟键盘上的按键. # ...

  2. 【iOS 使用github上传代码】详解

    [iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...

  3. Uploadify 上传文件插件详解

    Uploadify 上传文件插件详解 Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中 ...

  4. express文件上传中间件Multer详解

    express文件上传中间件Multer详解 转载自:https://www.cnblogs.com/chengdabelief/p/6580874.html   Express默认并不处理HTTP请 ...

  5. 【python+selenium自动化】基于Autolt实现上传

    在UI自动化过程中,总会遇到文件上传的操作,一般的,标签为input,可以直接使用sendkeys 如果他仅仅是一个button,那则无法直接sendkeys,则需要用到autoIT这个工具 基于Au ...

  6. windows下命令行终端使用rz上传文件参数详解

    rz命令: (X) = option applies to XMODEM only (Y) = option applies to YMODEM only (Z) = option applies t ...

  7. 【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第四篇博 ...

  8. 【python+selenium的web自动化】- 针对上传操作的实现方案

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 关于上传操作 ​ 上传有两 ...

  9. python实现进度条--主要用在上传下载文件

    在python中进行socket上传文件的时候使用进度条,然后在网上找了好久,找寻相关的进度的条的使用,看了几个,发现总是无法进行调用,主要原因是在进行上传文件的时候,每次传送的数据量是固定的,数据的 ...

随机推荐

  1. HttpClient异步调用WEB服务

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  2. c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别

    一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...

  3. hdoj 5373 The shortest problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5373 一开始想到用整除11的性质去做,即奇位数的和和偶位数的和的差为11的倍数,但估不准数据范围没敢去 ...

  4. pyinstaller使用小结

    安装pyinstaller pip install -U pyinstaller 生成控制台程序 pyinstaller ./example.py 在当前目录的dist文件夹内可以找到编译成功的程序 ...

  5. 数据库系统——B+树索引

    原文来自于:http://dblab.cs.toronto.edu/courses/443/2013/05.btree-index.html 1. B+树索引概述 在上一篇文章中,我们讨论了关于ind ...

  6. Redis大幅性能提升之Batch批量读写

    Redis大幅性能提升之Batch批量读写 提示:本文针对的是StackExchange.Redis 一.问题呈现 前段时间在开发的时候,遇到了redis批量读的问题,由于在StackExchange ...

  7. 接口返回数据Json格式处理

    有这样一个页面 , 用来显示用户的账户记录数据,并且需要显示每个月的 收入 支出合计 ,在分页的时候涉及到一些问题,需要对返回的Json格式做处理,处理起来比较麻烦,后端返回的Json数据格式形式如下 ...

  8. 架构之ELK日志分析系统

    ELK多种架构及优劣 既然要谈ELK在大数据运维系统中的应用,那么ELK架构就不得不谈.本章节引出四种笔者曾经用过的ELK架构,并讨论各种架构所适合的场景和优劣供大家参考. 先大致介绍ELK组件.EL ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(92)-打印EasyUI 的datagrid表格

    前言 应用系统有时候需要打印Datagrid的表格内容,我们本节就来学习打印datagrid内容 打印主要使用:web打印(我们之前有讲过web打印插件jqprint) + 将datagrid重新编制 ...

  10. PythonStudy——Python 注释规范

    注释规范:   什么是注释?  注释:不会被python解释器解释执行,是提供给开发者阅读代码的提示 单行注释: # 开头的语句 多行注释:出现在文件最上方,用''' '''包裹的语句   Pycha ...