Windows 자동 테스트 소프트웨어에서 파이썬으로 작성된

https://www.jianshu.com/p/be3c46c7a905

uiautomation 모듈 연구 노트


몇 시간 전, 때문에 개인의 요구에, 인터넷은 Windows 플랫폼에 관한 정보, 자동화 된 테스트를 찾기 위해, 그리고 마지막으로 꽤 좋은 파이썬 모듈을 찾을 : uiautomation, 직접 핍 쉽게이 모듈에 액세스 할 수 있습니다 uiautomation를 설치합니다. 이 모듈을 공부하면서, 미래에 대한 접근을 용이하게하기 위해 몇 가지 메모를 작성뿐만 아니라 읽는 사람을 용이하게합니다.

× 00 개요

이 라이브러리는 Github에서의 오픈 소스, 주소 : https://github.com/yinkaisheng/Python-UIAutomation-for-Windows
및 저자는, 중국, 또는 난징 나를 아주 따뜻한 느낌.
이 라이브러리는 Windows 플랫폼에 Windows 소프트웨어의 대부분이 아 이런 것들이 일반적인 제어, 아, 아, 그 창을 규범에 따라 처리해야합니다, 매우 될 실제에 맞게 말할 수있다, 윈도우 밖으로 제공 이러한 인터페이스. 덕분에 yinkaisheng에 대해 사전에, 그의 작업은 더, 파이썬 개발자가 인터페이스를 제공하기 위해 않는 이러한 인터페이스를 통합하는 것이다. 이것은 크게 파이썬 자동화 된 테스트 절차에서 개발하고자하는 사람들을 용이하게합니다.

0x01로 저자의 readme 파일

  • 이 모듈은 그 기반이되는, MFC,의 WinForm, WPF (Windows8 새 창을 개발 Windows 시스템의 시작에서) 메트로 UI, Qt는 파이어 폭스를 지원하는 Windows 기반 기술 UIA, 필요한 최소 시스템 지금 WindowsXP SP3입니다. 인터넷 기술은 윈도우 응용 프로그램 지원 및 기타 소프트웨어를 양식 모두, 같은 DirectUI 기반의 개발로,이 모듈은 정보를 얻기 어려울 수 있습니다.
  • 이 오픈 소스 모듈의 저자는, Apache2.0이 소스 코드를 자유롭게 복사 할 수있는, 수정, 재 사용을 기반으로 게시, 찬양하라!
  • 설치가 간단하고, 파이썬은 컴퓨터 pypi 환경이 기존에 실행 pip install uiautomation설치할 수 있으며 자동으로 파이썬의 스크립트 폴더 automation.py 메인 프로그램에 복사됩니다.
  • 저자는 또한 C ++ DLL 소스 코드를 제공하지만, 참여 여기 없습니다. 볼 수 있습니다 그것은 매우 전용의 개발자의 이름입니다!
  • 당신은 단순히 automation.py를 실행할 수 있습니다, 효과는 현재 활성화 된 윈도우의 모든 컨트롤을 통과 3 초 후에 바로 실행됩니다. 실행 QQ의 효과 :


     
     

     
     

    표시 효과는 매우 명백 제어, 제어의 전체 (픽셀) 위치를 포함하는, 디스플레이 창에서 정보 핸들 제어 트리 깊이 제어 유형 이름을 제어한다. 동시에, 모든 정보가 쉽게 액세스 할 수있는 디렉토리에 현재 @의 AutomationLog.txt 파일에 저장됩니다.

  • 저자는 메모장 프로그램을 제어하는 ​​데모를 제공합니다 :
import subprocess
import uiautomation as automation

print(automation.GetRootControl())
subprocess.Popen('notepad.exe')
notepadWindow = automation.WindowControl(searchDepth = 1, ClassName = 'Notepad') print(notepadWindow.Name) notepadWindow.SetTopmost(True) edit = notepadWindow.EditControl() edit.SetValue('Hello') edit.SendKeys('{Ctrl}{End}{Enter}World') 

GetRootControl () 메서드는 즉, (너무 좋아 바를 이해) 전체 Windows 데스크톱 시각화, 제어의 루트를 반환
WindowControl을 (searchDepth = 1, 클래스 이름 = '메모장') 방법이 역할은 찾는 방법의 매개 변수를 수정하는 것입니다하는 WindowsControl 객체를 생성 우리가 제어 할, 사용 가능한 매개 변수 searchFromControl = 없음, searchDepth = 0xFFFFFFF로, searchWaitTime = sEARCH_INTERVAL, foundIndex = 1, 이름, 하위 이름, 클래스 이름, 깊이 등등과, 제어 클래스의 초기화 방법은 아래의 소스 코드에 갈 수 초기화 이러한 매개 변수를 봐 방법을 사용합니다.

  • 다음으로, 저자는 작은 도구 Inspect.exe 설명이 도구는 Microsoft에서 제공되면, UI의 내용을 감지하는 데 사용할 수 있습니다, 자동으로 마이크로 소프트 윈도우 SDK에 통합 된이 프로그램은, 그냥, 컴퓨터의 Visual Studio 및 Windows SDK에 설치 이 프로그램을 찾을 수 있어야합니다. 물론 충분한 초점은 도구에서이 프로그램을 찾을 수 있습니다 :


     
     

     
     

    우리는 효과가 윈도우의 아주 좋은, 명확한 구조로 볼 수 있습니다!

  • 最后作者放了一些自己使用该模块的截图,可以看到,功能十分强大:


     

     

     

     

     

0x02 简单了解实现原理

作者在readme文档中外链了一篇博文,简单介绍了实现原理,为了能更好地掌握这个库的使用,这篇原理我也简单的学习一下。(原文链接

在最早的Windows开发中是没有自动化测试的概念的。1997年微软在操作系统中集成了MASS(Microsoft Active Accessibility)组件,但是微软开发MASS组件的初衷并不是为了自动化测试,而是提供了一套接口,让开发者们可以方便的开发残疾人士辅助软件,比如读屏软件等。伴随着自动化测试的应用越来越广泛,微软正视了自动化测试的需求,在MASS的基础上,对其重新封装设计并实现了UIAutomation的类库(.NET)。从Win7系统开始的后续Windows操作系统都整合了Windows Automation API的所有功能。作者在阅读了MSDN上的《UI Automation Client Programmer's Guide》和CodeMagazine上的《Creating UI Automation Client Applications》两篇文章后,用Python和C++对UIAutomation做了一层简单的封装,方便了想要用Python开发自动化测试应用而对.Net平台又不太熟悉的人,比如我。

0x03 API学习摘要

之前也已经提到,这个模块是作者对UIA用C++和Python简单的做了一层封装,只要能理解面向对象编程,学习难度也不是很大。正好,我在作者的CSDN博客里面找到了作者使用此模块的实例(原文链接),就以此为学习的入口,代码如下:

#!python3
# -*- coding: utf-8 -*-
"""
本脚本可以获取QQ2017(v8.9.4)群所有成员详细资料,请根据提示做对应的操作
作者:[email protected]
"""
import time
import uiautomation as automation def GetPersonDetail(): detailWindow = automation.WindowControl(searchDepth= 1, ClassName = 'TXGuiFoundation', SubName = '的资料') details = '' for control, depth in automation.WalkControl(detailWindow): if isinstance(control, automation.EditControl): details += control.Name + control.CurrentValue() + '\n' details += '\n' * 2 detailWindow.Click(-10, 10) return details def main(): automation.Logger.WriteLine('请把鼠标放在QQ群聊天窗口中的一个成员上面,3秒后获取\n') time.sleep(3) listItem = automation.ControlFromCursor() if listItem.ControlType != automation.ControlType.ListItemControl: automation.Logger.WriteLine('没有放在群成员上面,程序退出!') return consoleWindow = automation.GetConsoleWindow() if consoleWindow: consoleWindow.SetActive() qqWindow = listItem.GetTopWindow() list = listItem.GetParentControl() allListItems = list.GetChildren() for listItem in allListItems: automation.Logger.WriteLine(listItem.Name) answer = input('是否获取详细信息?按y和Enter继续\n') if answer.lower() == 'y': automation.Logger.WriteLine('\n3秒后开始获取QQ群成员详细资料,您可以一直按住F10键暂停脚本') time.sleep(3) qqWindow.SetActive() #确保群里第一个成员可见在最上面 left, top, right, bottom = list.BoundingRectangle while allListItems[0].BoundingRectangle[1] < top: automation.Win32API.MouseClick(right - 5, top + 20) for listItem in allListItems: if listItem.ControlType == automation.ControlType.ListItemControl: if automation.Win32API.IsKeyPressed(automation.Keys.VK_F10): if consoleWindow: consoleWindow.SetActive() input('\n您暂停了脚本,按Enter继续\n') qqWindow.SetActive() listItem.RightClick() menu = automation.MenuControl(searchDepth= 1, ClassName = 'TXGuiFoundation') menuItems = menu.GetChildren() for menuItem in menuItems: if menuItem.Name == '查看资料': menuItem.Click() break automation.Logger.WriteLine(listItem.Name, automation.ConsoleColor.Green) automation.Logger.WriteLine(GetPersonDetail()) listItem.Click() automation.SendKeys('{Down}') if __name__ == '__main__': main() input('press Enter to exit') 

我用的环境是Pycharm2017.2社区版和Python3.6,这个模块的内容主要集中在uiautomation.py文件中,学习方法就是去这个文件里看相关的代码。先简单看一下这个代码,看看里面有哪些看不懂的,看不懂的地方就是要学习的地方。

首先是automation.WindowControl,这看起来是个对象,但是还不知道这个对象有哪些方法和属性,下面的WalkControl和EditControl应该也是对象,从命名上看可能直接代表了窗体中的不同控件。control.CurrentValue应该是属性,下面的detailWindow.Click()应该是模拟鼠标点击的方法。再看main()函数,Logger.WriteLine()方法应该是跟日志有关,ControlFromCursor()可能是从鼠标获取控件的方法......

这样看一遍大概就知道应该去源码里面找哪些定义了,我们利用PyCharm的跳转定义功能可以很容易地找到定义这些类和方法的代码,都在uiautomation.py这个文件中。源码就不贴了,通过跳转功能可以很容易地理解其中的方法与类之间的逻辑关系。这个文件中主要定义了“控件”这个类,就是两千多行处的Class Control(.............):这一大段代码,里面包含了所有对控件的方法和基本的属性。方法有获取控件名称啊,内容啊等,属性有位置啊,是否Active啊这些。然后由Control类派生出各个子类,代表具体的各种控件,比如WindowControl类表示窗口,EditControl类表示输入框,ButtonControl类代表按钮等等,几乎涵盖所有Win窗体程序的所有控件。并且作者在很多类下面做了详细的注释,阅读起来应该没有什么困难。理解的难点应该是这里面有大量关于WinForm开发的知识,需要一点基础。

우리가 알아 내기 위해 이러한 방법과 클래스를 정의 할 때, 우리는이 인스턴스의 기능을 이해할 수있다. 다양한 공간 특성 및 방법의 조합을 이용하여 그룹 QQ QQ 그룹 창으로부터 얻은 정보를 달성했다. 정보 그룹 번호, 그룹 구성원 정보, 채팅 기록, 텍스트 파일로 저장을 포함.

를 0x04 포스트 스크립트

  • 아니나 다를까, 더 근본적인 방법을 쓰기 보이는 것은 재료의 강도를 강화하는 것입니다 다시 자신의 방법을 찾기 위해 수백 번 더 봐!
  • 인생은 짧고, 파이썬을 사용!


저자 : 8f7aac77586a의
링크 : HTTPS : //www.jianshu.com/p/be3c46c7a905
출처 : 제인 책
저자가 보유 제인 책의 저작권은, 어떤 형태로도 복제되어, 승인을 얻기 위해 작성자에게 문의하고 소스를 표시하시기 바랍니다.

추천

출처www.cnblogs.com/dhcn/p/11128251.html