Pywinauto-0.6.8等待 电脑端软件GUI鼠标键盘Python自动化办公、测试、重复性工作制定库

转眼间学 Python 也有接近 4 年的事情了。
自从学了这门所谓的编程语言之后,一切皆对象的思维方式影响了我的工作、生活,顺带着影响着人生观等。所以说,专注一件事情的同时,顺带着把其他的一些东西醒悟了,这也算是一件圆满的答复吧。

  • 本人学习、整理的笔记个人YY为比较直观,用词刺眼,如有冒犯,多多见谅。

网上介绍 Python 的太多,我就用最实际的来说:我个人认为硬件技术的发展使得目前的硬件问题变得性能过剩,加上最近几年网上大多数“专家”也发现了摩尔定律可能性或者存在被打破的规律,so,不用多说,学 Python 还是学 other 那是需求者要说的事情;假设你不喜欢蛋糕,每天路过一个蛋糕店,且这个蛋糕店能让你免费领取、试吃新鲜刚做好蛋糕,对于你自己而言,东西再好、免费也是白搭。所以说,一门技术对于一个人来说,最重要的第一点是用途,其次就是易学、易用。
与我来说,Python 在我实际当中本就有实现的用途,其次就是易学与易用。
那么本文的主角 Pywinauto 顾名思义,就是利用 Python 在电脑上进行软件的 GUI 自动化,模拟人工操作;那么,你的流程可以先这样:

  1. 利用面向对象的思维方式,先将重复性且有规律的工作内容进行分类;
  2. 利用流程思维(思维导图的方式)将工作类进行流程设计(面向过程);
  3. 使用 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 建议右击 - 发送到 - 桌面快捷方式 。


GUI 应用程序行为通常不稳定,您的脚本需要等待,直到出现新窗口或关闭/隐藏现有窗口。pywinauto 可以灵活地隐式(使用默认超时)或显式等待对话框初始化,使用专用方法/函数来帮助您使代码更轻松、更可靠。

应用方法


  • wait_cpu_usage_lower

    (pywinauto 0.5.2 中的新功能,0.6.0 中重命名)

此方法对于多线程接口非常有用,这些接口允许在另一个线程中进行延迟初始化,而 GUI 是响应式的,并且所有控件都已存在并且似乎可以使用。因此,等待特定窗口的存在/状态是没有用的。
在这种情况下,整个过程的 CPU 使用率表明任务计算尚未完成。

Example:

app.wait_cpu_usage_lower(threshold=5) # wait until CPU usage is lower than 5%

注意:此方法仅适用于整个应用程序进程,不适用于窗口/元素。

WindowSpecification


这些方法可用于所有控件。

  • wait
  • wait_not

WindowSpecification 对象不一定与现有窗口/控件相关。这只是一个描述,即搜索窗口的几个标准。该 wait 方法(如果没有引发任何异常)可以保证目标控件存在,甚至可见、启用和/或处于活动状态。

模块中的 timings 函数


还有一些低级方法对任何 Python 代码都很有用。

  • wait_until
  • wait_until_passes

装饰器 pywinauto.timings.always_wait_until()pywinauto.timings.always_wait_until_passes() 如果每个函数调用都应该有时序控制,也可以使用。

# call ensure_text_changed(ctrl) every 2 sec until it's passed or timeout (4 sec) is expired

@always_wait_until_passes(4, 2)
def ensure_text_changed(ctrl):
    if previous_text == ctrl.window_text():
        raise ValueError('The ctrl text remains the same while change is expected')

所有操作的全局计时


许多操作在之前、之后和中间都需要一些暂停。模块 timings 中有几个全局常量来定义这种停顿。它可以通过在 object timings.Timings 中设置全局静态变量来单独调整您的需求。

所有全局计时可以一次设置为默认值,也可以加倍,也可以除以二:

from timings import Timings

Timings.defaults()
Timings.slow() # double all timings (~2x slower script execution)
Timings.fast() # divide all timings by two (~2x faster)

识别控件


帮助您找到所需控件的方法。

  • print_control_identifiers
  • draw_outline
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ょ镜花う水月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值