zoukankan      html  css  js  c++  java
  • 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt

    首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 。

    这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Active Accessibility, UIAutomation

    用脚本语言AutoIT实现自动化就是第一种技术Windows API, 查找窗口句柄实现的。

    用工具Spy++查看程序,如果Spy++能识别程序窗口中的控件就能用这种技术。

    python中也有一个UI自动化测试模块pywinauto,也是用这种技术实现的(补充:pywinauto后来也支持UIAutomation了,本人刚写这个库时还不支持)。 

    但Windows API实现的自动化不支持WPF程序、Windows 8中的Metro程序,因为它们的控件都是自绘出来的,没有句柄的概念。

    UIAutomation实现的自动化支持微软提供的各种界面开发框架,如Win32, MFC, Windows Forms, WPF, Metro App, IE。

    另外Qt, Firefox, Chrome实现了UI Automation Provider也支持UIAutomation.

    UIAutomation的C++ API使用介绍可以参考CodeMagazine上的一篇文章

    Creating UI Automation Client Applications  

    还有官方文档 msdn: UI Automation Client Programmer's Guide

    我就是根据这个用Python和C++对UIAutomation做了一层封装,方便我自己的使用,可以快速开发自动化脚本。

    UIAutomation支持平台包括Windows XP(SP3),Windows Vista, Windows 7, Windows 8、8.1、10。

    安装使用python uiautomation,支持Python2,Python3,x86,x64(最新版uiautomation2.0+只支持Python3)。

    运行pip install uiautomation,安装后在c:pythonxxscripts目录里会有一个脚本automation.py,使用此脚本遍历UI控件。

    打开项目主页https://github.com/yinkaisheng/Python-UIAutomation-for-Windows,并阅读readme查看使用介绍。

    运行源码demos目录里的操作计算器的脚本 demosautomation_calculator.py,查看一个自动化脚本运行效果。

    下面通过QQ2013做下实验(spy++获取不到QQ窗口内的控件,可以对比一下):

    然后运行最新版QQ2013, 先保持在qq登录界面

    运行cmd,cd到工具的目录,输入automation.py -t3回车,然后3秒内切换到qq的登录界面

    cmd窗口中就显示了qq窗口中的控件信息

     

    运行automation.py遍历控件时,支持下列参数

    -t int value, 延迟时间time秒,延迟指定秒数再遍历控件,
    -r, 从树的根部(root: Desktop)遍历,如果不指定,从当前窗口遍历
    -d, int Value, 遍历控件树的的深度depth,如果不指定,遍历整个树,和-c一起使用时,可以为负值
    -f, 遍历焦点focus控件,如果不指定,从当前窗口遍历
    -c, 遍历光标下的控件,如果不指定,从当前窗口遍历,如果同时指定-d, -d可以为负值,比如-d-2表示从光标下控件向上找到两层父控件,遍历这个父控件

    -a, 获取光标下控件及其所有祖先(ancestor)控件

    -n, 显示控件的完整name, 如果不指定,只显示前30个字符


    例子:
    automation.py –t3, 3秒后遍历当前窗口所有控件
    automation.py –d2 –t3, 3秒后遍历当前窗口前三层控件
    automation.py –r –d1 –t0 -n, 0秒后遍历root的第一层子控件,并显示控件完整名称

    automation.py –c –t3, 3秒后遍历鼠标光标下面的控件信息

     automation.py –c –t3 -d-2, 3秒后遍历鼠标光标下面的控件向上两层的父控件

     下面是在Windows 8中运行automation.py –r –d1 –t0的例子, 如下图

    在UIAutomation中控件树的根节点是 桌面Desktop, 上面的命令输入了了 -r(root)参数,就从根节点枚举窗口,参数-d1,只枚举桌面的第一层子控件。

    在Windows 8中,如果要查看Metro App的控件信息,必须当前窗口要在Metro界面才能枚举,如果Metro App被切换到后台,则获取不到它的控件。

    先运行automation.py -t5, 在5秒内切换到Metro App, 等待几秒钟,查看cmd,就能看到Metro App的控件信息。

    automation.py同时会把显示的信息写入到文件@AutomaitonLog.txt,方便查看。

    登录QQ2013,再一次枚举它的窗口,如下图,uiautomation遍历出了联系人信息

    更多使用介绍,请参考GitHub

    https://github.com/yinkaisheng/Python-Automation-for-Windows

    另外很多人问我遇到一些软件不能用UIAutomation自动化,在此说明下不能支持的原因:

    UIAutomation的工作原理是:
    当你用UIAutomation操作程序时,UIAutomation会给程序发送WM_GETOBJECT消息,
    如果程序处理WM_GETOBJECT消息,实现UI Automation Provider,并调用函数
    UiaReturnRawElementProvider(HWND hwnd,WPARAM wparam,LPARAM lparam,IRawElementProviderSimple *el)
    此程序就支持UIAutomation。
    IRawElementProviderSimple就是UI Automation Provider,包含了控件的各种信息,如Name,ClassName,ContorlType,坐标...
    UIAutomation根据程序返回的IRawElementProviderSimple,就能遍历程序的控件,得到控件各种属性,进行自动化操作。
    所以如果你发现UIAutomation不能识别一些程序内的控件或部分不支持,这并不是UIAutomation的问题,
    是程序作者没有处理WM_GETOBJECT或没有实现UIAutomation Provider,或者故意不想支持UIAutomation。

    很多DirectUI程序都没有实现
    UIAutomation Provider,所以不支持自动化,要想支持自动化,必须程序作者修改源码支持。
    
    
     

     。

  • 相关阅读:
    Flutter Android ERROR: ensureInitializationComplete must be called after startInitialization
    MySQL 创建用户表和好友表
    Android 广播的使用 文档使用的是 kotlin版本
    Flutter 分段器的使用
    Flutter 计算两个日期之间相差多少天,生成区间随机数
    Flutter 多环境
    Android ListView 的使用 Kotlin
    Android 自定义控件----基础
    Flutter 学习(3)------------通过List或者map循环数据渲染页面。。
    vs2015 编译报错:The project references NuGet package(s) that are missing on this computer...
  • 原文地址:https://www.cnblogs.com/Yinkaisheng/p/3444132.html
Copyright © 2011-2022 走看看