Использование pywinauto для чтения значения в окне и использования в функции

Я строю сценарий автоматизации с использованием Python с использованием Pywinauto, и я нахожусь в тупике на этой части. Пока я могу запустить приложение или подключиться к нему. Я переключал окна в интерфейсе, и теперь ему нужно каким-то образом прочитать значение и сравнить его с содержимым CSV-файла и продолжить работу с дополнительными функциями. Приложение имеет несколько окон, и одно из них использует интерфейс типа электронных таблиц. Там нет функции поиска / замены, иначе я мог бы просто использовать это.

Теперь приходит вызов. Он должен "видеть" строку внутри ячейки, и я легко могу сделать это, используя AccExplorer или Inspect.exe. Это структура ячеек в приложении с выбранным элементом "CAM 2". Пример ячейки из приложения

Окно AccExplorer, показывающее результаты ячейки. И это результат, предоставленный AccExplorer. Красный кружок указывает "значение", которое я хочу найти и использовать для сравнения. (Я обнаружил, что поиск этой темы по "значению" приводит к слишком расплывчатым ответам, а не к моей буквальной необходимости найти значение "значения" в этом случае.)

Используя этот код в моем скрипте, передавая класс окна, предоставленного инструментом AccExpolorer (красная стрелка для класса)

edit = wdow['WindowsForms10.Window.8.app.0.378734a'] 
props = edit.GetProperties() 
print(props)

Он не возвращает поле "Значение" или его свойство в этом случае должно быть "Cam 2"

{'class_name': 'WindowsForms10.Window.8.app.0.378734a',
 'friendly_class_name': 'WindowsForms10.Window.8.app.0.378734a', 
'texts': [''], 'control_id': 1639674, 'rectangle': <RECT L0, T47, R1366, B746>, 
'is_visible': True, 'is_enabled': True, 'control_count': 76, 'style': 1442906112, 
'exstyle': 65536, 'user_data': 0, 'context_help_id': 0, 
'fonts': [<LOGFONTW 'MS Shell Dlg' -11>], 
'client_rects': [<RECT L0, T0, R1366, B699>], 
'is_unicode': True, 'menu_items': []}

Я довольно новичок в Python (и в программировании в целом), но у меня все получалось хорошо понять, все это. Я знаю о бэкэнде, который мне не повезло с использованием UIA, и он, кажется, работает до сих пор с настройками по умолчанию. Кроме того, я попытался использовать SWAPY, и он отображает множество имен классов в виде дубликатов и не показывает этот уровень значений ячеек напрямую.

Главный вопрос: что бы я делал неправильно, чтобы получить эти данные, или это вообще возможно? Я открыт для любых предложений или даже использования других библиотек. Я просто подумал, что это будет самым чистым и простым. Спасибо!

1 ответ

Для начала прочитайте руководство по началу работы и посмотрите некоторые примеры

Вы выбираете не лучший способ получить ячейку DataGridView, попробуйте использовать для этого бэкэнд UIA

from pywinauto import Desktop

dlg = Desktop(backend="uia")["YourApplicationName"]

# use that function for found your DataGridView
#dlg.print_control_identifiers()
datagrid = dlg.DataGridView

# use for found some particular cell
#datagrid.print_control_identifiers()

# in my case it was DataItem
cell = dlg.DataGridView.DataItem

# way to get item value
print(cell.legacy_properties()['Value'])

Вы также можете использовать индексы для выбора из множества одинаковых ячеек, таких как "DataItem0" или получить все ячейки, используя лямбду:

cells = [child for child in datagrid.descendants() if child.element_info.control_type == "DataItem"]
for cell in cells:
    print(cell.legacy_properties()['Value'])
Другие вопросы по тегам