python-3.x - 使用 pywinauto 自动化的 Windows 应用程序不会检测 TreeView 内的元素,尽管这些元素有自己的特征

标签 python-3.x 32-bit pywinauto win32gui inspect.exe

method of tree view Tree structure of spy++我正在自动化的应用程序是一个支持 win32 的后端应用程序,并使用 inform.exe 来检测元素 下面是我的代码尝试单击销售收据元素,在执行时出现错误

代码:screenshot of the treeview in inspect.exe while application image in background

app = Application(backend="win32").connect(process=5468)
app.windows()
dlg = app['TFMenuG.UnicodeClass']
handle = dlg.child_window(control_id='UIA_ButtonControlTypeId (0xC350)').draw_outline()

错误:

Traceback (most recent call last):
  File "c:\..\pythonDemo\notepad.py", line 62, in <module>
    handle = dlg.child_window(control_id='UIA_ButtonControlTypeId (0xC350)').draw_outline()
  File "C:\..\AppData\Local\Programs\Python\Python39-32\lib\site-packages\pywinauto\application.py", line 379, in __getattribute__
    ctrls = self.__resolve_control(self.criteria)
  File "C:\..\AppData\Local\Programs\Python\Python39-32\lib\site-packages\pywinauto\application.py", line 261, in __resolve_control
    raise e.original_exception
  File "C:\..\AppData\Local\Programs\Python\Python39-32\lib\site-packages\pywinauto\timings.py", line 436, in wait_until_passes
    func_val = func(*args, **kwargs)
  File "C:\..\AppData\Local\Programs\Python\Python39-32\lib\site-packages\pywinauto\application.py", line 222, in __get_ctrl
    ctrl = self.backend.generic_wrapper_class(findwindows.find_element(**ctrl_criteria))
  File "C:\..\AppData\Local\Programs\Python\Python39-32\lib\site-packages\pywinauto\findwindows.py", line 87, in find_element
    raise ElementNotFoundError(kwargs)
pywinauto.findwindows.ElementNotFoundError: {'control_id': 'UIA_ButtonControlTypeId (0xC350)', 'top_level_only': False, 'parent': <win32_element_info.HwndElementInfo - '', TFMenuG.UnicodeClass, 196780>, 'backend': 'win32'}

请帮我一种识别元素的方法。我怀疑由于 win32 后端而无法识别这些元素

最佳答案

首先,如果您使用 Inspect.exe,则必须使用 Application(backend="uia")。如果您想检查应用程序与旧版“win32”后端的兼容性,您需要 Visual Studio 中包含的 Spy++。

第二个 control_id 是来自 Spy++ 的整数 ID,每次运行时它可能会不一致。我建议通过 print([w.window_text() for w in app.windows()]) 打印顶级窗口文本,并使用必要的文本来识别顶级窗口并转储子标识符:

app.window(title="Main Window Title").dump_tree() # or use title_re for regular expression
app.window(title="Main Window Title").child_window(title="Sales Receipts", control_type="TreeItem").draw_outline().click_input()
# or get .wrapper_object() and discover all available methods,
# wrapper methods can be chained as above

附注如果 Inspect.exe 不显示属性“NativeWindowHandle”,则意味着该元素对“win32”后端不可见。


编辑1:

对“win32”TreeView 尝试以下代码,该代码不会自动检测为 TreeViewWrapper:

from pywinauto import Application
from pywinauto.controls.common_controls import TreeViewWrapper

app = Application(backend="win32").connect(class_name="TFMenuG.UnicodeClass")
dlg = app['TFMenuG.UnicodeClass']
handle = dlg.child_window(class_name='THTreeView.UnicodeClass').wrapper_object().handle
tree_view = TreeViewWrapper(handle)
print(dir(tree_view)) # list all available methods

tree_view.get_item("Sales Receipts").expand()
tree_view.get_item(r"Sales Receipts\Reports").click(where="text")

当您看到所有可用方法时,请尝试“win32”TreeView 的记录方法:https://pywinauto.readthedocs.io/en/latest/code/pywinauto.controls.common_controls.html#pywinauto.controls.common_controls.TreeViewWrapper请注意,get_item(...) 返回的 _treeview_element 对象表示没有窗口句柄的特定项目,但它是可用的。

关于python-3.x - 使用 pywinauto 自动化的 Windows 应用程序不会检测 TreeView 内的元素,尽管这些元素有自己的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67534751/

相关文章:

linux - 32 位 RHEL 机器上的内存使用

pywinauto - 是否可以使用 pywinauto 将数据发送到最小化窗口?

python - Pywinauto:无法将窗口带到前台

python - 如何在 python 中关闭 udp 套接字

python - 如何将四列excel数据作为pandas中的两行

java - 使用 Integer.parseInt 转换 32 位二进制字符串失败

64-bit - 如何以编程方式检测 64 位或 32 位机器?

python - 使用 pywinauto 自动化 wbemtest

python-3.x - 如何在没有排序的情况下获得最大的行?

python - 无法将 xgboost 添加到 pyinstaller