前言
转眼间学 Python 也有接近 4 年的事情了。
自从学了这门所谓的编程语言之后,一切皆对象的思维方式影响了我的工作、生活,顺带着影响着人生观等。所以说,专注一件事情的同时,顺带着把其他的一些东西醒悟了,这也算是一件圆满的答复吧。
- 本人学习、整理的笔记个人YY为比较直观,用词刺眼,如有冒犯,多多见谅。
网上介绍 Python 的太多,我就用最实际的来说:我个人认为硬件技术的发展使得目前的硬件问题变得性能过剩,加上最近几年网上大多数“专家”也发现了摩尔定律可能性或者存在被打破的规律,so,不用多说,学 Python 还是学 other 那是需求者要说的事情;假设你不喜欢蛋糕,每天路过一个蛋糕店,且这个蛋糕店能让你免费领取、试吃新鲜刚做好蛋糕,对于你自己而言,东西再好、免费也是白搭。所以说,一门技术对于一个人来说,最重要的第一点是用途,其次就是易学、易用。
与我来说,Python 在我实际当中本就有实现的用途,其次就是易学与易用。
那么本文的主角 Pywinauto 顾名思义,就是利用 Python 在电脑上进行软件的 GUI 自动化,模拟人工操作;那么,你的流程可以先这样:
- 利用面向对象的思维方式,先将重复性且有规律的工作内容进行分类;
- 利用流程思维(思维导图的方式)将工作类进行流程设计(面向过程);
- 使用 Python Pywinauto 库、os 模块(或者 Pathlib)、win32clipboard(像手动操作复制图片、或者文字需要的)……
[这里只列举了我自己常用的几个]
以上只是自己的开头,接下来是正文的开始,我自己从 Pywinauto 官方文档 - 点击传送 里使用 沉浸式翻译 插件进行摘录保存,里面根据自己的理解修改了一定量的东西,再加上根据自己的阅读习惯进行一定量的排版。
推荐辅助工具:Windows - SDK - inspect,微软官方:https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/ 点击 Download the installer 等待下载好,安装时尽管点下一步。
inspect 安装之后先重启电脑,否则打开 inspect 可能会卡死并且该软件不工作。重启后请在我的电脑依次打开:C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64 (注意:10.0.22621.0 是我自己目前电脑最新的版本号,请根据你的电脑来,否则就不是说依次打开了!) 在 x64 的文件夹下找到 inspect.exe 建议右击 - 发送到 - 桌面快捷方式 。
这是什么?
pywinauto是一组用于自动化Microsoft Windows GUI的python模块。在最简单的情况下,它允许您将鼠标和键盘操作发送到窗口对话框和控件。
安装
pywinauto 可以与 pip 和 conda 一起安装。Run pip install pywinauto
或 conda install -c conda-forge pywinauto
.
手动安装
- 安装以下 Python 包
- pywin32 - 点击送达
- comtypes - 点击送达
- six - 点击送达
- Pillow - 点击送达 (可选)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")
它是如何工作的
《入门指南》中介绍了核心概念。
通过每个类的属性访问 ( __getattribute__
) 可以完成很多工作。例如,当您获取 Application 或 Dialog 对象的属性时,它会分别查找对话框或控件。
myapp.Notepad # looks for a Window/Dialog of your app that has a title 'similar'
# to "Notepad"
myapp.PageSetup.OK # looks first for a dialog with a title like "PageSetup"
# then it looks for a control on that dialog with a title
# like "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 行执行此行时,“另存为”对话框可能未打开。因此,我们等到有控件要解决后再解决对话框。
此时,如果我们找不到带有 ComboBox5 控件的 SaveAs 对话框,那么我们会等待很短的时间并重试,这会重复到最长时间(当前为 5 秒!
这是为了避免显式使用 time.sleep 或“wait”函数。
如果应用程序执行长时间操作,则新对话框可能会在以后出现或消失。您可以像这样等待它的新状态
app.Open.Open.click() # opening large file
app.Open.wait_not('visible') # make sure "Open" dialog became invisible
# wait for up to 30 seconds until data.txt is loaded
app.window(title='data.txt - Notepad').wait('ready', timeout=30)
一些类似的比较工具
-
Python 工具
- PyAutoGui - 一个流行的跨平台库(具有基于图像的搜索,没有基于文本的控件操作)。
- Lackey - Sikuli 的纯 Python 替代品(基于图像模式匹配)。
- AXUI - MS UI 自动化 API 的包装器之一。
- winGuiAuto - 另一个使用 Win32 API 的模块。
-
其他脚本语言工具
- (Perl) Win32::GuiTest(Perl)Win32::GuiTest
- (Ruby) Win32-Autogui - a wrapper around Win32 API.
- (Ruby) RAutomation - there are 3 adapters: Win32 API, UIA, AutoIt.
-
Other free tools其他免费工具
- (C#)Winium.Desktop - 一个年轻但优秀的基于MS UI自动化的工具。
- (C#)TestStack.White - 另一个优秀的基于 MS UI 自动化的库,具有悠久的历史.
- AutoIt - 具有自己的类似 Basic 语言的免费工具(基于 Win32 API,无 .NET 计划)
- AutoHotKey - 具有自己的脚本语言 (.ahk) 的原生 C++ 工具
- GitHub 上的“很棒的测试自动化”列表
- 用于功能测试的大量开源工具
-
商业工具
如果有这么多自动化工具,为什么还要编写另一个自动化工具呢?
有很多原因:-)
采用不同的方法:**
大多数其他工具都不是面向对象的,你最终会写出这样的东西:
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 是一种很棒的编程语言,但没有 Python 的自动化工具(极少数库是用 Python 实现的)。
本地化作为主要要求:
Mark:马克:
“我在本地化行业工作,GUI 自动化经常被广泛使用,你需要做的就是确保你的 UI 相对于源 UI 的行为和正确性。这实际上比测试原始源 UI 更容易。
但是大多数自动化工具都是基于控件的坐标或文本,这些可以在本地化软件中更改。
因此,我的目标(尽管尚未实现)是允许脚本在原始源语言(通常是英语)和翻译软件(日语、德语等)之间保持不变。