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

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

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

 

他にも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

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

     

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

     

    すると、jarと同一フォルダ内にrunSetup.cmdとログが出力される。
    runSetup.cmd

     

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

     

  4. セットアップ画面が表示される。
    今回は試しに全部入れてみるという事で「1-Pack1:I want to use all options: Sikuli IDE,running script from commandline (and optionally Java developement)」を選択し、[Setup Now]ボタン押下。
    Sikuliセットアップ画面

     

  5. ダイアログが表示されるので[はい]押下。
    はい

     

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

 

SikuliXの使い方

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

  1. SikuliXの起動
    インストールで出来た”runIDE.cmd”をダブルクリック。
    runIDE.cmd

     

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

     

  3. 「ファイルを指定して実行」ダイアログを呼び出す
    [Windows]+[R]キー押下し、以下のダイアログ表示。
    ファイルを指定して実行

     

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

    type("r", KEY_WIN) 
    

    と入力。

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

     

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

     

    Sikuli IDE左側ペインからexist()をクリックし、存在確認したいイメージ(「ファイルを指定して実行」ダイアログ)の一部を選択。
    するとSikuli IDEにスクリプトが追記される。
    Sikuli IDE

     

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

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

     

    iexplore.exe

     

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

     

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

     

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

     

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

     

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

     

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

     

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

 

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

 

おまけ

コマンドラインから実行

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

 

例)

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

runIDE.cmd

 

実行ファイル形式

IDEの[ファイル]メニューから実行ファイルとしてエクスポートすることが可能。
エクスポートすると、拡張子が.sklのファイルが出来る。

skl形式のファイルはコマンドラインから実行可能。

例)

runIDE.cmd -r C:\yourscript.skl

 

処理待ち

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