[TOC]
# 什么是pywinauto
© Mark Mc Mahon and [Contributors](https://github.com/pywinauto/pywinauto/graphs/contributors), 2006-2018
Released under the BSD 3-clause license
## 它是什么
pywinauto是一组用于自动化Microsoft Windows GUI的python模块。 最简单的是,它允许您将鼠标和键盘操作发送到窗口对话框和控件。
## 安装
* 运行 `pip install pywinauto`
## 手动安装
* 安装以下Python包
* [pyWin32](http://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/)
* [comtypes](https://github.com/enthought/comtypes/releases)
* [six](https://pypi.python.org/pypi/six)
* *(可选)* [Pillow](https://pypi.python.org/pypi/Pillow/2.7.0) (截图用)
* 从[https://github.com/pywinauto/pywinauto/releases](https://github.com/pywinauto/pywinauto/releases)中下载最新的pywinauto
* 解压并运行 `python setup.py install`
要检查是否已正确安装,请运行Python,**中文环境可能不适用**
~~~
>>> from pywinauto.application import Application
>>> app = Application(backend="uia").start("notepad.exe")
>>> app.UntitledNotepad.type_keys("%FX")
~~~
## 它是如何工作的
核心概念在 [入门指南](getting_started.md)中描述.
通过每个类的属性访问(`__getattribute__`)完成了很多工作。 例如,当您获取Application或Dialog对象的属性时,它会分别查找对话框或控件。
~~~
myapp.Notepad # 查找应用程序的窗口/对话框,其标题为'similar'
# to "Notepad"
myapp.PageSetup.OK # 首先查找标题为“PageSetup”的对话框
# 然后它在带有标题的对话框中查找控件
# 比如 "OK"
~~~
此属性解析会延迟(使用默认超时),直到成功为止。 因此,例如,如果您选择菜单选项,然后查找结果对话框,例如
~~~
app.UntitledNotepad.menu_select("File->SaveAs")
app.SaveAs.ComboBox5.select("UTF-8")
app.SaveAs.edit1.set_text("Example-utf8.txt")
app.SaveAs.Save.click()
~~~
在第2行,执行此行时可能无法打开SaveAs对话框。 所以会发生什么,我们要等到我们有一个控件要解决之前解决对话框。 此时,如果我们找不到带有ComboBox5控件的SaveAs对话框,那么我们会等待很短的时间再试一次,这会重复到最大时间(当前为5秒!)
这是为了避免必须明确使用```time.sleep```或```wait```函数。
如果您的应用程序执行长时间操作,则新对话框可能会在以后显示或消失。 你可以等待它的新状态
~~~
app.Open.Open.click() # 打开大文件
app.Open.wait_not('visible') # 确保“打开”对话框变得不可见
# 等待最多30秒,直到加载data.txt
app.window(title='data.txt - Notepad').wait('ready', timeout=30)
~~~
## 一些类似的比较工具
* Python tools
* [PyAutoGui](https://github.com/asweigart/pyautogui) - 一个流行的跨平台库(具有基于图像的搜索,没有基于文本的控件操作)。
* [Lackey](https://github.com/glitchassassin/lackey) - Sikuli的纯Python替代品(基于图像模式匹配)。
* [AXUI](https://github.com/xcgspring/AXUI) - MS UI Automation API的一个包装器。
* [winGuiAuto](https://github.com/arkottke/winguiauto) - 另一个使用Win32 API的模块。
* 其他脚本语言工具
* (Perl) [Win32::GuiTest](http://winguitest.sourceforge.net/)
* (Ruby) [Win32-Autogui](https://github.com/robertwahler/win32-autogui) - Win32 API的包装器。
* (Ruby) [RAutomation](https://github.com/jarmo/RAutomation) - 有3个适配器:Win32 API,UIA,AutoIt。
* 其他免费工具
* (C#) [Winium.Desktop](https://github.com/2gis/Winium.Desktop) - 一个年轻但很好的基于MS UI Automation的工具。
* (C#) [TestStack.White](https://github.com/TestStack/White) - 另一个很好的基于MS UI Automation的库,历史悠久。
* [AutoIt](http://www.autoitscript.com/) - 具有自己的类似Basic语言的免费工具(基于Win32 API,没有.NET计划)
* [AutoHotKey](https://github.com/Lexikos/AutoHotkey_L/) - 具有自己的脚本语言的原生C ++工具(.ahk)
* [“很棒的测试自动化” 列表](https://github.com/atinfo/awesome-test-automation) on GitHub
* [用于功能测试的大量开源工具](http://www.opensourcetesting.org/category/functional/)
* 商业工具
* WinRunner ([http://www.mercury.com/us/products/quality-center/functional-testing/winrunner/](http://www.mercury.com/us/products/quality-center/functional-testing/winrunner/))
* SilkTest ([http://www.segue.com/products/functional-regressional-testing/silktest.asp](http://www.segue.com/products/functional-regressional-testing/silktest.asp))
* Many Others ([http://www.testingfaqs.org/t-gui.html](http://www.testingfaqs.org/t-gui.html))
## 如果有那么多的话,为什么还要编写另一个自动化工具?
这里有很多原因:-)
**采取不同的方法:**
大多数其他工具不是面向对象的,你最终写的东西如下:
~~~
window = findwindow(title = "Untitled - Notepad", class = "Notepad")
SendKeys(window, "%OF") # Format -> Font
fontdialog = findwindow("title = "Font")
buttonClick(fontdialog, "OK")
~~~
我希望创造一些更加用户友好(和pythonic)的东西。 例如,上面的编程转换如下:
~~~
win = app.UntitledNotepad
win.menu_select("Format->Font")
app.Font.OK.click()
~~~
**Python让它变得简单:**
Python是一种很棒的编程语言,但是没有自动化工具是Pythonic(很少有库是用Python实现的)。
**本地化是主要要求:**
Mark:
“我在本地化行业工作,GUI自动化被广泛使用,因为您需要做的就是确保您的UI在Source UI方面的行为和正确性。 实际上,这对于测试原始源UI来说实际上更容易。
但是大多数自动化工具都基于控件的坐标或文本,这些可以在本地化软件中更改。 所以我的目标(虽然尚未实现)是允许脚本在原始源语言(通常是英语)和翻译软件(日语,德语等)之间保持不变。”
- 什么是Pywinauto
- 入门指南
- 如何
- 等待长时间操作
- 远程执行指南
- 每种不同控制类型可用的方法
- 贡献者
- 开发笔记
- 待办项目
- 更新日志
- 基本用户输入模块
- pywinauto.mouse
- pywinauto.keyboard
- 主要用户模块
- pywinauto.application
- pywinauto.findbestmatch
- pywinauto.findwindows
- pywinauto.timings
- 特定功能
- pywinauto.clipboard
- pywinauto.win32_hooks
- 控件参考
- pywinauto.base_wrapper
- pywinauto.controls.hwndwrapper
- pywinauto.controls.menuwrapper
- pywinauto.controls.common_controls
- pywinauto.controls.win32_controls
- pywinauto.controls.uiawrapper
- pywinauto.controls.uia_controls
- Pre-supplied Tests
- pywinauto.tests.allcontrols
- pywinauto.tests.asianhotkey
- pywinauto.tests.comboboxdroppedheight
- pywinauto.tests.comparetoreffont
- pywinauto.tests.leadtrailspaces
- pywinauto.tests.miscvalues
- pywinauto.tests.missalignment
- pywinauto.tests.missingextrastring
- pywinauto.tests.overlapping
- pywinauto.tests.repeatedhotkey
- pywinauto.tests.translation
- pywinauto.tests.truncation
- 后端内部实施模块
- pywinauto.backend
- pywinauto.element_info
- pywinauto.win32_element_info
- pywinauto.uia_element_info
- pywinauto.uia_defines
- 内部模块
- pywinauto.controlproperties
- pywinauto.handleprops
- pywinauto.xml_helpers
- pywinauto.fuzzydict
- pywinauto.actionlogger
- pywinauto.sysinfo
- pywinauto.remote_memory_block