Sikuliを使ってGUI操作を自動化してみる

ちょっと画面操作を自動化したい!なんてときに使えそうな「SikuliX」というGUI自動化ツールを紹介。

Sikuli Xを使うと、GUIの操作を簡単にスクリプト化し、自動再生することができる。
自動化することによって、画面のリグレッションテストなどに使える。
Sikuli

自動化するにあたり、最近流行の人工知能を使ってみたいところだけど、今のところそんな夢のようなツールは無い。
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のインストール

  1. Sikuliのダウンロード
    http://www.sikuli.org/download.html
    今回は、Version 1.0.1のsikuli-setup.jarをダウンロード。
    sikuli-setup.jar

     
    <2018/7 更新>

    リンク先ページが更新されていたので記事も修正しました。。
    Sikuliダウンロード先に行くと以下のような画面に変わっていました。
    sikuliダウンロード
    ここで、「All you need to know, you can find behind this link.」リンクをクリック。

     
    遷移先ページの「How can I get SikuliX?」あたり(ページ中央付近)にある
    「SikuliX’s Launchpad page.」リンクをクリック。
    SikuliX's Launchpad page.

     
    Download project filesのページより、最新版(sikulixsetup-1.1.2.jar)をダウンロード。
    sikulixsetup-1.1.2.jar

     

    Sikuliのバージョンに合わせたJavaをインストールしておく。
     Sikuli 1.0.1の場合、Java7またはJava6{JDK|JRE}を用意。
     Sikuli 1.1.2の場合は、Java8を用意
     

  2. ダウンロードしたsikuli-setup.jarを実行。
    <2018/7 更新>
    ここもsikuliのバージョンによってだいぶ変わっていたので、v1.0.1とv1.1.2で分けて書きます。

    ・sikulix 1.0.1の場合
    sikuli-setup.jar
    関連付けされている場合は、ダブルクリック。
    関連付けされていない場合は、コマンドプロンプトより「java -jar sikuli-setup.jar」を実行。

     

    すると、jarと同一フォルダ内にrunSetup.cmdとログが出力される。
    runSetup.cmd
     
    ・sikulix 1.1.2の場合
    java -jar sikulixsetup-1.1.2.jar
    関連付けされている場合は、ダブルクリック。
    関連付けされていない場合は、コマンドプロンプトより「java -jar sikulixsetup-1.1.2.jar」を実行。
    ※上記イメージ図では、Downloadsフォルダでそのまま実行しているが、これは誤り。。
     Sikuliのインストール先フォルダを用意して、そこで実行してください。

     

  3. 展開されたrunSetup.cmdをダブルクリック。
    runSetup.cmd
    ダイアログが表示されるので[OK]押下。

     
    question
    [はい]を選択。

     

  4. セットアップ画面が表示される。
    <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]ボタン押下。
    Sikuliセットアップ画面

     

    ・sikulix 1.1.2の場合
    setup
     

  5. ダイアログが表示されるので[はい]押下。
    <2018/7 更新>

    ・sikulix 1.0.1の場合
    はい

    ・sikulix 1.1.2の場合
    question
     

    更に、以下のメッセージが表示されるので、内容を確認し「はい」押下。
    question

    sikuli-ide-1.0.1.jarがダウンロードされ、セットアップ完了。
    セットアップ完了

SikuliXの使い方

インストールしたSikuliXを使って、実際にGUI操作の記録と実行をしてみる。

  1. SikuliXの起動
    <2018/7 更新>

    ・sikulix 1.0.1の場合
    インストールで出来た”runIDE.cmd”をダブルクリック。
    runIDE.cmd

    ・sikulix 1.1.2の場合
    インストールで出来た”runsikulix.cmd”をダブルクリック。
    runsikulix.cmd
     

  2. Sikuli IDEが起動
    Sikuli IDEが起動
    このIDEを使って、SikuliX用のスクリプトを作成する。
    ここの例ではInternet Exprolerを起動し、HPにアクセスし1ページ遷移し、結果判定するという一連の流れを自動化してみる。

     

  3. 「ファイルを指定して実行」ダイアログを呼び出す
    [Windows]+[R]キー押下し、以下のダイアログ表示。
    (このダイアログを後でキャプチャーするので、このまま表示しておいてください)
    ファイルを指定して実行

     

    これをSikuliスクリプトで再現するには、

    type("r", KEY_WIN) 
    

    と入力。
    type("r",KEY_WIN)

    type関数はキー入力を意味し、”r”キーを”Windows”キーを押しながら打ち込むという意味。

     

  4. 「ファイルを指定して実行」ダイアログが表示されたか確認
    exists関数で、ダイアログが表示されたか確認する
    ファイルを指定して実行

     

    Sikuli IDE左側ペインからexist()をクリック。
    すると、「Select an image」がデスクトップ画面に表示されるので、
    existで存在確認したいエリアをマウスでドラッグ。
    これで、選択範囲のスクリーンショットが自動採取されSikuli IDEにスクリプトが追記される。

    デモ

     

  5. Internet Exprolerの起動
    そのまま、今度は”iexplore.exe https://www.osadasoft.com/”と入力し[Enter]キー押下。

    paste("iexplore.exe https://www.osadasoft.com/")
    type(Key.ENTER)
    

     

    iexplore.exe

     

  6. ページ遷移
    今度は表示されたHP内の「ソフトウェア」というリンクをクリックする。
    ソフトウェア

     

    クリックする前にページが表示されたか存在確認(Exist)する。
    存在確認

     

  7. 確認
    「ソフトウェア」のページに遷移できたか確認。
    ページに遷移できたか確認

     

    判定はif文で行い、結果はpopup関数でメッセージ表示する。
    メッセージ表示

     

    これで、今回のスクリプトは完成。
    全体ソースは以下の通り。
    全体ソース

     

  8. 実行
    ツールバーの「実行」ボタンを押下し、スクリプト実行。
    「実行」ボタン

     

    これで最後まで動作し成功すると「OK」が表示される。
    OK

 

これでとりあえず、SikuliXは動いた。

 

おまけ

コマンドラインから実行

保存したSikuliスクリプトをコマンドプロンプトから実行する方法。
これができれば、バッチファイル化して複数実行とかも容易に。

 

例)sikulix 1.0.1の場合

runIDE.cmd -r C:\test.sikuli\

runIDE.cmd

 

例)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)

 
 
 


Leave a comment

メールアドレスが公開されることはありません。

CAPTCHA


*