专栏首页m0w3nPython结合Pywinauto 进行 Windows UI 自动化

Python结合Pywinauto 进行 Windows UI 自动化

转:Python结合Pywinauto 进行 Windows UI 自动化

https://blog.csdn.net/z_johnny/article/details/52778064

说明: Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面。它可以允许你很容易的发送鼠标、键盘动作给Windows的对话框和控件。 其中,最主要功能为对windows标准控件的一系列动作可编程处理。包括对窗口的指定、鼠标或键盘操作、获得控件属性等等。程序的开始为对所需应用的启 动或连接。获得程序连接后,pywinauto通过窗口的名称、类名、是否可见等属性寻找匹配的窗口,进而通过类似方法寻找用户所需的控件,并获得相应的 句柄。之后,用户可通过易理解的编程方式对指定控件进行相关操作的编程,包括鼠标点击、键盘输入、判断控件间关系、获取控件属性等。

文档参考: pywinauto 0.5.4 documentation Windows GUI Automation with Python pywinauto官网,带Demo example 在中文windows下使用pywinauto进行窗口操作 用pywinauto进行win32应用程序的测试

举个例子

#! /usr/bin/env python
#coding=GB18030

'''
FuncName: johnny-pywinauto.py
Desc: study pywinauto
Date: 2016-10-10 14:30
Author: johnny
Home:http://blog.csdn.net/z_johnny
'''

from pywinauto import application
import SendKeys
import time

class Pywin(object):
    """
    pywin framwork main class
    tool_name : 程序名称,支持带路径
    windows_name : 窗口名字
    """
    SLEEP_TIME = 1

    def __init__(self):
        """
        初始化方法,初始化一个app
        """
        self.app = application.Application()

    def run(self, tool_name):
        """
        启动应用程序
        """
        self.app.start_(tool_name)
        time.sleep(1)

    def connect(self, window_name):
        """
        连接应用程序
        app.connect_(path = r"c:\windows\system32\notepad.exe")
        app.connect_(process = 2341)
        app.connect_(handle = 0x010f0c)
        """
        self.app.connect_(title = window_name)
        time.sleep(1)

    def close(self, window_name):
        """
        关闭应用程序
        """
        self.app[window_name].Close()
        time.sleep(1)

    def max_window(self, window_name):
        """
        最大化窗口
        """
        self.app[window_name].Maximize()
        time.sleep(1)

    def menu_click(self, window_name, menulist):
        """
        菜单点击
        """
        self.app[window_name].MenuSelect(menulist)
        time.sleep(1)

    def input(self, window_name, controller, content):
        """
        输入内容
        """
        self.app[window_name][controller].TypeKeys(content)
        time.sleep(1)

    def click(self, window_name, controller):
        """
        鼠标左键点击
        example:
        下面两个功能相同,下面支持正则表达式
        app[u'关于“记事本”'][u'确定'].Click()
        app.window_(title_re = u'关于“记事本”').window_(title_re = u'确定').Click()
        """
        self.app[window_name][controller].Click()
        time.sleep(1)

    def double_click(self, window_name, controller, x = 0,y = 0):
        """
        鼠标左键点击(双击)
        """
        self.app[window_name][controller].DoubleClick(button = "left", pressed = "",  coords = (x, y))
        time.sleep(1)

    def right_click(self, window_name, controller, order):
        """
        鼠标右键点击,下移进行菜单选择
        window_name : 窗口名
        controller:区域名
        order : 数字,第几个命令
        """
        self.app[window_name][controller].RightClick()
        for down in range(order):
                SendKeys.SendKeys('{DOWN}')
                time.sleep(0.5)
        SendKeys.SendKeys('{ENTER}')
        time.sleep(1)

if __name__ ==  "__main__":
    app = Pywin()
    # 记事本例子
    tool_name = "notepad.exe"
    # 通过Spy++ 获取window_name,即标题文本
    window_name = u"无标题 - 记事本"
    menulist = u"帮助->关于记事本"
    # 通过Spy++ 获取controller,即窗口类名
    controller = "Edit"
    content = u"johnny"
    window_name_new = content + ".txt"
    # 启动程序,记事本只能开一个
    app.run(tool_name)
    app.connect(window_name)
    app.max_window(window_name)
    app.menu_click(window_name,menulist)
    app.click(u'关于记事本', u'确定')
    app.input(window_name,controller,content)
    # Ctrl + a 全选
    app.input(window_name,controller,"^a")
    # 选择复制
    app.right_click(window_name,controller,3)
    #选择粘贴
    app.right_click(window_name,controller,4)
    SendKeys.SendKeys('{ENTER}')
    # Ctrl + v 粘贴
    app.input(window_name,controller,"^v")
    # Ctrl + s 保存
    app.input(window_name,controller,"^s")
    # 输入文件名
    app.input(u"另存为",controller,content)
    # 保存
    app.click(u"另存为","Button")
    try:
        app.click(u"确认另存为","Button")
    except:
        pass
    finally:
        app.close(window_name_new)

其他

1.安装

pip install pywinauto
pip install SendKeys
# SendKeys 需要VCForPython27.msi环境支持  

VCForPython27(SendKeys需要).msi 官方下载

2.SendKeys中特殊字符的键代码

BACKSPACE {BACKSPACE}、{BS} 或 {BKSP} 
BREAK {BREAK} 
CAPS LOCK {CAPSLOCK} 
DEL 或 DELETE {DELETE} 或 {DEL} 
DOWN ARROW(下箭头) {DOWN} 
END {END} 
ENTER {ENTER} 或 ~ 
ESC {ESC} 
HELP {HELP} 
HOME {HOME} 
INS 或 INSERT {INSERT} 或 {INS} 
LEFT ARROW(左箭头) {LEFT} 
NUM LOCK {NUMLOCK} 
PAGE DOWN {PGDN} 
PAGE UP {PGUP} 
PRINT SCREEN {PRTSC}(保留,以备将来使用) 
RIGHT ARROW(右箭头) {RIGHT} 
SCROLL LOCK {SCROLLLOCK} 
TAB {TAB} 
UP ARROW(上箭头) {UP} 
F1 {F1} 
F2 {F2} 
F3 {F3} 
F4 {F4} 
F5 {F5} 
F6 {F6} 
F7 {F7} 
F8 {F8} 
F9 {F9} 
F10 {F10} 
F11 {F11} 
F12 {F12} 
F13 {F13} 
F14 {F14} 
F15 {F15} 
F16 {F16} 
数字盘加号 {ADD} 
数字盘减号 {SUBTRACT} 
数字盘乘号 {MULTIPLY} 
数字盘除号 {DIVIDE}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 树莓派Raspberry实践笔记—显示分辨率配置

    【原创链接】:http://www.cnblogs.com/atsats/p/6607886.html

    墨文
  • 树莓派Raspberry实践笔记—显示分辨率配置

    转载:http://www.cnblogs.com/atsats/p/6607886.html

    墨文
  • 从零构建以太坊(Ethereum)智能合约到项目实战——学习笔记4

    酷我音乐-》方法/行为:启动酷我音乐、关闭酷我音乐、搜素歌曲、下一首歌、上一首歌、暂停、调节音量、播放

    墨文
  • 【中国脑计划与众神计算】AI芯片大航海时代,打造新一代脑模拟计算系统

    【新智元导读】3月11日,北京脑科学和类脑计算论坛召开,以“众神(经)计算”为主题,由中科院计算所研究员孙毓忠首次提出,众专家分析讨论,探索用于脑科学和脑疾病的...

    新智元
  • flask框架(四)配套代码

    小闫同学啊
  • JSP三:学习Session

    也叫会话,由于服务器⽆法识别每⼀次 HTTP 请求的出处(也就是不知道来自于哪个终端),它只会接受到⼀个请求信号,所以就存在⼀个问题:万一浏览器将用户的响应发送...

    乐心湖
  • 积木系统,将运营系统做到极致

    积木系统上线半年,取得了些成绩,也暴露出不少问题,加上 2.0 版本也准备开动,因此正是时候来个总结反思下。

    IMWeb前端团队
  • 积木系统,将运营系统做到极致

    本文作者:IMWeb 江源 原文出处:IMWeb社区 未经同意,禁止转载 积木系统上线半年,取得了些成绩,也暴露出不少问题,加上 2.0 版本也准备开...

    IMWeb前端团队
  • 人工智能「 服装设计师 」之 三维重建

    这是论文《 Detailed Garment Recovery from a Single-View Image 》的解读。该论文研究,从照片中提取服装信息,并...

    mixlab
  • Python爬取京东Iphone X用户评论并绘制词云

    目前京东商城只会展示商品的前100页评论,所以我们能爬取到的评论只有1000条。 不过如果区分下好/差/中评分别爬取的话,理论上应该能保存3000条评论。

    Awesome_Tang

扫码关注云+社区

领取腾讯云代金券