使用 pywinauto 自动化的 Windows 应用程序不会检测到 TreeView 中的元素,尽管这些元素有自己的特征

     2023-02-21     263

关键词:

【中文标题】使用 pywinauto 自动化的 Windows 应用程序不会检测到 TreeView 中的元素,尽管这些元素有自己的特征【英文标题】:The windows application automating using pywinauto does not detect elements inside a TreeView, despite the elements have there own characteristic 【发布时间】:2021-05-14 12:57:47 【问题描述】:

我正在自动化的应用程序是一个支持win32的后端应用程序,并使用inspect.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 后端无法识别元素

【问题讨论】:

【参考方案1】:

首先,如果您使用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 对象表示没有窗口句柄的特定项目,但它是可用的。

【讨论】:

感谢@VasilyRyabov 1) 后端'Application(backend="uia")' 无法识别应用程序。当我尝试使用 spy++ 进行检查并使用代码 'app = Application(backend="win32").connect(class_name="TFMenuG.UnicodeClass") app.windows() dlg = app['TFMenuG.UnicodeClass'] handle = dlg .child_window(class_name='THTreeView.UnicodeClass').wrapper_object()' 它打印 'hwndwrapper.HwndWrapper - '', THTreeView.UnicodeClass' 当我尝试点击 dlg.child_window(class_name='THTreeView.UnicodeClass').click() 时,它只是点击了树中的第一个元素,即销售脚本,它没有显示我单击树的子元素的另一个属性。在问题中附上 spy++ 中树结构的屏幕截图。有没有办法点击树上的其他元素。谢谢 我可以建议用 TreeViewWrapper 明确包装“win32”元素的方法。请参阅更新的答案。虽然没有保证。请让我知道它是否有效。我可以通过class_name在自动检测列表中再添加一个正则表达式。 我尝试print (tree_view.print_items()) 打印每个树视图的整个树结构,包含所有元素名称。此外,当我尝试执行 tree_view.select("\Sales receipts\Sales")` 时,它会突出显示销售收据下的销售。但是当我尝试做tree_view.get_item("\Sales Receipts").expand() tree_view.get_item(r"\Sales receipts\Sales").click(where="Sales") 时,我得到错误` raise RuntimeError("Area ('') not found for this tree view item".format(where)) RuntimeError: Area ('Sales') not found for this树视图项`。不确定我错过了什么。请帮忙。谢谢—— 通过使用tree_view.get_item("\Sales receipts\Sales").get_child("Enter receipt").select() 选择树视图解决了这个问题。关闭此线程

使用 PyWinAuto 控制 Windows 应用程序 (HMA ***)

】使用PyWinAuto控制Windows应用程序(HMA***)【英文标题】:ControlWindowsapp(HMA***)usingPyWinAuto【发布时间】:2021-12-1019:30:15【问题描述】:我正在尝试编写Python代码来请求我的***软件在某些条件下连接/断开连接。我使用HMA***并在Windows10... 查看详情

pywinauto处理ui自动化

pywinauto处理UI自动化Python的pywinauto模块来处理Windows控件的UI操作。 1.首先搭建pywinauto环境。 1).可以参考vncdotool-AcommandlineVNCclient安装python2.7.5,Twisted和PIL。 2).安装elementtree(elementtree-1.2.7-20070827-preview.win32.exe)和ctype... 查看详情

pywinauto桌面应用自动化01--安装和启动(代码片段)

目录一、安装Pywinauto二、定位元素的工具三、启动和连接应用程序1、启动应用程序2、连接已经打开的应用程序1)通过进程号连接2)通过窗口句柄连接一、安装Pywinautopipinstallpywinauto官方文档:Whatispywinauto—pywinauto0.6.... 查看详情

如何离线安装python模块?比如windows下ui自动测试模块pywinauto

...不到独立安装包。先安装python2.7后,上pypi.python.org下载了pywinauto-0.5.4.zip,解压后,运行setup.py,报告Noez_setup.py,又搜了一下网上下载了个ez_setup.py,运行时候又提示urllib2.URLError:<urlopenerror[SSL:CERTIFICATE_VERIFY_FAILED]certificateverifyfai... 查看详情

python+pywinauto写自动化测试脚本时,怎么获取windows软件页面元素按钮啊?刚开始用这个不太明白?

Win32APIbackend=win32-一个默认后端现在MFC,VB6,VCL,简单的WinForms控件和大多数旧的旧应用程序MSUI自动化backend=uiaWinForms,WPF,Store应用程序,Qt,浏览器参考技术A这个问题很专业,百度相关贴吧里应该有高手的专业回答。 参考技术B... 查看详情

用pywinauto实现qt自动化(代码片段)

我试图使用pywinauto自动化一个QT应用程序,问题是pywinauto似乎无法点击或选择大多数对象,当它这样做,他们似乎是完全随机的那些我指定。即使使用诸如"点击输入"正确执行,但项目从未被实际点击。Pywinauto显然能够识别我试... 查看详情

windowsgui程序自动化之pywinauto

WindowsGUI程序自动化之pywinauto一.pywinauto的安装与配置  官方英文版文档网址:https://pywinauto.readthedocs.io/en/latest/index.html  >>>>>>待续   查看详情

pywinauto获取到的下拉框数据数据不是想要的数据,该怎么处理?

pywinauto获取到的下拉框数据数据不是想要的数据,使用inspect.exe工具查看到的列表数据不在所用的应用下边,这种该怎么处理?使用print_control_identifiers()获取到的控件信息入下图:刚刚学习pywinauto怎么使用,忘指导。。。还好哈... 查看详情

python自动化框架:pywinauto实现博客之星自动化评论(代码片段)

...而复始。今天咱不讲爬虫,讲python的自动化测试框架pywinauto如何实现模拟手动操作(相同的还有pyAutoGui这个库),制造一个有血有肉的回复机器,爬虫的方式太暴力了,除了反爬外,还会给官方带来大... 查看详情

pywinauto客户端自动化---窗口进行截图(代码片段)

...么在做客户端的时候,应该怎么进行截图呢?窗口截图在pywinauto中存在自带的截图函数 capture_as_image() 源码:defcapture_as_image(self,rect=None):"""ReturnaPILimageofthecontrol.SeePILdocumentationtoknowwhatyouca 查看详情

python自动化框架:pywinauto实现博客之星自动化评论(代码片段)

场景:2021年度博客之星开始评选了,又是各路豪杰实践自身技术能力的时刻,平时都是写文章维护粉丝好友度,现在才是实打实的展现技术😃本分只是python框架的实践,不建议恶意推广,后果自负。... 查看详情

python自动化框架:pywinauto实现博客之星自动化评论(代码片段)

场景:2021年度博客之星开始评选了,又是各路豪杰实践自身技术能力的时刻,平时都是写文章维护粉丝好友度,现在才是实打实的展现技术😃本分只是python框架的实践,不建议恶意推广,后果自负。... 查看详情

聊聊pc端自动化最佳方案-pywinauto(代码片段)

...化最佳方案-WinAppDriver有小伙伴后台给我留言,说「 pywinauto」作为WinAppD 查看详情

pywinauto使用

...的例子(以下代码均在英文操作系统上测试通过:12345frompywinautoimportapplicationapp=application.Application.start("notepad.exe")app.Notepad.MenuSelect("Help->AboutNotepad")app.AboutN 查看详情

pywinauto - 动态控制总是列在 print_control_identifiers()

】pywinauto-动态控制总是列在print_control_identifiers()【英文标题】:pywinauto-dynamiccontrolalwayslistedinprint_control_identifiers()【发布时间】:2020-10-2909:21:20【问题描述】:我正在尝试自动化连接和断开Internet的程序。因此,在一个窗口中,... 查看详情

pywinauto使用方法(代码片段)

3Pywinauto使用连接为http://pywinauto.github.io/3.1 关联到一个应用,用以下方法:?start_(path)connect_(handle or processID)以下是示例代码app=Application()app.start_(“notepad.exe”)app.connect_(path=r"c:windowssystem32otepad.exe")app.connect_(process=... 查看详情

使用 pywinauto 获取窗口参数(上、下、右、左)

】使用pywinauto获取窗口参数(上、下、右、左)【英文标题】:Gettingwindowparameterswithpywinauto(Top,Bottom,Right,Left)【发布时间】:2016-10-1110:25:35【问题描述】:使用pywinauto(Top,Bottom,Right,Left)获取窗口参数我已经设法使用以下sn-p获取这... 查看详情

pywinauto:如何在不接受 SendKeys 的 ListView 上发送 Keys?

】pywinauto:如何在不接受SendKeys的ListView上发送Keys?【英文标题】:pywinauto:howtoSendKeysonaListViewwhichdoesn\'tacceptSendKeys?【发布时间】:2017-03-0117:58:53【问题描述】:我确实从列表中选择了一个项目(使用下面的代码),我现在需要... 查看详情