pywinuto - click_input() 函数点击树视图的随机节点

pywinuto - click_input() function clicks on random node of tree view

我正在尝试自动化 mmc(控制台中的管理单元)类型的桌面应用程序。我需要扩展树的地方。

尝试 1 - 但是当我使用 expand() 函数时,它会生成错误弹出窗口,提示“子节点不存在”。除非在错误弹出窗口中单击“确定”按钮,否则此脚本只是停止并且控制台上没有错误消息。我怀疑这是因为当树节点展开时它会触发一些事件,该事件将子节点带到它下面,并且 pywinauto 不知何故没有得到这个节点的 Childs。请注意,当手动完成该步骤时,不会出现此错误弹出窗口。

尝试 2 - 当我尝试使用 select() 时,观察到的行为也与上述相同。它生成了相同的错误弹出窗口。

尝试 3 - 我尝试了 click()click_input() 函数,它点击了随机树节点,但没有点击调用它的树节点。

以上都是我的申请,不是public.

为了重现这个问题,我已经在 windows OS 上可用的常见应用程序上进行了尝试。我们可以看到第三个仍然可以重现。

参考代码-

import time
from pywinauto.application import Application
from pywinauto import Desktop

app = Application().start(r'cmd.exe /c "C:\Windows\system32\perfmon.msc"', wait_for_idle=False)
app = Application(backend="win32").connect(title='Performance Monitor', timeout=10)
main_wind = app.window(best_match='MMCMainFrame', top_level_only=False)
console_wind = main_wind.child_window(best_match="MDIClients").child_window(best_match='MMCChildFrm').child_window(class_name="MMCViewWindow")

tree = console_wind.TreeView  # print_control_identifiers()

children = tree.get_item(["Performance","Data Collector Sets"]).expand().get_child("System").expand().get_child('System Diagnostics')
print(children.text())

# below line will select the System Diagnostics
children.select()
time.sleep(4)

# Below line should click on System Diagnostics but it does NOT and same happens for click() function
children.click_input()

任何帮助都将真正有助于了解为什么 click()click_input() 点击随机树节点以及为什么 expand()select() 方法产生非功能性错误弹出窗口?

请提及是否有具体的解决方法。

版本 - Windows OS 10,建造 20H2
Python3.10.4 comtypes 1.1.11
点 22.0.4
pywin32 303
pywinauto 0.6.8
安装工具 61.2.0
六个 1.16.0
车轮 0.37.1

TIA..

我已经参考了一些堆栈溢出和 github 问题跟踪器来解决这个问题,但没有任何效果。

Treeview problem
select() for TreeView items (and similar) leads error if this selection calls other dialogs etc

这都是因为在控制应用程序中使用了不正确的后端 API。不幸的是,我在 win32 API 上进行的 POC 工作正常,因为我手动执行了一些初始步骤,因此我面临的问题(在 try1 中解释)不存在,并且一切正常。

一旦 我将后端切换到 UIA,它就为我以前使用的控件提供了不同的标识符。现在我使用了这个标识符并开始使用 UIA 文档,一切都开始顺利进行。

此外,在我的调查中,没有正确的方法来识别桌面应用程序的后端 API,除非您尝试两者并找出适合您的方法。

给读者的建议 - 如果您使用 win32 API 作为后端,文档中提供了不同的 api 方法。和 UIA 后端不同。仔细阅读文档。