什么是pywinauto
它是什么
pywinauto是一组用于自动化Microsoft Windows GUI的python模块。 最简单的是,它允许您将鼠标和键盘操作发送到窗口对话框和控件。
安装
运行 pip install pywinauto
手动安装
安装以下Python包
pyWin32
comtypes
six
(可选)Pillow (截图用)
从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") //使用Alt+快捷键关闭记事本
入门指南
GUI 控件
所有用户应该都对控件非常了解了,在窗口上能被点击或进行其它交互的部分都是控件的一种
确定哪种可访问性技术
一旦你安装了pywinauto - 你怎么样? 第一个必要的事情是确定哪种可访问性技术(pywinauto的backend)可以用于您的应用程序。
Windows上受支持的辅助功能技术列表:
GUI对象检查/Spy工具
如果您仍然不确定哪个backend最适合您,请尝试使用免费提供的对象检查/Spy工具:从GitHub repo gui-inspect-tool下载它们.
如果所有检测工具都看不到某些或所有控件,则仍然可以通过使用基本模块鼠标和键盘生成鼠标和键盘事件来控制应用程序。
自动化的切入点
一个应用程序,你知道它支持上面提到的一种可访问性技术。 下一步是什么?
首先,您应该启动应用程序或连接到现有的应用程序实例。 它可以使用Application对象完成。这不仅仅是subprocess.Popen的克隆,而是进一步自动化的入口点,通过进程边界限制所有范围。 控制可能很少的应用程序实例很有用(您使用一个不打扰另一个实例的实例)。
如果你想要跨越进程边界(比如Win10计算器在多个进程中绘制它的小部件),你的入口点是一个Desktop对象。
窗口规范
这是高级pywinauto API的核心概念。 您可以近似或更详细地描述任何窗口或控件,即使它尚不存在或已经关闭。 窗口规范还保留有关将用于获得真实窗口或控件的匹配/搜索算法的信息。
让我们创建一个详细的窗口规范:
实际窗口查找由wrapper_object()方法执行。 它返回实际现有窗口/控件的一些包装器或引发ElementNotFoundError。 这个包装器可以通过发送动作或检索数据来处理窗口/控件。
但是Python可以隐藏这个wrapper_object()调用,这样你就可以在生产中拥有更紧凑的代码。 以下陈述完全相同:
创建窗口规范有许多可能的标准。 这只是几个例子。
可以在pywinauto.findwindows.find_elements()函数中找到可能的标准列表。
属性解析魔法
如何知道魔法属性名称
如何将“最佳匹配”附加到控件上有几个原则。 因此,如果窗口规范接近其中一个名称,您将获得成功的名称匹配。
1、按标题(窗口文字,名称): app.Properties.OK.click()
2、按标题和控件类型: app.Properties.OKButton.click()
3、按控件类型和编号: app.Properties.Button3.click() (注意: Button0和Button1匹配相同的按钮,Button2是下一个,等等。)
4、按左上角标签和控件类型: app.OpenDialog.FileNameEdit.set_text("")
5、按控件类型和项目文本:app.Properties.TabControlSharing.select("General")
通常并非所有这些匹配的名称都可以同时使用。 要检查指定对话框的这些名称,可以使用print_control_identifiers()方法。 可能的“best_match”名称显示为树中每个控件的Python列表。 也可以从方法输出中复制更详细的窗口规范。 比方说 app.Properties.child_window(title="Contains:", auto_id="13087", control_type="Edit")。
连接到应用程序
这边用window自带的记事本程序作为案例,给大家做讲解。连接应用程序,首先需要用到pywinauto.application.Application()来创建一个应用程序对象,然后再连接到应用程序。
有如下两种方法:
方式一:直接通过start方法打开操作的应用程序
方式二:连接已经打开应用程序,可以通过connect连接到指定的应用程序
运行以上代码,就会自动打开记事本记事本,如下
窗口选择
打开这个窗口之后,我们要操作该窗口的话,那么就的先选中这个窗口,关于窗口的选择有一下几种方式
控件操作
程序窗口中的每一块内容,都是一个控件,我们要对这个窗口的某一块内容进行操作,就需要选择到对应的控件,我们可以通过print_control_identifiers()这个方法,来获取这个窗口下的直接子控件,打印结果如下:
内容输入
内容输入的方法:type_key()
app.UntitledNotepad.Edit.type_keys("Hi from Python interactive prompt %s" % str(dir()), with_spaces = True)
键盘操作通过键盘完成以下操作:全选(ctrl+A) 复制(Ctrl+C) 粘贴(Ctrl+V) 回车(Enter) 粘贴(Ctrl+V)
pywinauto.keyboard.send_key
pywinauto模拟操作键盘,需要使用到 pywinauto.keyboard.send_keys这个方法
键盘操作
键盘操作通过键盘完成以下操作:全选(ctrl+A) 复制(Ctrl+C) 粘贴(Ctrl+V) 回车(Enter) 粘贴(Ctrl+V)
pywinauto.keyboard.send_key
pywinauto模拟操作键盘,需要使用到 pywinauto.keyboard.send_keys这个方法
常见的按键操作
##### 字母按键用按键小写字母表示
常用的一些按键
按键修饰符
更多按键参考官方文档:https://pywinauto.readthedocs.io/en/latest/code/pywinauto.keyboard.html
鼠标操作
pywinauto操作鼠标的所有方法都封装在pywinauto. mouse这个模块中,使用鼠标之前。
首先要导入mouse模块,mouse模块中包含了一系列的鼠标操作事件。
pywinauto. mouse
鼠标移动:move方法
move(coords=(x轴坐标,y轴坐标))
缓慢移动鼠标案例
等待长时间操作
GUI应用程序行为通常不稳定,脚本需要等待,直到出现新窗口或关闭/隐藏现有窗口。 pywinauto可以隐式地(默认超时)灵活地等待对话框初始化,或者明确地使用专用方法/函数来帮助您使代码更容易和更可靠。
每种不同控制类型可用的方法
这些功能可用于所有控件。
capture_as_image click click_input close close_click debug_message double_click double_click_input drag_mouse draw_outline get_focus get_show_state
maximize menu_select minimize move_mouse move_window notify_menu_select
notify_parent press_mouse press_mouse_input release_mouse release_mouse_input restore
right_click right_click_input send_message send_message_timeout set_focus set_window_text
type_keys Children Class ClientRect ClientRects ContextHelpID ControlID ExStyle Font Fonts FriendlyClassName GetProperties HasExStyle HasStyle IsChild IsDialog IsEnabled
IsUnicode IsVisible Menu MenuItem MenuItems Owner Parent PopupWindow ProcessID Rectangle Style Texts TopLevelParent UserData VerifyActionable VerifyEnabled VerifyVisible WindowText
更多控件支持的功能参考:https://pywinauto.readthedocs.io/en/latest/controls_overview.html