如何更改 PyWinAuto 中控件的后端?

问题描述 投票:0回答:1

我正在自动化一个适用于旧技术的应用程序。我对它是如何制作的了解不多,但我正在尝试自动化其中的一些流程。为此,我将

pywinauto
win32
后端一起使用,因为当我尝试检测应用程序中的某些窗口时,
uia
后端无法正常工作。

现在我的系统中出现了一个问题,我无法正确检测单选按钮的选中/选中状态,因此为了解决这个问题,经过多次尝试,我尝试将背面改回

uia
,看看是否可以可以检测状态,它终于起作用了,我能够看到状态。

但现在的问题是我的脚本停止在窗口检测部分工作,我在开始时收到错误(我开始使用

win32
的原因)。

我尝试使用

control.backend.activate("uia")
(参考)[https://pywinauto.readthedocs.io/en/latest/code/pywinauto.backend.html#pywinauto.backend.activate] 更改单个控件的后端,以便休息我的脚本与
win32
一起使用,但它抛出一个错误,指出激活函数不存在。
AttributeError: 'BackEnd' object has no attribute 'activate'

现在要解决这个问题,我能想到的唯一解决方案是初始化两个具有不同后端的应用程序,并在我需要

uia
而不是
win32
时从它们获取不同的控件,反之亦然。 (参考)[https://stackoverflow.com/questions/54227419/apps-with-win32-and-uia-pywinauto]但我真的不想这样做,那么有没有办法选择/激活后端无需初始化另一个应用程序即可获得控件?

编辑:在 @IInspectable 的评论之后,我意识到

backend.activate("uia")
不适用于我的控件,因为它是应用程序属性而不是控件属性,我很困惑,因为控件也有一个可以为您提供详细信息的后端属性您正在使用的后端。所以这个功能不起作用,除此之外,如果有人有任何想法请分享。

python winapi ui-automation pywinauto
1个回答
0
投票

不同的后端对每种控件类型有不同的包装器实现。并且没有在

uia_controls.ButtonWrapper
win32controls.ButtonWrapper
之间切换的机制(名称可能不准确,因为我是凭记忆输入的)。也许最好用
"uia"
后端来描述你的窗口检测问题?我可以尝试帮助解决。最有可能的是它是可以解决的。另外
"win32"
ButtonWrapper 有方法 get_check_state,也许这就是你所需要的。 “win32”控件包装器通常具有非常丰富的方法集,其中一些甚至创建诸如
ListViewWrapper.get_item
之类的虚拟控件对象,它用自己的方法间接创建
_listview_item
对象。因此,解决方案几乎不依赖于特定的控制类型和应用程序实现。

附注我的留言太长,无法发表评论。当我们找出最终解决方案时,我可以稍后编辑这个答案。

© www.soinside.com 2019 - 2024. All rights reserved.