管理者権限を持たないWindows端末に「jPortable」とRPAツールである「SikuliX」をインストールして「Python(Jython)」スクリプトでGUI操作の自動化を試みた際の内容を自分用のメモとしてまとめました。
SikuliXとは
マサチューセッツ工科大学がオープンソースで開発/公開しているIDE(SikulixIDE)含めたRPAツール群です。
内部ではオープンソースの画像処理ライブラリ「OpenCV」を利用しており画像認識によるGUI操作の自動化が行えるのが特徴です。
SikuliXおよびSikulixIDEは JavaVM 上で動作し、自動化したい処理を記述するスクリプト部分はPython(Jython)もしくはRuby(JRuby)で記述します。
そのため、SikuliXは一般的なRPAツールのような使い方もできますが、「Python」等のスクリプト言語でGUI操作自動化を行うためのツールと考えても良いかもしれません。
ちなみにSikulixIDEは↓のようなUIで直感的に操作することが可能です。
まず、実行/開発環境を準備するにあたり、任意の場所にSikuliXという名前のフォルダーを作成し以下の3つのファイルをあらかじめダウンロードしておきます
| No. | ファイル名 | 入手元URL |
|---|---|---|
| 1. | jPortable_8_Update_221_online.paf.exe | https://portableapps.com/apps/utilities/java_portable |
| 2. | JavaPortableLauncher_5.0.paf.exe | https://portableapps.com/apps/utilities/java_portable_launcher |
| 3. | sikulixsetup-1.1.3.jar | https://launchpad.net/sikuli/sikulix/ |
1. jPortableのインストール
SikuliXはJava環境で動作します。そのため、まずはJavaの実行環境がインストールされていない且つローカルの管理者権限を持っていなくてもJavaアプリを実行させることが可能なツールであるjPortableをインストールします。
□手順 1-1: あらかじめダウンロードしておいたjPortable_8_Update_221_online.paf.exeを実行します
□手順 1-2: 言語の選択画面が表示されるので、そのまま(日本語のまま)OKボタンをクリックします
□手順 1-3: ウィザードが起動するので次へボタンをクリックします
□手順 1-4: ライセンス条件を確認し同意するボタンをクリックします
□手順 1-5: インストール先のパスを確認されるので、そのままインストールボタンをクリックします
□手順 1-6: 無事にインストールが完了したことを確認し完了ボタンをクリックします
2. jPortable Launcherのインストール
続いてjPortableがインストールされた環境でjarファイルを実行するためのランチャーツールであるjPortable Launcherをインストールします
□手順 2-1: あらかじめダウンロードしておいたJavaPortableLauncher_5.0.paf.exeを実行します
□手順 2-2: 言語の選択画面が表示されるので、そのまま(日本語のまま)OKボタンをクリックします
□手順 2-3: ウィザードが起動したら次へボタンをクリックします
□手順 2-4: インストール先のパスを確認されるので、そのままインストールボタンをクリックします
□手順 2-5: 無事にインストールが完了したことを確認したらjPortable Launcherを実行にチェックを入れて完了ボタンをクリックします
□手順 2-6: jarファイルの選択画面が表示されるのでこのままSikuliXのインストールに進みます
3. SikuliXのインストール
jPortable Launcherを使ってsikulixsetup-1.1.3.jarファイルを実行しSikuliXのインストールを行います
□手順 3-1: sikulixsetup-1.1.3.jarを選択して開くボタンをクリックします
□手順 3-2: はいボタンをクリックします
□手順 3-3: 1-Pack1: Iwant SikuliX~にチェックを入れてSetup Nowボタンをクリックします
※使用するスクリプトとして Ruby(JRuby) を選択することも可能ですが、ここではデフォルトの Python(Jython) のみにチェックを入れます
□手順 3-4: 確認のメッセージが表示されるのではいボタンをクリックします
□手順 3-5: Jythonのインストールについて確認を求められるため、そのままはいボタンをクリックします
以上でインストールが完了です
4. 不要ファイルの削除とrunsikulix.cmdファイルの編集
JavaPortableLauncher及びインストーラーやインストール時に生成されたファイルやログは不要なので削除をします。加えて、実行ファイル(cmdファイル)に環境変数JAVA_HOMEを明示的に記載することでJava実行環境としてjPortabaleを使用するように編集します。
□手順 4-1: 以下のファイルとフォルダを削除します
-
JavaPortableLauncherフォルダ -
SetupStuffフォルダ -
JavaPortableLaunher_5.0.paf.exeファイル -
jPortable_8_Update_221_online.paf.exeファイル -
SikuliX-1.1.3-Setuplog.txtファイル
□手順 4-2: runsikulix.cmdを任意のテキストエディタで開きます
□手順 4-3: 18行目にset JAVA_HOME=%SIKULIX_HOME%\CommonFiles\Javaと追記してテキストエディタを終了します
1 @echo off
2 SETLOCAL ENABLEEXTENSIONS
3 set SJAR=sikulix
4
5 if not defined SIKULIX_HOME goto NOHOME
6 if EXIST "%SIKULIX_HOME%%SJAR%.jar" goto YESHOME
7 if not EXIST "%SIKULIX_HOME%\%SJAR%.jar" goto BADHOME
8 set SJAR=\sikulix
9
10 :BADHOME
11 echo +++ SIKULIX_HOME specified but not useable %SIKULIX_HOME%
12
13 :NOHOME
14 set SIKULIX_HOME=%~dp0
15
16 :YESHOME
17 set PARMS=-Xms64M -Xmx512M -Dfile.encoding=UTF-8 -Dsikuli.FromCommandLine
18 set JAVA_HOME=%SIKULIX_HOME%\CommonFiles\Java
19 if not defined JAVA_HOME goto CHECKJAVA
20 IF EXIST "%JAVA_HOME%\bin\java.exe" goto JAVA_OK
21 echo +++ JAVA_HOME specified but not useable %JAVA_HOME%
22 echo +++ looking for Java in system path and then in standard places
:
中略
:
5. SikuliX IDE の実行
□手順 5-1: runsikulix.cmdファイルを実行します
IDE が起動してきます。日本語化もされており細かい制御が不要であれば、Pythonの知識も不要で直感的に自動化スクリプトの定義が可能かと思います。
6. GUI操作自動化サンプル
続いてGUI操作自動化のサンプルとして、あらかじめEXCELに入力されているデータを読み取り、そのデータを電卓に入力(GUI操作)、その結果をテキストファイルに出力してみます
□手順 6-1: インプット用Excelファイルの準備
まずはA列にランダムな数字を記載しただけのExcelファイルを作成しデスクトップ上にインプットファイル.xlsxという名前で保存します
□手順 6-2: SilulixIDEを起動します
runsikulix.cmdファイルを実行します
□手順 6-4: [ファイル]メニューから[名前を付けて保存]を選択し任意の名前で保存します
ここではデスクトップ上にGUI操作自動化サンプルという名前で保存します
するとデスクトップ上にGUI操作自動化サンプル.sikuliという名前でフォルダーが作成されます
□手順 6-5: Excelファイル上のシートの読み取り
まずは、先ほど作成したインプット用Excelファイルのシートを "Python(Jython)" で読み込むところまでを記載します
import os
import subprocess
import xlrd
import datetime
# デスクトップ上にある"インプットファイル.xlsx"というExcelファイルから最初のシートを読み込みます
inputExcelFilePath = os.environ["USERPROFILE"] + "\Desktop\インプットファイル.xlsx"
inputExcelFile = xlrd.open_workbook(inputExcelFilePath)
inputExcelSheet = inputExcelFile.sheet_by_index(0)
:
中略
:
.sheet_by_index(0)で一番最初のシートを読み取ります
※.sheet_by_index(1)と記載すれば2番目のシート読み取ります
□手順 6-6: [電卓]アプリの起動の自動化
次に電卓アプリを起動するところの自動化を記載します
アプリケーションの起動は次のように記載します
:
中略
:
# 電卓を起動します
App.open("calc.exe")
wait(<起動画面のスクリーンショット>)
:
中略
:
App.open("プログラム名")と記載することでアプリケーションの起動を自動化できます
wait()の部分はSikulixIDEの画面左のコマンドリストからスクリーンショットを取得することができます
スクリーンショットで取得した画像が画面上に表示されるまで次の処理がウェイトされます
□手順 6-7: "インプットファイル.xlsx"に記載されている数字を順に[電卓]アプリに入力していく処理の自動化
"Python(Jython)" のforループを使って、Excelシート上のデータを0行目から値が記載されている行まで順に読み取ります
:
中略
:
# 読み取ったExcelシートの0列目から順に値が記載されている内容を1行ずつ読み取り電卓に打ち込みます
for rowNumber in range(0,inputExcelSheet.nrows):
type(str(inputExcelSheet.cell_value(rowNumber,0)))
click(<電卓アプリ上の[+]ボタンのスクリーンショット>)
hover(<電卓アプリ上の[=]ボタンのスクリーンショット>)
:
中略
:
-
type()を使ってキーボードのタイプを自動化します -
click()は、画面左のコマンドリストを使って取得したスクリーンショット部分のクリックを自動化します -
hover()は、画面左のコマンドリストを使って取得したスクリーンショット部分をクリックせずにマウスカーソルのみあわせます
□手順 6-8: 計算結果をテキストファイルに出力する処理の自動化
SikuliXでは[CTRLキー]などの特殊キーのタイプは次のように指示します
| 特殊キー | タイプの指示方法 |
|---|---|
| ENTERキー | type(Key.ENTER) |
| CTRLキー | type(Key.CTRL) |
| SHIFTキー | type(Key.SHIFT) |
| ALTキー | type(Key.ALT) |
| プリントスクリーン キー | type(Key.PRINTSCREEN) |
| PAGEUPキー | type(Key.PAGE_UP) |
| PAGEDOWNキー | type(Key.PAGE_DOWN) |
| HOMEキー | type(Key.HOME) |
| ENDキー | type(Key.END) |
| ↑キー | type(Key.UP) |
| →キー | type(Key.RIGHT) |
| ↓キー | type(Key.DOWN) |
| ←キー | type(Key.LEFT) |
| TABキー | type(Key.TAB) |
| DELETEキー | type(Key.DELETE) |
| BACKSPACEキー | type(Key.BACKSPACE) |
| ファンクションキー | type(Key.F1) |
| ESCキー | type(Key.ESC) |
| SPACEキー | type(Key.SPACE) |
| Windowsキー | type(Key.WIN) |
| INSERTキー | type(Key.INSERT) |
| NUMLOCKキー | type(Key.NUM_LOCK) |
| / | type(Key.DIVIDE) |
| * | type(Key.MULTIPLY) |
| - | type(Key.MINUS) |
| + | type(Key.ADD) |
| CapsLockキー | type(Key.CAPSLOCK) |
| Pauseキー | type(Key.PAUSE) |
| ScrollLockキー | type(Key.SCROLL_LOCK) |
まず、[CTRLキー]+[C]で[電卓]アプリの計算結果をクリップボードに取り込みます
"Python(Jython)" を使ってクリップボードに取り込んだデータをテキストファイルに出力して保存します
:
中略
:
# CTRLキー+Cでクリップボードに取り込んだ電卓の計算結果を変数に取り込みます
type("c",Key.CTRL)
from java.awt import Toolkit
from java.awt.datatransfer import DataFlavor
toolkit = Toolkit.getDefaultToolkit()
clipboard = toolkit.getSystemClipboard()
clipboardContents = clipboard.getContents(None)
culcurationResult = clipboardContents.getTransferData(DataFlavor.stringFlavor)
# 計算結果をテキストファイルに出力します
nowDatetime = datetime.datetime.now()
outputTextFilePath = os.environ["USERPROFILE"] + "\Desktop\アウトプットファイル_" + nowDatetime.strftime("%Y%m%d_%H%M") + ".txt"
outputTextFile = open(outputTextFilePath,"w")
outputTextFile.write("Culcuration result is " + culcurationResult + "." )
outputTextFile.close()
:
中略
:
□手順 6-9: [ファイル]メニューから[保存]を選択して作成したスクリプトを保存します
ここまでの部分で作成したスクリプトです
import os
import subprocess
import xlrd
import datetime
# デスクトップ上にある"インプットファイル.xlsx"というExcelファイルから最初のシートを読み込みます
inputExcelFilePath = os.environ["USERPROFILE"] + "\Desktop\インプットファイル.xlsx"
inputExcelFile = xlrd.open_workbook(inputExcelFilePath)
inputExcelSheet = inputExcelFile.sheet_by_index(0)
# 電卓を起動します
App.open("calc.exe")
wait("1564793193116.png")
# 読み取ったExcelシートの0列目の内容を1行ずつ読み取り電卓に打ち込みます
for rowNumber in range(0,inputExcelSheet.nrows):
type(str(inputExcelSheet.cell_value(rowNumber,0)))
click("1564793209633.png")
hover("1564793224493.png")
# CTRLキー+Cでクリップボードに取り込んだ電卓の計算結果を変数に取り込みます
type("c",Key.CTRL)
from java.awt import Toolkit
from java.awt.datatransfer import DataFlavor
toolkit = Toolkit.getDefaultToolkit()
clipboard = toolkit.getSystemClipboard()
clipboardContents = clipboard.getContents(None)
culcurationResult = clipboardContents.getTransferData(DataFlavor.stringFlavor)
# 計算結果をテキストファイルに出力します
nowDatetime = datetime.datetime.now()
outputTextFilePath = os.environ["USERPROFILE"] + "\Desktop\アウトプットファイル_" + nowDatetime.strftime("%Y%m%d_%H%M") + ".txt"
outputTextFile = open(outputTextFilePath,"w")
outputTextFile.write("Culcuration result is " + culcurationResult + "." )
outputTextFile.close()
# 計算結果を記録したテキストファイルを開きます
subprocess.Popen(["start",outputTextFilePath], shell=True)
□手順 6-10: SikulixIDE画面上部の[実行]アイコンをクリックします
↓ Excelからのデータの読み込みとテキストファイルへの出力の部分はPython(Jython)で[電卓]アプリの操作の部分はSikuliXが行っています
以上、管理者権限を持たないWindows端末に「jPortable」とRPAツールである「SikuliX」をインストールして「Python(Jython)」スクリプトでGUI操作の自動化を試みた際の手順でした。

















