无法访问 pywinauto 的 hwndwrapper 中的 windows 控件(包装器 class

Unable to access windows controls inside pywinauto's hwndwrapper (wrapper class

我是 python 和 pywinauto 的新手。尝试使用 SWAPY 在 pywinauto.controls.hwndwrapper.hwndwrapper 内设置或获取文本框(windows 控件)的文本,我有 Class 包装器名称 class。如何在 pywinauto 中使用 class 名称(如 Afx:633C0000:1008)访问包装器 class 内的控件?

import pywinauto
import pywinauto.controls
from pywinauto.application import Application
app = Application().Connect(title=u'SAP', class_name='SAP_FRONTEND_SESSION')
sapfrontendsession = app.SAP
afxe = sapfrontendsession[u'Afx:633C0000:1008']

pywinauto 提供了一个基于 WindowSpecification 和包装器的 2 级概念。 Window 规范只是一个描述,一组搜索所需控件的条件(创建 WindowSpecification 时可能不存在)。如果找到,则为真正存在的控件创建具体的包装器。在 IDLE 控制台中它看起来是这样的:

>>> app.RowListSampleApplication
<pywinauto.application.WindowSpecification object at 0x0000000003859B38>
>>> app.RowListSampleApplication.wrapper_object()
<pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004ADF780>

Window 规范最多可以有 2 个级别:app.WindowName.ControlName。可以指定更详细的搜索条件:

app.window(title=u'SAP', class_name_re='^Afx:.*$')
app.SAP.child_window(class_name='Edit')

可能的 window/child_window 参数与 find_elements 中列出的相同。


P.S。出色的 Python 功能可以在生产代码中隐藏 wrapper_object() 方法调用,因此您需要调用它仅用于调试目的。例如,这些语句是等价的(做同样的事情):

app.WindowName.Edit.set_text(u'text')
app.WindowName.Edit.wrapper_object().set_text(u'text')

但是下面的语句return不同对象:

app.WindowName.Edit # <WindowSpecification>
app.WindowName.Edit.wrapper_object() # <EditWrapper>