Введение в автоматизацию настольных приложений pywinauto
Введение в автоматизацию настольных приложений pywinauto

1. pywinauto автоматизация настольных приложений Windows

Язык кода:javascript
копировать
# фон
Поскольку в проекте используется программа автоматизации настольных приложений, я хочу изучить, как автоматизировать настольные приложения, и вот следующее.

Автоматизация настольных приложений, которая осуществлялась до сих пор, является относительно проблематичной, а данные недостаточно полными.Потому что многие сталкиваются с автоматизацией настольных приложений,Многие из них просто перестали это делать.

Официальный сайт pywinauto Документация на китайском языке

2. Установка среды

1. Способ установки через командную строку.

Язык кода:javascript
копировать
pip install pywinauto

2. Экологическая инспекция

Язык кода:javascript
копировать
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")

3. Знакомство с инструментами позиционирования элементов

1. Итоговое решение

Сейчас я общаюсь с ua

Язык кода:javascript
копировать
В Pywinauto есть два типа бэкэндов: win32 и uia.,По умолчанию — Win32. Вы можете использовать инструменты spy++ и Inspect, чтобы определить, какой бэкэнд подходит для написания.
Например: при использовании режима UIA Inspect.,Более видимые элементы управления и свойства,серверная часть (необязательный интерфейс пользовательского интерфейса),Напротив,бэкэнд не обязателен для Win32.

2. Введение в инструмент

проверить адрес инструмента

Я пока использовал только Inspect

Язык кода:javascript
копировать
Spy++ (инструмент поиска элемента (win32))
Осмотреть (инструмент «Найти элемент» (uia))
UI Spy (инструмент «Найти элемент»)
Swapy (может легко генерировать код pywinauto)

4. Простое введение в дело

Случай 1 (отладка)

Язык кода:javascript
копировать
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")

Случай 2

В этом случае метод start не может запустить приложение, поэтому я использовал os.system для запуска приложения.

Язык кода:javascript
копировать
# 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()

5. Часто используемые интерфейсы позиционирования элементов

1. Часто используемые интерфейсы управления позиционированием (важно)

Язык кода:javascript
копировать
# Найдите методы управления на уровнях
window(**kwargs) # Поиск окон
child_window(**kwargs) # Вы можете игнорировать иерархию и найти квалифицированный элемент в потомках.===>【Чаще всего используется】
parent() # Возвращает родительский элемент этого элемента, без параметров
children(**kwargs) # Возвращает список квалифицированных дочерних элементов, поддерживает индексацию и является объектом (или подклассом) BaseWrapper.
iter_children(**kwargs) # Возвращает итератор дочерних элементов, который является объектом (или подклассом) BaseWrapper.
descendants(**kwargs) # Возвращает список всех элементов-потомков, соответствующих условиям, который является объектом (или подклассом) BaseWrapper.
iter_children(**kwargs) # Итератор квалифицированных элементов-потомков,даBaseWrapperобъект(или подкласс)---> Сомнительно, iter_descendants?

2. Общие атрибуты (важно)

Язык кода:javascript
копировать
# Обычно используется
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,

3. Доступные атрибуты метода элемента управления (важно)

Язык кода:javascript
копировать
# Следующие элементы управления поддерживают только оконный режим.
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
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose