見出し画像

【Python3でRPA】アラートが出たことを画像認識で検知する

シリーズ「PythonからWindowsアプリを制御したい」Vol.2です。
RPAの導入はこちら。

「処理が終わりました」というアラートが出たことを画像認識で検知するようにしてみます。できたらさらに、エラーアラートが出ているかどうかも確認して、エラーは無視して進めたい。

処理が完了したアラートの画像を用意する

処理が完了しました

はい用意。
自動化したい処理を手動で実施して完了アラートを出させてスクショして、不要な部分をトリミングしました。Photoshopがあれば一瞬ですね。
プロジェクトフォルダ内の適当なところに保存しておきます。

画面内に該当の画像が表示されるまで待つ

from time import sleep
import pyautogui

localtion = None
while localtion is None:
    localtion = pyautogui.locateCenterOnScreen('images/success.png') 
    print("実行中…")
    sleep(1)
pyautogui.press("enter")   

pyautoguiを使って、画面内に該当の画像と同じものが表示されているかをチェックします。
画像が表示された場合、localtionに座標が入ってくるのでNoneでなくなりwhileを抜けられます。
サンプル用にsleepとprintを入れていますが実際はない方が処理が速くてよいでしょう。

今回はアラートが表示されたらenterで閉じればOKなのでenterを押して終わりです。

特定のエラーが表示されたら特定のボタンを押す

今回やっている自動化処理、繊細なので、ちょっと何か不都合があるとすぐエラーを吐きます。ですが基本的には「無視」に類するボタンを押すだけで良いので、特定のエラーが出たら無視するようにしたいと思います。

同様にエラー画面と、エラーが出たときに押したいボタンのスクショを用意します

このとき、微妙な条件で見た目が変わるボタン(マウスが乗っかっていると色が変わったり、前回選択したやつが点線で囲まれていたりなど)がある場合その部分を避けて、確実にどんな時でも表示されそうな部分を切り抜いておくのがコツです。角丸になっているウインドウは丸みの内側で切り抜いて、表示される位置によって背景が違う、とかそういうことを避けます。

def __wait_script(self):
    localtion = None
    error = None
    while localtion is None:
        # 処理成功ウインドウを監視
        localtion = pyautogui.locateCenterOnScreen('images/success.png') 

        # エラーウインドウを監視
        error = pyautogui.locateCenterOnScreen('images/error.png')
        if error is not None:
            self.__pass_error()

def __pass_error(self):
    # ボタンを探して押す
    localtion1 = pyautogui.locateCenterOnScreen('images/error_chancel.png')
    pyautogui.click(localtion1)
    pyautogui.moveTo(100, 100)

処理成功ウインドウが表示されるまで、処理成功ウインドウとエラーアラートを交互に監視し続けます。
エラーウインドウを閉じた際、カーソルがそのままそこに残っていると、同じ位置に次のウインドウが表示されたときに色が変わってしまったりして不都合なので、ボタンを押したらカーソルをどかしています。

この記事が気に入ったらサポートをしてみませんか?