ちょっと画面操作を自動化したい!なんてときに使えそうな「SikuliX」というGUI自動化ツールを紹介。
Sikuli Xを使うと、GUIの操作を簡単にスクリプト化し、自動再生することができる。
最近では、この手のツールをRPAツールと呼ぶらしいけど。
自動化することによって、画面のリグレッションテストなどに使える。
自動化するにあたり、最近流行の人工知能を使ってみたいところだけど、今のところそんな夢のようなツールは無い。
AIは飛躍しすぎだけど、RPA(Robotic Process Automation)として、候補にあがる有用なツールです。
他にもGUI操作を自動化するツールとして、Seleniumや、IeUnit、Watir、Marathonとか色々あるけど、SikuliはOCRのような感じで画像認識しながら動作するところが凄い。
画像認識するので、例えばSeleniumのようにWebに限ったり、属性名が無い部品やFlashを使ったWebページに対しても自動化が可能。
更に画像判定で動くためWebに限らず、WindowsのGUIアプリでも自動化することができる。
また、ベースはJavaで作られているため、LinuxやMacでも動くらしい。
スクリプトの作成は、専用の開発環境(Sikuli IDE)があるため割と簡単で、操作したい対象の部分のイメージを採取し、そのイメージに対する操作(関数)を指定する。
例えば、ごみ箱をダブルクリックしたい場合は、”dobleClick(画像)” とコーディングする。
↓こんな感じ。
開発言語は、jython(python)や、Ruby(JRuby)が使える。
あと、Sikuliは現時点で日本語版は無く英語版のみ。
ちなみに、私はPythonとかRubyとか使ったことがなく、英語も大嫌いだけど難なく使うことが出来た。
[Sikuli Script]
http://www.sikuli.org/
何はともあれ実際にSikuliXを使ってみる。
SikuliXのインストール
- Sikuliのダウンロード
http://www.sikuli.org/download.html
今回は、Version 1.0.1のsikuli-setup.jarをダウンロード。
<2018/7 更新>リンク先ページが更新されていたので記事も修正しました。。
Sikuliダウンロード先に行くと以下のような画面に変わっていました。
ここで、「All you need to know, you can find behind this link.」リンクをクリック。
遷移先ページの「How can I get SikuliX?」あたり(ページ中央付近)にある
「SikuliX’s Launchpad page.」リンクをクリック。
Download project filesのページより、最新版(sikulixsetup-1.1.2.jar)をダウンロード。
※Sikuliのバージョンに合わせたJavaをインストールしておく。
Sikuli 1.0.1の場合、Java7またはJava6{JDK|JRE}を用意。
Sikuli 1.1.2の場合は、Java8を用意
- ダウンロードしたsikuli-setup.jarを実行。
<2018/7 更新>
ここもsikuliのバージョンによってだいぶ変わっていたので、v1.0.1とv1.1.2で分けて書きます。・sikulix 1.0.1の場合
関連付けされている場合は、ダブルクリック。
関連付けされていない場合は、コマンドプロンプトより「java -jar sikuli-setup.jar」を実行。すると、jarと同一フォルダ内にrunSetup.cmdとログが出力される。
・sikulix 1.1.2の場合
関連付けされている場合は、ダブルクリック。
関連付けされていない場合は、コマンドプロンプトより「java -jar sikulixsetup-1.1.2.jar」を実行。
※上記イメージ図では、Downloadsフォルダでそのまま実行しているが、これは誤り。。
Sikuliのインストール先フォルダを用意して、そこで実行してください。
- 展開されたrunSetup.cmdをダブルクリック。
ダイアログが表示されるので[OK]押下。 - セットアップ画面が表示される。
<2018/7 更新>・sikulix 1.0.1の場合
今回は試しに全部入れてみるという事で「1-Pack1:I want to use all options: Sikuli IDE,running script from commandline (and optionally Java developement)」を選択し、[Setup Now]ボタン押下。
- ダイアログが表示されるので[はい]押下。
<2018/7 更新>・sikulix 1.0.1の場合
更に、以下のメッセージが表示されるので、内容を確認し「はい」押下。
sikuli-ide-1.0.1.jarがダウンロードされ、セットアップ完了。
SikuliXの使い方
インストールしたSikuliXを使って、実際にGUI操作の記録と実行をしてみる。
- SikuliXの起動
<2018/7 更新>・sikulix 1.0.1の場合
インストールで出来た”runIDE.cmd”をダブルクリック。
- Sikuli IDEが起動
このIDEを使って、SikuliX用のスクリプトを作成する。
ここの例ではInternet Exprolerを起動し、HPにアクセスし1ページ遷移し、結果判定するという一連の流れを自動化してみる。 - 「ファイルを指定して実行」ダイアログを呼び出す
[Windows]+[R]キー押下し、以下のダイアログ表示。
(このダイアログを後でキャプチャーするので、このまま表示しておいてください)
これをSikuliスクリプトで再現するには、
type("r", KEY_WIN)
type関数はキー入力を意味し、”r”キーを”Windows”キーを押しながら打ち込むという意味。
- 「ファイルを指定して実行」ダイアログが表示されたか確認
exists関数で、ダイアログが表示されたか確認する
Sikuli IDE左側ペインからexist()をクリック。
すると、「Select an image」がデスクトップ画面に表示されるので、
existで存在確認したいエリアをマウスでドラッグ。
これで、選択範囲のスクリーンショットが自動採取されSikuli IDEにスクリプトが追記される。 - Internet Exprolerの起動
そのまま、今度は”iexplore.exe https://www.osadasoft.com/”と入力し[Enter]キー押下。paste("iexplore.exe https://www.osadasoft.com/") type(Key.ENTER)
- ページ遷移
今度は表示されたHP内の「ソフトウェア」というリンクをクリックする。
クリックする前にページが表示されたか存在確認(Exist)する。
- 確認
「ソフトウェア」のページに遷移できたか確認。
判定はif文で行い、結果はpopup関数でメッセージ表示する。
これで、今回のスクリプトは完成。
全体ソースは以下の通り。
- 実行
ツールバーの「実行」ボタンを押下し、スクリプト実行。
これで最後まで動作し成功すると「OK」が表示される。
これでとりあえず、SikuliXは動いた。
おまけ
コマンドラインから実行
保存したSikuliスクリプトをコマンドプロンプトから実行する方法。
これができれば、バッチファイル化して複数実行とかも容易に。
例)sikulix 1.0.1の場合
runIDE.cmd -r C:\test.sikuli\
例)sikulix 1.1.2の場合
runsikulix.cmd -r C:\test.sikuli\
実行ファイル形式
IDEの[ファイル]メニューから実行ファイルとしてエクスポートすることが可能。
エクスポートすると、拡張子が.sklのファイルが出来る。
skl形式のファイルはコマンドラインから実行可能。
例)
runIDE.cmd -r C:\work\test.sikuli\
処理待ち
exist関数やsleep関数では画像が表示されるまで待ってくれない場合がある。
その場合、以下のような処理で画像が表示されるまで待つことができる。
例)
while not exist(画像): wait(1) # 次の処理 click(画像)
画面のスクロール
Webページなどで、画面外に表示されスクロールしないと現れないボタン等をクリックしたい場合、
以下のような方法で、ボタンが現れるまで自動的にマウスホイール回転を繰り返し、表示されたら
ボタンをクリックすることができる。
例)
# Webブラウザにフォーカスを当てる click(ブラウザのタイトルバーの画像など) sleep(1) while not exist(ターゲットのボタン画像): wheel(WHEEL_DOWN,1) click(ターゲットのボタン画像)
日本語入力
paste関数に日本語をそのまま使うと文字化けするので”u”を指定する。
例)
paste(u"テスト")
ログ出力
実行結果などをログ出力したいときに関数化しておくと便利。
例)
def wLog(mes) logFile = open("c:\\out.log","a") u8 = message.encode('UTF-8') try: logFile.write(u8 + "\n") finally: logFile.close() pass wLog("OK")
iniファイル読み込み
Windowsのiniファイル形式の設定読み込み
test.ini
[login] id = user01
例)
import os import ConfigParser cf = ConfigParser.SafeConfigParser() cf.read('C:\\test.ini') userid = cf.get('login','id') popup("User ID=" + userid)
リモートデスクトップ接続から実行
自動化したSiluliスクリプトを実行すると、他の作業ができなくなってしまうため、
他のVMなどにリモートデスクトップ接続し、そのVM上でSikuliを実行させる。なんてことが多いと思う。
だけど、実行中邪魔だと言ってリモートデスクトップ接続のウインドウを最小化すると、接続が切断というか一時停止しSikuliの実行が失敗してしまう。
こんなとき、以下のレジストリキーを変更することによって、最小化しても接続を維持することができる。
キー:
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client
値:
RemoteDesktop_SuppressWhenMinimized = 2 (DWORD)
※64bitOSの場合は以下も設定。
キー:
HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Terminal Server Client
値:
RemoteDesktop_SuppressWhenMinimized = 2 (DWORD)
追記
2019/3/4
久々にSikuli触る機会があって最新版(Version 1.1.4)をインストールしてみたんだけど、
インストールが簡単になっていて驚いた。
ざっくりと言うと、
1.Java8(64bit)をインストール(64bitじゃないとダメ)
2.Sikuliをダウンロード
sikulix.jarと、jython-standalone-2.7.1.jarをダウンロード
3.sikulix.jarをダブルクリック
これで、インストールが終わり、SikuliIDEが起動される。
あと、ついでにSikuliX 1.1.4でコマンド実行する方法は、以下の通り。
java -jar (sikulix.jarのパス) -r (作成したSikuliスクリプトのパス)
例)
java -jar C:\sikuli\sikulix.jar -r c:\work\test.sikuli
2015年の記事なんですね…。
RPAがにわかにキーワードになりつつあるので、自分でフリーの環境で使ってみようと思ってたどり着きました。2019年なのに。
とてもわかりやすい記事で助かります。
商用だと安くても月額14万~みたいなので、なかなか業務効率化だけでは会社で買ってもらえないのですが、まずはここから評価してみようと思いました。
最近、またRPA関連ツールとしてSikuliXを活用される方も増えてきているようですね。
バージョンアップされ、昔よりインストールし易くなったようです。
画像認識がメインのため、他のRPAツールより精度は低いかも知れませんが、
無料で商用利用(MIT Licence)できる点が良いと思います。