zoukankan      html  css  js  c++  java
  • Python + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解

    前言

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

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

  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/9693865.html
Copyright © 2011-2022 走看看