Warning: Undefined array key "options" in /home/c1397404/public_html/ict-worker.com/wp-content/plugins/elementor-pro/modules/theme-builder/widgets/site-logo.php on line 192

Python RPA でウィンドウや画像が出るのを待つ

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

RPA を自作していて、「すぐにウィンドウや画像は出てこないけど、一定時間待つのだと不安定。安定するまで待機時間を延ばすと今度は待ちすぎてしまう」という悩みはよくあることです。筆者も、割とよく遭遇します。これは Python に限らずおよそ全ての RPA ツールで共通ですね。

GUIの RPA ツールでは、専用の「ウィンドウを待つ」や「画像の表示を待つ」コマンドが用意されていることがほとんどですが、 Python はプログラミング言語ですので、このくらいは自分で書く必要があります。プログラミングの考え方の勉強としては、最適なテーマと言えます。

今回利用するのは、前回学習したif文に加え、for文によるループ・繰り返しです。この2種類の組み合わせは、プログラミングの世界では初級から上級まで常について回る基本的な構造ですので、しっかり学習しましょう。とくに、if文の応用として条件の「逆転」も学習します。

本記事は、 Python で RPA を書きつつ、 Python の基本を学習する欲張り連載の1部です。インストールから学習したい! という方は連載をご覧ください。

今回の内容
  • Python での forループの記述の仕方
  • 指定のウィンドウがアクティブになるのを待つ方法
  • 指定のウィンドウが非アクティブになるのを待つ方法
  • 名前を付けて保存の確認ダイアログを高速で解決する方法
  • 指定の画像が表示されるのを待つ方法

今回は実例が多めになりますので、頑張りましょう。

 

Python で指定回数繰り返す for ループの記述の仕方

for ループとは、多くのプログラミング言語で、同じ処理を繰り返すときの基本的なループ構造の書き方です。ただ、厳密に解説してしまうと少し難しくなってしまうので、ここでは「指定回数だけ繰り返す」forループの書き方を学習します。

chapter-9-1.py という名前でPython ファイルを新規作成してください(分かれば名前はなんでもいいです)。今回のchapterの中でファイルを分けて置くと、後で「あれ、どうやって書いたっけ?」というときに、自分の書いたプログラムを見直せて便利ですよ。筆者楽介は、いろんな言語をつまみ食いするので、しょっちゅう自分の書いたプログラムを引っ張り出して書き方を思い出します……。

import time

for n in range(10):
    print('回数: ', n)
    time.sleep(0.5)

print('終了')

if 文の時と同様、字下げ・インデントには気をつけて入力してください。こういった記述上のルールもあるので、コピー&ペーストではなく、手で入力してください。

PowerShellから、chapter-9-1.pyを実行すると、「回数: 」が0~9の10回、最後に「終了」と出力されて終了します。

もちろん、出力はprint関数からですが、変数 n に数字を代入はしていないですよね? 実は、これもfor文の効果です。

for文の基本構造を整理するとこのようになります。range 関数はとてもシンプルな関数なのですが、そこを含めて解説すると混乱しやすいので、ここでは「お約束」として、かならず使うものとして覚えて下さい。つまり、

  • for ■ in range(●): が for 文の基本形
  • ■には「好きな」変数を指定すると、繰り返し回数が分かる数字が入っている。
  • ●に繰り返したい回数を入力する
  • 繰り返したい部分は、半角スペースやタブ文字で字下げ・インデントをする

となっています。

字下げ・インデントについて

Python では、for文やif文のようにソースコードを「グループ化する」ために、字下げ・インデントを使用して「ブロック」にします。詳しくは、下記記事で復習できます。

ここで、今回のソースコードを見ると、確かに繰り返し回数に10が指定されていて、変数には n が指定されていることが分かります。

実行が分かりやすいように、time.sleepを入れている以外はprintだけが字下げされていて、10回繰り返されているので、期待通り動いていますね。

 

「あれ? でも 10 で終わってないよ?」

 

と思うかもしれません。よく見ると数字が 0 から始まっていますね? プログラムの世界では、数字は「0から始まる」のが基本です。そのため、0~9で10回の繰り返しとなっています。

理解を深めるために、数字を色々変えて、動作を確認してみてくださいね。

Python のちょっと難しいループ

他のプログラミング言語では、for 文というと、「数字を1ずつ足していく」形式が多いです。

「あれ? Python でも1ずつ増えて行ってるよね?」と思うかもしれませんが、実は同じ変数(n)に数字を「足して」いるわけではないのです。他のプログラミング言語経験者は、ここで少し戸惑うこともあるかもしれません(筆者は、別の書き方あるんじゃないかな、と調べました)。

これを説明するには、配列やタプルといったデータ構造の話になってしまうので、ここでは range関数に繰り返したい回数を入力すればいい、と覚えていてください。他の言語と並行して勉強している方は「そういうもんなんだ」くらいで大丈夫です。

 

指定のウィンドウがアクティブになるのを待つ方法

指定のウィンドウがアクティブになっているか確認する方法は、前回学習しました。そして、前項で、0.5秒間隔で print文を10回実行することに成功しましたから、 for 文と組み合わせることでアクティブになるまで待つことができそうです。

では、chapter-9-2.py とpython ファイルを作成して作って行きます。この項では動作の理解を深めるために、少しずつ追記する形で進めます。

import pygetwindow as gw
import time
import sys

for n in range(30):
    a_win = gw.getActiveWindow()
    if a_win.title == '無題 - メモ帳':
        print('メモ帳がアクティブになりました')
    time.sleep(0.5)

print('終了')

実行前に、まずは字下げ・インデントの量を確認してください。

for 文のループの中に if 文があるので、if 文も半角スペース4つ分、インデントされています。

さらに、メモ帳がアクティブになったときだけ実行したい print 関数については、半角スペース 8つ分インデントされています。

このようにして、どの構造の中に入っているかということが目で見て分かりやすくなっています。普通のWordなどで書く文章でも、特にリストなどで、

  • 字下げ1段目
    • 更に補足要素

のような構造を作ることがあると思いますが、それをプログラミング言語でも行っているだけ、と考えると分かりやすいと思います。

 

では、プログラムを入力したら実行して