前言
在 web 页面中, 可以使用 selenium 的定位方式来识别元素, 从而来实现页面中的自动化, 但对于页面中弹出的文件选择框, selenium 就实现不了了, 所以就需引用 AutoIt 工具来实现.
AutoIt 介绍
AutoIt 简单介绍下, AutoIt 目前最新是 v3 版本, 这是一个使用类似 BASIC 脚本语言的免费软件, 它设计用于 Windows GUI(图形用户界面)中进行自动化操作. 它利用模拟键盘按键, 鼠标移动和窗口 / 控件的组合来实现自动化任务. 而这是其它语言不可能做到或无可靠方法实现的(例如 VBScript 和 SendKeys).
实现原理:
使用 AutoIT 下的工具去定位页面外的元素属性值, 其次再利用 AutoIT 下的工具编写合适的脚本, 然后将脚本编译成可执行文件, 最后在自动化实现时, 直接调用此脚本实现文件的上传, 下载等操作.
备注: 定位元素, 编写脚本和编译, 需要借助 AutoIT 提供的工具, 但是脚本编译成可执行文件后, 可以直接使用.
AutoIt 的下载与安装就不再赘述, 下载地址如下:
安装成功后会出现如下菜单:
AutoIt 工具使用
1.AutoIT Windows 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 工具来实现.
实现第三步, 操作如下:
1打开 autoit 工具包下的 AutoIT Windows Info(x64)工具, 版本按自己电脑系统来, 界面如下所示:
1.1 鼠标点中 Finder Tool 并拖动到输入文件名处, 操作如下所示, 得到下图结果
1.2 重复上述定位步骤, 定位保存按钮, 结果如下图所示
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 Windows Info 识别出的 Title 字段, controlID 即 AutoItWindow Info 识别出的 Class 和 Instance 的拼接, 如上图拼接后的结果应为: Button2, 也就是 ClassnameNN 的值.
3使用 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()会很快关闭浏览器.
好了, 说了这么多, 自己需要努力的还有很多, 明天中秋, 祝大家中秋节快乐啦!
来源: https://www.cnblogs.com/hong-fithing/p/9693865.html