SikuliX - 目的の画像が表示されたら処理を行う(イベント処理)

SikuliXでGUI操作を自動化していると、イレギュラーな操作に対応しなければいけないことがあります。

例えば、ブラウザ操作でセキュリティ関連のダイアログがたまに表示されたり、認証ダイアログが表示されたりする場合です。

この場合、existsメソッドで対応することもできますがいつ表示されるかわらかない場合はあちこちにexists文を書かなくてはいけなくなり面倒です。

こんなときは、ある画像が表示されたときに操作を行うといったイベント処理を使うと便利です。

今回は、イベント処理を行う際に汎用的に使えるテンプレートを用意してみました。

SikuliXでイベント処理を行うテンプレート

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
region_center = Region(79,7,1746,976)   # 監視する画面範囲を設定

def hnd_security(event):
region_center.stopObserver() # 処理中に同じイベントが発生しないように監視を一旦止めておく
click("1576109569372-1.png") # なんらかの動作を行う
wait(2) # 短い時間に連続実行されないように少し時間をあけておく
region_center.observeInBackground() # 再度監視を始める

region_center.onAppear("1576109562192-1.png", hnd_security) # ある画像を見つけたらhnd_securityをコールする
region_center.observeInBackground() # 監視処理を始める

#
# 監視処理はバックグラウンドで行われているので
# ここでなにか他の処理を行うことが可能
#

# プログラム終了時
region_center.stopObserver() #監視処理を終了する。

イベント処理(監視処理)とは別にメイン処理を行いたい場合、observeInBackground(10行目)メソッドを使いバックグラウンドで監視処理を行う必要があります。

イベント発生時に実行される関数(イベントハンドラ)内では、画像が表示されている間に連続でコールされないように次のような工夫を行っています。

  • 最初にstopObserverで監視処理を一旦止めて、最後にobserveInBackgroundで監視処理を再開する。
  • 最後に監視処理を再開するまでに2秒待機させて、短い間にイベント処理が連続実行されないようする。

今回は、「イベントが何回も発生することがある」「2秒以内に同じ処理を実行してほしくない」というケースを想定して実装しましたが、目的に応じてコーディングする必要があると思います。

参考になれば幸いです。