- 初学任何技能不要一上来就各种买买买视频、囤课、计划等不会进步的操作,建议先学习,并请多使用搜索引擎,乃至现在有很多免费的 AI !
- 搜:xxx技能怎么学?学习不是小马过河问如何过河,何况该东西是存在的,存在即自然,所以很多你能看到的知识都是拿来即用。
- 最好找官方文档,或基础操作教程等,从基础去出发,我写笔记之前看的比较杂,用的最多的还只是那些基础操作。
- 请牢记:掌握方法和原理与熟练的使用是两个不同的阶段,先大致看一遍,然后打开有关 Markdown 语言相关的笔记软件开始整理与思考。
- 用简单的一句话就是:掌握一项技能建议先学习。
- 如:学
Python 3
- 学:满足日常学习和提升需求,用简练的语言说清楚问题。
- 习:摆脱基础、语法,重点关注算法、架构、性能,乃至内部实现。
- 以上均以思想为支撑,超脱语言老套路,构建并完善为中心。
- 学:通过阅读、听讲、观察、思考、理解等途径获得知识。
- 习:探索、研究、实验、实践技能的过程。
- 本笔记是
指南
还是指北
,需要各位看官自行断决: 半部论语治天下,请自行思考并当下考虑~
- 本人学习、整理的笔记个人YY为比较直观,用词刺眼,如有冒犯,多多见谅。
推荐辅助工具: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是一个开源的Python库,用于自动化Windows GUI(图形用户界面)应用程序。该库提供了简单且强大的接口,可以模拟用户在Windows应用程序中的操作,如点击按钮、输入文本、选择菜单项等。Pywinauto适用于各种类型的Windows应用程序,包括传统的Win32应用程序、基于MFC的应用程序、.NET应用程序以及最新的UWP(通用Windows平台)应用程序。能做什么?
- GUI元素的识别和操作;
- 跨应用程序的自动化;
- 脚本化测试;
- 数据采集与分析;
- 界面操作的宏录制。
零、窗口控件常见分类
控件的分类,才能更好的知道需要用什么方法来控制窗口的控件!例如:
找到窗口之后,使用
window.print_control_identifiers()
(其中 window 就是你找到的窗口赋值的变量),将控制台打印出来的文本复制到一个 .txt 文件里,根据软件上的一些文字等信息参考,找到你需要查找到的控件,代码使用window['我的控件的class_name']
(这个class_name 在 txt 文档里显示的是一个列表,列表里面的东西!但要注意:当查找的控件只有一个的时候,要保证它是唯一性的!)访问它,并且到文档里找对应的控件的方法(也是函数!)注意事项:本总结内容根据所有控件常用且通用的方法进行总结,更多详细的请参考:输入模块类、用户模块类、控件模块 等。
在测试或者自动化程序 GUI 的时候,如果遇到需要(多线程、多进程)多开测试的情况,请注意减少该 GUI 程序窗口的变动,例如:需要在聊天窗口输入文字但是调用输入法这种情况,或者搜索的时候会先弹出一个选择框;其他情况请自行测试。
首先要知道
win32
模式下,鼠标点击、文字输入的时候,可以是静默操作的,在uia
模式下就不一定,当然,还要实际情况测试看看被测试的程序的 GUI 控件是否支持!最好的解决方法:利用 Pywinauto 的backend
参数。本人献丑,写一段自己都看不懂的代码给各位看官笑一笑:from pywinauto import Application from win32gui import FindWindow class SoftWare(Application): def __init__(self, backend="uia"): super().__init__(backend=backend) self.win32_window = None def connect(self, **kwargs): """ :param kwargs: 窗口参数 """ if 'class_name' in kwargs and kwargs['class_name'] is not None: class_name = kwargs['class_name'] else: class_name = "xxxx" if 'title' in kwargs and kwargs['title'] is not None: title = kwargs['title'] else: title = "xxxx" # 注意 FindWindow 找不到显示的窗口,返回可能是 0 !如果没有显示出来的窗口找到不是 0 ,后续的代码要注意加入判断 top_window 的状态是什么,具体参考本文的【五、应用程序窗口操作方法】 handle = FindWindow(class_name, title) # Application() 的 backend 默认 win32 。 win32_window = Application().connect(handle=handle, found_index=0) self.win32_window = win32_window.top_window() return super().connect(handle=handle, **kwargs)
准备工作:
from pywinauto.application import Application
from pywinauto.application import ProcessNotFoundError
class test(Application):
def __init__(self, backend="uia", datafilename=None, allow_magic_lookup=True):
super().__init__(backend=backend, datafilename=datafilename, allow_magic_lookup=allow_magic_lookup)
self.app = None
def connect(self, path, top_win_name=None, timeout=5):
try:
super().connect(path=path, timeout=timeout)
self.app = self.top_window()
except ProcessNotFoundError:
super().start(cmd_line=path, timeout=timeout)
self.app = self[top_win_name]
self.app.wait(wa