如何区分pywi​​nauto上的两个控件

How to differentiate two controls on pywinauto

我正在尝试使用 pywinauto 创建宏生成器。我正在开发两个应用程序,宏记录器和宏播放器。记录器监视每个鼠标和键盘事件,然后将其保存到 json 文件,以便宏播放器能够重新创建事件。

当用户单击某个元素时,记录器会使用以下代码转换该鼠标坐标 UIAWrapper

def coords_to_UIAWrapper(coords):
    x, y = coords
    elem = IUIA().iuia.ElementFromPoint(tagPOINT(x, y))
    element = UIAElementInfo(elem)
    wrapper = UIAWrapper(element)
    return wrapper

然后记录器将事件和 wrapper.window_text() 保存在 json 文件中,如下所示:

{
    "events": [
        {
            "device": "mouse",
            "action": "press",
            "text": "<TODOS>"
        },
        {
            "device": "mouse",
            "action": "release",
            "text": "<TODOS>"
        }
    ]
}

这是按钮的图像:

但是现在问题出现了,因为程序有多个按钮 window_text 等于 <TODOS>:

区分元素 我以为我可以使用以下属性(inspect.exe):AutomationId, ClassName, RuntimeId, Name, LocalizedControlType,但是LocalizedControlType, ClassNAme and Name是所有按钮都相同,每次我打开应用程序时 AutomationId and RuntimeId 都是不同的。那么,我如何区分两个元素,以便能够序列化事件并将其复制到宏播放器中。

有趣的作品!我们正在开发将成为 pywinauto 一部分的脚本记录器(可见的拉取请求将很快创建)。您可以在这里查看架构:'recorder/event_patterns' branch in the fork. I would like to invite you to the discussion soon. Some help would be great. There are still many issues in milestone pywinauto 0.7.0

解决您的问题的主要想法是保留整个 UI 树以及所有 parent 和 children。如此完整的 window 规范可能有助于通过 parent 区分按钮。 best_match 算法中还有其他规则来分隔事物:Getting Started Guide -> How to know magic attribute names.