# фон
Поскольку в проекте используется программа автоматизации настольных приложений, я хочу изучить, как автоматизировать настольные приложения, и вот следующее.
Автоматизация настольных приложений, которая осуществлялась до сих пор, является относительно проблематичной, а данные недостаточно полными.Потому что многие сталкиваются с автоматизацией настольных приложений,Многие из них просто перестали это делать.
Официальный сайт pywinauto Документация на китайском языке
pip install pywinauto
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")
Сейчас я общаюсь с ua
В Pywinauto есть два типа бэкэндов: win32 и uia.,По умолчанию — Win32. Вы можете использовать инструменты spy++ и Inspect, чтобы определить, какой бэкэнд подходит для написания.
Например: при использовании режима UIA Inspect.,Более видимые элементы управления и свойства,серверная часть (необязательный интерфейс пользовательского интерфейса),Напротив,бэкэнд не обязателен для Win32.
Я пока использовал только Inspect
Spy++ (инструмент поиска элемента (win32))
Осмотреть (инструмент «Найти элемент» (uia))
UI Spy (инструмент «Найти элемент»)
Swapy (может легко генерировать код pywinauto)
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")
В этом случае метод start не может запустить приложение, поэтому я использовал os.system для запуска приложения.
# coding=utf-8
"""
@project: automation_tools
@Author:gaojs
@file: admin_test.py
@date:2022/10/9 9:51
@blogs: https://www.gaojs.com.cn
"""
import time
import os
from pywinauto import application
app = application.Application(backend="uia")
# Откройте программу CAAdmin. Поскольку другие методы не удалось запустить, для ее запуска здесь используется os.system.
os.system("e: && cd E:\\NetCertCAAdmin_6\\ && chdir && CAAdmin.exe")
app.start(r"E:\NetCertCAAdmin_6\CAAdmin.exe")
time.sleep(5)
# app.connect(title='Забронировать встречу')
app.connect(title_re="Infosec", class_name="SWT_Window0")
app.window(title_re="Infosec", class_name="SWT_Window0").print_control_identifiers()
app.window(title_re="Infosec").menu_select("действовать -> конфигурация")
time.sleep(5)
# app.window(title_re="Infosec").child_window(title="Имя драйвера:")["gaojs_test"].click()
# app.window(title_re="Информационная безопасность")["Вход"].click()
app.window(title_re="Infosec").Button3.click()
# app.window(title_re="Infosec").Button6.click()
# Найдите методы управления на уровнях
window(**kwargs) # Поиск окон
child_window(**kwargs) # Вы можете игнорировать иерархию и найти квалифицированный элемент в потомках.===>【Чаще всего используется】
parent() # Возвращает родительский элемент этого элемента, без параметров
children(**kwargs) # Возвращает список квалифицированных дочерних элементов, поддерживает индексацию и является объектом (или подклассом) BaseWrapper.
iter_children(**kwargs) # Возвращает итератор дочерних элементов, который является объектом (или подклассом) BaseWrapper.
descendants(**kwargs) # Возвращает список всех элементов-потомков, соответствующих условиям, который является объектом (или подклассом) BaseWrapper.
iter_children(**kwargs) # Итератор квалифицированных элементов-потомков,даBaseWrapperобъект(или подкласс)---> Сомнительно, iter_descendants?
# Обычно используется
class_name=None, # Имя класса
class_name_re=None, # Обычный матч класса
title=None, # Текст заголовка элемента управления, соответствующий полю «Имя» в проверке.
title_re=None, # Обычный текст соответствия
control_type=None, # Тип элемента управления, английское название поля LocalizedControlType в интерфейсе проверки.
best_match=None, # Нечеткое совпадение похожих заголовков
auto_id=None, # проверьте поле AutomationId интерфейса, но многие элементы управления не имеют этого атрибута
# Не часто используется
parent=None,
process=None,# В принципе это не обязательно, оно будет меняться каждый раз при запуске процесса.
top_level_only=True,
visible_only=True,
enabled_only=False,
handle=None,
ctrl_index=None,
found_index=None,
predicate_func=None,
active_only=False,
control_id=None,
framework_id=None,
backend=None,
# Следующие элементы управления поддерживают только оконный режим.
dlg.close() # Закрыть интерфейс
dlg.minimize() # Свернуть интерфейс
dlg.maximize() # максимизировать интерфейс
dlg.restore() # Восстановите окно до нормального размера, например сверните его и отобразите в обычном режиме на рабочем столе.
dlg.get_show_state() # Нормальный 0, Максимизировать 1, Минимизировать 2
dlg.menu_select() # Строка меню, например: app.window.menu_select(Edit -> Replace)
dlg.exists(timeout=None, retry_interval=None) # Определить, существует ли он
#timeout: время ожидания, обычно по умолчанию составляет 5 с.
#retry_interval: время повтора в пределах тайм-аута
dlg.wait(wait_for, timeout=None, retry_interval=None) # Подождите, пока окно перейдет в определенное состояние
dlg.wait_not(wait_for_not, timeout=None, retry_interval=None) # Окно ожидания не находится в определенном состоянии, т.е. ожидает исчезновения.
# wait_for/wait_for_not:
# * 'exists' means that the window is a valid handle
# * 'visible' means that the window is not hidden
# * 'enabled' means that the window is not disabled
# * 'ready' means that the window is visible and enabled
# * 'active' means that the window is active
# таймаут: как долго ждать
# retry_interval: время повтора в пределах тайм-аута
# eg: dlg.wait('ready')
# Работа с мышью и клавиатурой,Перечислены только распространенные формы,У них много параметров по умолчанию, но Нет часто используется,Можно посмотреть в исходном коде
ctrl.click_input() # большинство Обычно используетсяметод щелчка,Базовый метод для всех операций щелчка (базовый вызов имеет только другие параметры),щелкните левой кнопкой мыши,При его использовании обычно используется значение по умолчанию без параметров.
ctrl.right_click_input() # щелчок правой кнопкой мыши
ctrl.type_keys(keys, pause = None, with_spaces = False,) # Для ввода с клавиатуры нижний уровень по-прежнему вызывает клавиатуру.send_keys
# ключи: текстовое содержимое, которое необходимо ввести
# пауза: время ожидания после ввода каждого символа, значение по умолчанию — 0,01.
# with_spaces: сохранять ли все пробелы в ключах, 0 удаляется по умолчанию.
ctrl.double_click_input(button ="left", coords = (None, None)) # Двойной щелчок левой кнопкой мыши
ctrl.press_mouse_input(coords = (None, None)) # Нажмите левую кнопку, чтобы указать координаты. Если координаты не передаются, по умолчанию используется верхний левый угол.
ctrl.release_mouse_input(coords = (None, None)) # Отпустите левую кнопку, чтобы указать координаты. Если координаты не переданы, по умолчанию используется верхний левый угол.
ctrl.move_mouse_input(coords=(0, 0)) # Переместите указатель мыши в указанные координаты. Если координаты не переданы, по умолчанию используется верхний левый угол.
ctrl.drag_mouse_input(dst=(0, 0)) # Перетащите Ctrl на dst, который представляет собой набор операций нажатия, перемещения и отпускания.
# Общие свойства элементов управления
ctrl.children_texts() # Текстовый список всех субэлементов управления, соответствующий полю «Имя» в проверке.
ctrl.window_text() # Текст заголовка элемента управления, соответствующий полю «Имя» в проверке.
# ctrl.element_info.name
ctrl.class_name() # Имя элемента управления класса,Соответствует полю ClassName в проверке.,Некоторые элементы управления отсутствуют Имя класса
# ctrl.element_info.class_name
ctrl.element_info.control_type # Тип элемента управления, английское название поля LocalizedControlType в интерфейсе проверки.
ctrl.is_child(parent) # Является ли ctrl дочерним элементом родительского элемента управления
ctrl.legacy_properties().get('Value') # Вы можете получить ряд полей, начинающихся с LegacyIAccessible, в интерфейсе проверки. Я нашел этот метод в исходном коде uiawraper.py, и он очень полезен.
# Общие операции органов управления
ctrl.draw_outline(colour='green') # Пространственная периферийная рамка для удобства просмотра, поддержка красного цвета, 'green', 'blue'
ctrl.print_control_identifiers(depth=None, filename=None) # Распечатайте содержащиеся в нем элементы в виде древовидной структуры, подробности см. в разделе «Печать элементов».
# Глубина: глубина печати. По умолчанию печатается максимальная глубина.
# имя файла: сохраните возвращенный идентификатор в файл (сгенерированный файл находится по тому же пути, что и текущий запущенный скрипт).
ctrl.scroll(direction, amount, count=1,) # прокрутка
# direction :"up", "down", "left", "right"
# amount:"line" or "page"
# count:int прокруткачастота
ctrl.capture_as_image() # Возвращает элемент управления PIL image, вы можете продолжать использовать его методы следующим образом:
# eg: ctrl.capture_as_image().save(img_path)
ret = ctrl.rectangle() # Верхние, нижние, левые и правые координаты элемента управления (L430, T177, R1490, B941), может выводить вверх, вниз, влево и вправо.
# eg: ret.top=177
# ret.bottom=941
# ret.left=430
# ret.right=1490