Работа с дочерними окнами в pywinauto
Не могу получить доступ к дочерним окнам. Взял для примера окно консоли в PyCharm. Если оно Docked, то окно не находится среди дочерних элементов:
app.window().print_control_identifiers() Control Identifiers: Dialog - 'PremiereVideoConstructor – startGUI.py' (L-9, T-9, R1929, B1039) ['Dialog', 'PremiereVideoConstructor – startGUI.pyDialog', 'PremiereVideoConstructor – startGUI.py'] child_window(title="PremiereVideoConstructor – startGUI.py", control_type="Window") | | TitleBar - '' (L0, T-6, R1920, B0) | ['TitleBar'] | | | | Menu - 'Система' (L0, T0, R28, B28) | | ['Система', 'Menu', 'СистемаMenu', 'Система0', 'Система1'] | | child_window(title="Система", auto_id="MenuBar", control_type="MenuBar") | | | | | | MenuItem - 'Система' (L0, T0, R28, B28) | | | ['Система2', 'MenuItem', 'СистемаMenuItem'] | | | child_window(title="Система", control_type="MenuItem") | | | | Button - 'Свернуть' (L0, T0, R0, B0) | | ['Button', 'Свернуть', 'СвернутьButton', 'Button0', 'Button1'] | | child_window(title="Свернуть", control_type="Button") | | | | Button - 'Восстановить' (L0, T0, R0, B0) | | ['Button2', 'Восстановить', 'ВосстановитьButton'] | | child_window(title="Восстановить", control_type="Button") | | | | Button - 'Закрыть' (L0, T0, R0, B0) | | ['Button3', 'ЗакрытьButton', 'Закрыть'] | | child_window(title="Закрыть", control_type="Button")
Если открепить окно, то находится элемент Pane:
app.window().print_control_identifiers() Control Identifiers: Dialog - 'PremiereVideoConstructor – startGUI.py' (L-9, T-9, R1929, B1039) ['Dialog', 'PremiereVideoConstructor – startGUI.pyDialog', 'PremiereVideoConstructor – startGUI.py'] child_window(title="PremiereVideoConstructor – startGUI.py", control_type="Window") | | Pane - 'Python Console' (L49, T295, R1914, B899) | ['Python ConsolePane', 'Python Console', 'Pane'] | child_window(title="Python Console", control_type="Pane") | | TitleBar - '' (L0, T-6, R1920, B0) | ['TitleBar'] | | | | Menu - 'Система' (L0, T0, R28, B28) | | ['Система', 'Menu', 'СистемаMenu', 'Система0', 'Система1'] | | child_window(title="Система", auto_id="MenuBar", control_type="MenuBar") | | | | | | MenuItem - 'Система' (L0, T0, R28, B28) | | | ['Система2', 'MenuItem', 'СистемаMenuItem'] | | | child_window(title="Система", control_type="MenuItem") | | | | Button - 'Свернуть' (L0, T0, R0, B0) | | ['Button', 'Свернуть', 'СвернутьButton', 'Button0', 'Button1'] | | child_window(title="Свернуть", control_type="Button") | | | | Button - 'Восстановить' (L0, T0, R0, B0) | | ['Button2', 'Восстановить', 'ВосстановитьButton'] | | child_window(title="Восстановить", control_type="Button") | | | | Button - 'Закрыть' (L0, T0, R0, B0) | | ['Button3', 'ЗакрытьButton', 'Закрыть'] | | child_window(title="Закрыть", control_type="Button")
Но сделать с ним ничего не могу: не могу получить доступ к его дочерним элементам. Это невозможно в принципе, или я что-то не так делаю? Пайчарм использовал для примера. Бэкенд uia.
Ответы (1 шт):
Pane - это боль (pain). Обычно не автоматизируется в деталях. Но вообще консоль тоже через GUI никак и никогда не автоматизируется. Если нужно команду запустить и считать output, то надо использовать встроенный модуль subprocess
и класс Popen
(процесс), у которого можно читать stdout и stderr. Это единственно правильный путь для подобных случаев. Если нужно environment, специфический для PyCharm, то всегда можно руками сдампить его из консоли PyCharm и выставить отдельно в os.environ
(ведёт себя как словарь) в скрипте, который уже запустит subprocess.Popen
с этими переменными окружения (они наследуются дочерним процессом, хотя вроде это можно поменять).