等待窗口出现并发送按键- pywinauto

8

我正在尝试编写一个小函数,使它能够等待某个窗口出现,然后发送一个按键(alt + i)。我一直试图使用pywinauto来实现这一点,但是没有成功。根据文档中的说明,我可以使用以下方法:

pywinauto.application.WindowSpecification.Exists()

但我只是不明白如何指定我要查找的内容,可以使用窗口标题或进程名称,但找不到一个好的解释。

此外,除了pywinauto之外,是否有更好或更容易使用的模块? 我不需要进行复杂的自动化,只需等待窗口并发送一些按键。

编辑

好的,我找到了一个解决方案,一个简单的函数会循环无限次。

 def auto_accept(*args):
    while True:
        try:
            app = pywinauto.Application()
            app.window_(title='Untitled - Notepad').SetFocus()
            app.window_(title='Untitled - Notepad').TypeKeys("{1}{2}{3}")
        except (pywinauto.findwindows.WindowNotFoundError, pywinauto.timings.TimeoutError):
            pass

但是现在我总是收到一个警告,像"2015-07-13 12:18:02,887 信息: 向记事本键入文本:{1}{2}{3}",我无法使用警告模块过滤它们,是否有另一种方法可以过滤或禁用它们?这是个问题,因为当我使用py2exe创建一个exe文件后,程序关闭后它告诉我有错误,但唯一的错误是我从sendkeys获得的警告。

1个回答

7
您可以简单地使用wait/wait_not方法来操作WindowSpecification对象:
from pywinauto.application import Application
app = Application(backend="win32").start('executable')
app.WindowSpecification.wait('enabled').type_keys('%i') # % - alt, ^ - ctrl

WindowSpecification 可以设置更多细节:

app.window(title='Title', class_name='#32770')
window() 方法的所有参数与 find_elements 函数相同(此底层函数不建议直接使用)。
对于长时间操作,您可以为单个等待设置超时时间:wait('enabled', timeout=20) 或者全局设置每个 wait 的超时时间:Timings.window_find_timeout = 10
编辑:在导入 pywinauto 后调用此代码以禁用日志记录。
import logging
logger = logging.getLogger('pywinauto')
logger.level = logging.WARNING # or higher

日志级别:

Level Numeric value 
CRITICAL 50 
ERROR 40 
WARNING 30 
INFO 20 
DEBUG 10 
NOTSET 0 

谢谢,但我找到了一个可行的解决方案。另外,我该如何禁用发送按键时收到的警告?我总是会收到类似“2015-07-13 12:18:03,100 INFO:向记事本键入文本:{1} {2} {3}”这样的警告,而且我无法使用警告模块过滤它们。 - Alex Zel
因为这是日志记录模块的内容。更新答案以涵盖此内容。 - Vasily Ryabov
pywinauto 0.5.1将拥有一个文档化的快捷方式:pywinauto.actionlogger.disable(),感谢使用案例。 - Vasily Ryabov
1
有没有一种方法可以永远等待?我的对话框是外部创建的。目前正在使用一个非常大的值。 - MrR
另一种方法要复杂得多。您需要在 WM_CREATE 事件上挂钩。这不能用几个词来解释。我们计划在 pywinauto 中实现一个不错的挂钩 API,但预计完成时间未知。 - Vasily Ryabov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接