【初心者向け】pywinautoの待機処理の基本と実装例|エラーを防ぐテクニック

pywinauto アイキャッチ画像

【初心者向け】pywinautoの待機処理の基本と実装例|エラーを防ぐテクニック

アプリの自動化を行うプログラムを作成しても、起動の待機処理が上手くいかず、思い通りの動作をしなかったという経験はありませんか?
私は何回もあります(笑)

アプリ自動化の際は、思い通りの動作をさせるために待機処理を加える必要があります。

pywinautoで自動化プログラムを作成する際に、考えられる待機方法は3つあります。

             ・wait_for_process_exit()
             ・wait()
             ・timingsモジュール

本記事では、上記3つの待機方法について解説していきたいと思います。

wait_for_process_exit()

wait_for_process_exit()の基本

wait_for_process_exit() は、指定したプロセスが終了するまでスクリプトの実行を一時停止するメソッドです。

基本構文

以下の構文で使用します。

application.wait_for_process_exit(timeout=None)
引数 説明
timeout プロセスの終了を待機する最大時間(秒単位)。省略すると無制限に待機。

基本的な使用例

以下のコードは、メモ帳(Notepad)を起動し、そのプロセスが終了するのを待機する例です。

from pywinauto import Application

# メモ帳を起動
app = Application().start("notepad.exe")

# プロセスの終了を待機(無制限)
app.wait_for_process_exit()
print("メモ帳が閉じられました。")

タイムアウトを指定する

タイムアウトとは?

タイムアウト(timeout)」とは、ある処理が一定時間内に完了しなかった場合に、
自動的に中断する仕組みのことです。
主にプログラミングやネットワーク通信などで使われる概念で、処理が終わらずに
ずっと待ち続けるのを防ぐ役割があります。

プロセスの終了を待機する時間を制限したい場合は、timeout 引数を使用します。

from pywinauto import Application

# メモ帳を起動
app = Application().start("notepad.exe")

# 最大10秒間待機(10秒以内に閉じられなければ次の処理へ)
app.wait_for_process_exit(timeout=10)
print("タイムアウトまたはメモ帳が閉じられました。")

wait()

wait()の基本

wait() は、ウィンドウやGUIコントロールが特定の状態になるまで待機するメソッドです。

基本構文

以下の構文で使用します。

window.wait(wait_for, timeout=None)
引数 説明
wait_for 待機する状態(例: "exists", "visible", "ready" など)
timeout 待機する最大時間(秒単位)。省略すると無制限に待機。

基本的な使用例

以下のコードは、メモ帳(Notepad)を起動し、ウィンドウが表示されるのを待機する例です。

from pywinauto import Application

# メモ帳を起動
app = Application().start("notepad.exe")

# ウィンドウが表示されるのを待つ
window = app.window(title="無題 - メモ帳")
window.wait("visible", timeout=10)

print("ウィンドウが表示されました。")

wait()のオプション(待機対象の状態)

wait() メソッドは、以下のような状態を待機できます。

状態 説明
exists ウィンドウまたはコントロールが存在するまで待機
visible ウィンドウまたはコントロールが画面上に表示されるまで待機
ready ウィンドウまたはコントロールが操作可能になるまで待機

よくあるエラーと対策

よくあるエラー

pywinauto.findwindows.ElementNotFoundError
⇒ウィンドウタイトルが間違っている可能性がある。正しいタイトルを指定する。

TimeoutError
⇒指定した時間内にウィンドウやコントロールが見つからなかった。
 タイムアウト値を調整する。

timingモジュール

timingモジュールの基本

timing モジュールは、pywinautoの自動化スクリプトで待機時間を適切に設定するための機能を提供します。

基本構文

以下の主要な関数が使用されます。

from pywinauto import timing

# デフォルトの待機時間を設定
timing.Timings.window_find_timeout = 10
timing.Timings.window_find_retry = 0.1
プロパティ 説明 デフォルト値
window_find_timeout ウィンドウが見つかるまでの最大待機時間(秒) 5.0
window_find_retry ウィンドウ検索を繰り返す間隔(秒) 0.5
control_find_timeout GUIコントロールが見つかるまでの最大待機時間(秒) 10.0
control_find_retry GUIコントロール検索の再試行間隔(秒) 0.2

基本的な使用例

以下のコードは、メモ帳(Notepad)を起動し、ウィンドウが見つかるまでの待機時間を調整する例です。

from pywinauto import Application, timing

# ウィンドウ検索のタイムアウト時間を設定
timing.Timings.window_find_timeout = 10
timing.Timings.window_find_retry = 0.1

# メモ帳を起動
app = Application().start("notepad.exe")

# ウィンドウを探す(設定されたタイムアウト内で検索)
window = app.window(title="無題 - メモ帳")
window.wait("ready")

print("ウィンドウが見つかりました。")

まとめ

本記事では、pywinautoの3つの待機処理の方法について解説してきました。

             ・wait_for_process_exit()
             ・wait()
             ・timingsモジュール

アプリをプログラムで自動化したい!
そう思った方は、今日学んだ待機処理をプログラムに組み込んでみてください。

ここまで読んでいただきありがとうございました。

関連記事もぜひ読んでみてください!

関連ページ

RPA--PYWINAUTO
「RPA--PYWINAUTO」の記事一覧です。

公式ドキュメント

What is pywinauto — pywinauto 0.6.8 documentation

コメント

タイトルとURLをコピーしました