Sikuliでクリップボードの値を取得するには、App.getClipboardメソッドを使用します。
例えば、コピーした文字列をresult変数に取得するには下記のように実装します。
1 | result = App.getClipboard() |
もちろんクリップボードの値を取得する前に type(‘xxxxx.png’, ‘c’, Key.CTRL)などを実行しておいて情報をコピーしておく必要があります。
Sikuliでクリップボードの値を取得するには、App.getClipboardメソッドを使用します。
例えば、コピーした文字列をresult変数に取得するには下記のように実装します。
1 | result = App.getClipboard() |
もちろんクリップボードの値を取得する前に type(‘xxxxx.png’, ‘c’, Key.CTRL)などを実行しておいて情報をコピーしておく必要があります。
Sikuliでは画像が見つからなかった時に例外が発生し、プログラムが停止します。
これを防ぐ方法としてまず考えられるのが、existsメソッドを使う方法です。existsメソッドを使ってあらかじめ画像が存在するかどうかを確認し、存在するならばクリックするようにプログラミングします。
1 | if exists('xxxx.png'): |
しかしこのようにif文をひとつひとつ記述するのは煩雑で、コードも見づらくなりますので、次の処理を検討した方がよいでしょう。
Sikuliは、画像が見つからないときなどに、FindFailedという例外を発生します。
次のコードのようにtry catchで囲って処理します。この方法であれば先に実装したようにひとつひとつexistsメソッドで調べなくてもすみます。
1 | try: |
画像が見つからない場合は、そのまま無視したり、ユーザにどうするかを尋ねたりするほか、自分が設定した独自の例外ハンドラで処理することもできます。
関数名 | 解説 |
---|---|
setThrowException(f) | 例外を発生するかどうかを設定する。 f=Trueで発生させる(既定) f=Falseで抑制する |
setFindFailedResponse(ABORT|SKIP|PROMPT|RETRY) | 画像が見つからなかったときにどうするかを設定する。 ABORT=例外を発生し終了する(既定) SKIP=無視する。戻り値はNone PROMPT=どのようにするかをユーザに尋ねる RETRY=見つかるまでリトライする |
setFindFailedHandler(handler) | 例外が発生したときに実行する独自の例外ハンドラhandlerを設定する。 |
setThrowException(False)またはsetFindFailedResponse(SKIP)を実行すると、例外を抑制できます。この場合、戻り値はNoneになります。
clickメソッドやtypeメソッドは、引数がNoneであってもエラーなどは発生せずなにもしないだけです。
特にエラーメッセージを表示する必要がなく、単純に見つからなかったときは何もしないということであれば次のように記述できます。
1 | setThrowException(False) |
setFindFailedResponse(PROMPT)を実行しておくと、画像が見つからなかったときに確認ダイアログ①が表示されます。
1 | setFindFailedResponse(PROMPT) |
[Retry]をクリックすればリトライし、[Abort]をクリックすればプログラムは終了します。
[Capture/Skip]ボタンをクリックするとさらに次の確認ダイアログ②が表示されます。
[Capture]をクリックすると、この画像を別の画像に差し替えることができます。
Sikuliでは画像の解像度などの違いによって、別の環境に持っていくと画像がマッチしなくなってしまうことがあります。
setFindFailedResponse(PROMPT)としておけば、そのような場合ユーザがマッチする画像を差し替えることができるため大変便利です。
setFindFailedHandlerメソッドを使うと、独自の例外ハンドラを設定できます。
ハンドラの書式は以下の通りです。
1 | def handler(event): |
引数のeventオブジェクトはイベントが発生したときに渡されるObserveEventオブジェクトです。
例外ハンドラではevent.setResponseメソッドを使って、ABORT,SKIP,PROMPT,RETRYのいずれかの値を返さなければなりません。
この方法をとると画像が見つからなかったときに、エラーログを出力したり、メールを送信したりし、その後の処理はユーザに尋ねるといったことができるので個人的には一番お勧めです。
Sikuliはアイデア次第でいろいろな場面で使えます。代表的な用途としては次の通りです。
Sikuliには次のようなデメリットがあります。
Sikuliには次のようなメリットがあります。
Sikuliで日本語のOCRを実行してみました。
動作確認環境は次の通りです。
OCRを日本語に対応させるためには、日本語OCR用のデータファイルをダウンロードする必要があります。
https://github.com/tesseract-ocr/tessdata/blob/master/jpn.traineddata
C:\Users(ユーザ名)\AppData\Roaming\Sikulix\SikulixTesseract\tessdata
※SikulixTesseractフォルダが見つからない場合は、一度SikuliでOCRに関する処理を実行してみると、自動で作成されるようです。
以下のコードを実行すると、領域選択画面が現れるので、そこでOCRを実行したいエリアを選択するとOCR処理されたデータがout.txtに出力されます。
1 | import sys |
※標準出力だと文字化けするのでとりあえずファイル出力にして回避しました。
Sikuliプロジェクトをバッチ(コマンド)で実行する際に引数を渡すには下記のようにします。
1 | java -jar sikulix.jar -r xxxxxxx.sikuli -- 引数1 引数2 |
-jarのあとにsikuli.jarを指定し、-rのあとにSikuliプロジェクトを指定するところまでは引数なしのコマンド実行と同じです。
そこからハイフンを2つ入力し、引数をスペース区切りで指定すると、起動引数として処理に渡すことができます。
Sikuliプロジェクトの中で起動引数を確認するときは、Pythonでの文法そのままです。
1 | import sys |
Python使いの方にとっては実行時のハイフン2つを覚えるだけで簡単に実装できます。
Sikuliには各種設定を変更するプロパティがあり、値を変更することで挙動を変えることができます。
プロパティ | 説明 | 既定値 |
---|---|---|
MinSimilarity | 類似度。 | 0.7 |
MoveMouseDelay | マウスの動きの遅れ。0に設定すると瞬間移動する。 | 0.5秒 |
DelayBeforeMouseDown | マウスのボタン押下の際の遅れ時間(秒)。 | 0.3秒 |
DelayBeforeDrag | ドラッグの際の遅れ時間(秒)。 | 0.3秒 |
DelayBeforeDrop | ドロップの際の遅れ時間(秒)。 | 0.3秒 |
ClickDelay | クリックの際の遅れ時間(秒)。最大1秒まで。 | 0秒 |
TypeDelay | キー入力の際の遅れ時間(秒)。最大1秒まで。 | 0秒 |
SlowMotionDelay | スローモーションで動かす際の遅れ時間(秒)。 | |
WaitScanRate | 画像マッチングの際の待ち時間間隔(秒)。 | 3 |
ObserveScanRate | イベントが発生するかどうかを確認するために画像をスキャンする時間間隔(秒)。 | 3 |
ObserveMinChangePixels | 画像の変化イベント(Changeイベント)を、どのくらいのピクセルが変更したときに発生させるか。 | 50(約7×7ピクセル四方) |
AlwayResize | 自動で画像リサイズするかどうか。0でしない、1でする。 | 0 |
ImageCallback | 画像マッチングする際に呼び出してもらいたいコールバック関数を指定する。 |
RPAはアプリケーションのひとつですが、業務システムやOAツールなどのアプリケーションを、データや各種処理を通じて横断的につなぐ役割を果たします。
ミドルウェアは垂直方向での共通基盤ですが、RPAでは水平方向に横断的にアプリケーションをつなぎます。
RPAは次の3つの機能があります。
Appクラスは、アプリケーションの起動やフォーカスの設定、ウィンドウを閉じる操作等の機能を提供します。
コンストラクタは下記の通りです。
コンストラクタ | 説明 |
---|---|
App() | 引数なしのコンストラクタ |
App(name) | アプリケーション名や実行ファイル名を指定したコンストラクタ |