Как различить два элемента управления на 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 меняются каждый раз, когда я открываю приложение. Итак, как я могу различать два элемента, чтобы иметь возможность сериализовать событие и воспроизвести его в макроплеере.


person Caaarlos    schedule 15.01.2019    source источник
comment
Что вы думаете о нашей реализации регистратора сценариев? Планировали ли вы внедрить проприетарный макрорекордер или с открытым исходным кодом?   -  person Vasily Ryabov    schedule 27.01.2019
comment
Нам пришлось раскачать наш проект, сейчас мы делаем скрипт, который показывает информацию о нажатом элементе, чтобы облегчить использование Pywinauto. Это будет скрипт с открытым исходным кодом   -  person Caaarlos    schedule 28.01.2019


Ответы (1)


Интересная работа! Мы работаем над устройством записи сценариев, которое станет частью pywinauto (скоро будет создан видимый запрос на включение). Вы можете ознакомиться с архитектурой здесь: 'recorder/event_patterns' ветка на развилке. Я хотел бы пригласить вас к обсуждению в ближайшее время. Некоторая помощь была бы здоровой. В milestone pywinauto 0.7.0 все еще много проблем.

Основная идея решения вашей проблемы - сохранить все дерево пользовательского интерфейса со всеми родителями и детьми. Таким образом, полная спецификация окна может помочь различать кнопки по родителю. В алгоритме best_match есть и другие правила для разделения вещей: Руководство по началу работы -> Как узнать имена магических атрибутов.

person Vasily Ryabov    schedule 20.01.2019
comment
Да, я думал, что мне нужно будет использовать что-то, связанное с родительским/дочерним индексом. Поэтому каждый раз, когда я нажимаю на элемент, я сохраняю его имя, control_type и его иерархию. - person Caaarlos; 28.01.2019
comment
Я ценю ваше приглашение. Я хотел бы принять участие в обсуждении. - person Caaarlos; 28.01.2019
comment
Запрос на вытягивание открыт: github.com/pywinauto/pywinauto/pull/701 Рекордер работает в приложении WPF, кроме меню. Это своего рода альфа-прототип, но основные моменты архитектуры уже доработаны. - person Vasily Ryabov; 14.04.2019