PythonによるWindowsアプリケーション自動化:pywinautoとpyautoguiの活用

本記事では、Pythonを使用してWindowsアプリケーションを自動操作する方法を解説します。具体的には、メモ帳を開き、テキスト入力、コピー&ペースト、表示方法の変更、テキストの置換、保存といった操作をpywinautoとpyautoguiライブラリを用いて実装します。

from pywinauto import application
from pywinauto.keyboard import send_keys
import pyautogui
import subprocess
import re
import time

# メモ帳のプロセスIDを取得する関数
def retrieve_process_id(target_app):
    cmd = f"tasklist | findstr {target_app}"
    process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output = process.stdout.readlines()[0].decode()
    print(output)
    pid_match = re.findall(f"{target_app}.*?(\\d+)", output)
    print(f"取得した{target_app}のPID: {pid_match[0]}")
    return int(pid_match[0])

# 方法1: アプリケーションを起動し、適切なバックエンドを指定する
#app = application.Application(backend='win32').start('notepad.exe')

# 方法2: 既存のプロセスIDを指定して接続する
app = application.Application().connect(process=retrieve_process_id("notepad"))

# ウィンドウオブジェクトを取得
notepad_window = app['無題 - メモ帳']
print(notepad_window.print_control_identifiers())

# メモ帳にテキストを入力
editor = app['無題 - メモ帊']
editor.type_keys("Python自動化")
editor.type_keys("サンプルプログラム")
editor.type_keys("テストコード")

# 全選択とコピー
send_keys("^a")
send_keys("^c")

# ペースト操作
send_keys("^v")
send_keys("{VK_RETURN}")
send_keys("^v")
send_keys("{VK_RETURN}")
send_keys("^v")

# ホームキーを押す
pyautogui.keyDown('home')
pyautogui.keyUp('home')

# メニュー構造を表示
print(notepad_window.menu())

# メニューを再帰的にリスト表示する関数
def display_menu_items(menu_elements, indent):
    """
    メニューを再帰的に表示する
    """
    for item in menu_elements.items():
        if len(item.text()) > 0:
            print(indent + item.text())
        if item.sub_menu() is not None:
            display_menu_items(item.sub_menu(), "    " + indent)

display_menu_items(notepad_window.menu(), "")

# 「ヘルプ」→「についてメモ帳」を選択
notepad_window.menu_select("ヘルプ->についてメモ帳")
send_keys("{VK_RETURN}")

# 表示→ズーム→拡大を4回実行
for _ in range(4):
    notepad_window.menu_select("表示->ズーム->拡大")

# 表示→ズーム→デフォルトズームに戻す
notepad_window.menu_select("表示->ズーム->&デフォルトズームに戻す")

# 置換ダイアログを開き、テキストを置換
notepad_window.menu_select("編集->置換(&R)")
pyautogui.write("Python")
pyautogui.press("tab")
pyautogui.write("プログラミング言語")
pyautogui.press("tab")
# タブキーを6回押して「すべて置換」ボタンに移動
for _ in range(6):
    pyautogui.press("tab")
pyautogui.press("enter")
pyautogui.press("esc")

# ファイルを保存
notepad_window.menu_select("ファイル->保存(&S)")
time.sleep(1)  # ファイル名入力待機
pyautogui.write("python_automation_sample")
pyautogui.press("enter")
notepad.exe                  12345 Console                    2     35,060 K

取得したnotepadのPID: 12345
コントロール識別子:

メモ帳 - '*無題 - メモ帳'    (L189, T54, R1214, B579)
['*無題 - メモ帳', 'Notepad', '*無題 - メモ帳Notepad']
child_window(title="*無題 - メモ帳", class_name="Notepad")
   | 
   | Edit - 'Python自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード'    (L197, T105, R1206, B549)
   | ['Edit', '*無題 - メモ帳Edit']
   | child_window(title="Python自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード", class_name="Edit")
   | 
   | StatusBar - ''    (L197, T549, R1206, B571)
   | ['*無題 - メモ帳StatusBar', 'StatusBar Windows (CRLF)', 'StatusBar  第 3 行、第 1 列', 'StatusBar', 'StatusBar 100%', 'StatusBar UTF-8']
   | child_window(class_name="msctls_statusbar32")
None
<Menu 2689599>
ファイル(&F)
    新規作成(&N)    Ctrl+N
    ウィンドウを新規開く(&W)    Ctrl+Shift+N
    開く(&O)...    Ctrl+O
    保存(&S)    Ctrl+S
    名前を付けて保存(&A)...    Ctrl+Shift+S
    ページ設定(&U)...
    印刷(&P)...    Ctrl+P
    終了(&X)
編集(&E)
    元に戻す(&U)    Ctrl+Z
    切り取り(&T)    Ctrl+X
    コピー(&C)    Ctrl+C
    貼り付け(&P)    Ctrl+V
    削除(&L)    Del
    &Bingで検索...    Ctrl+E
    検索(&F)...    Ctrl+F
    次を検索(&N)    F3
    前を検索(&V)    Shift+F3
    置換(&R)...    Ctrl+H
    ジャンプ(&G)...    Ctrl+G
    すべて選択(&A)    Ctrl+A
    日付/時刻(&D)    F5
書式(&O)
    自動改行(&W)
    フォント(&F)...
表示(&V)
    ズーム(&Z)
        拡大(&I)    Ctrl + プラス
        縮小(&O)    Ctrl + マイナス
        &デフォルトズームに戻す    Ctrl+0
    ステータスバー(&S)
ヘルプ(&H)
    ヘルプの表示(&H)
    フィードバックを送信(&F)
    についてメモ帳(&A)

参考: https://www.jb51.net/article/187508.htm

タグ: Python pywinauto pyautogui Windows自動化 GUIテスト

7月15日 01:10 投稿