7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【#RPA】管理者権限を持たないWindows環境に「jPortable」と「SikuliX」をインストールして「Python(Jython)」のスクリプトでGUI操作の自動化を試みる #pyconjp #PyLadiesTokyo #Excel #自動化 #SikuliX

Last updated at Posted at 2019-07-25

管理者権限を持たない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で直感的に操作することが可能です。

capture_064_25072019_094117.jpg


まず、実行/開発環境を準備するにあたり、任意の場所に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ボタンをクリックします

capture_038_25072019_093308.jpg

□手順 1-3: ウィザードが起動するので次へボタンをクリックします

capture_039_25072019_093312.jpg

□手順 1-4: ライセンス条件を確認し同意するボタンをクリックします

capture_040_25072019_093316.jpg

□手順 1-5: インストール先のパスを確認されるので、そのままインストールボタンをクリックします

capture_041_25072019_093326.jpg

□手順 1-6: 無事にインストールが完了したことを確認し完了ボタンをクリックします

capture_002_25072019_124050.jpg

2. jPortable Launcherのインストール

続いてjPortableがインストールされた環境でjarファイルを実行するためのランチャーツールであるjPortable Launcherをインストールします

□手順 2-1: あらかじめダウンロードしておいたJavaPortableLauncher_5.0.paf.exeを実行します

□手順 2-2: 言語の選択画面が表示されるので、そのまま(日本語のまま)OKボタンをクリックします

capture_044_25072019_093354.jpg

□手順 2-3: ウィザードが起動したら次へボタンをクリックします

capture_045_25072019_093358.jpg

□手順 2-4: インストール先のパスを確認されるので、そのままインストールボタンをクリックします

capture_046_25072019_093402.jpg

□手順 2-5: 無事にインストールが完了したことを確認したらjPortable Launcherを実行にチェックを入れて完了ボタンをクリックします

capture_048_25072019_093412.jpg

□手順 2-6: jarファイルの選択画面が表示されるのでこのままSikuliXのインストールに進みます

capture_049_25072019_093435.jpg

3. SikuliXのインストール

jPortable Launcherを使ってsikulixsetup-1.1.3.jarファイルを実行しSikuliXのインストールを行います

□手順 3-1: sikulixsetup-1.1.3.jarを選択して開くボタンをクリックします

capture_049_25072019_093435.jpg

□手順 3-2: はいボタンをクリックします

capture_050_25072019_093444.jpg

□手順 3-3: 1-Pack1: Iwant SikuliX~にチェックを入れてSetup Nowボタンをクリックします

※使用するスクリプトとして Ruby(JRuby) を選択することも可能ですが、ここではデフォルトの Python(Jython) のみにチェックを入れます

capture_052_25072019_093454.jpg

□手順 3-4: 確認のメッセージが表示されるのではいボタンをクリックします

capture_053_25072019_093459.jpg

□手順 3-5: Jythonのインストールについて確認を求められるため、そのままはいボタンをクリックします

capture_056_25072019_093539.jpg

以上でインストールが完了です

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と追記してテキストエディタを終了します

runsikulix.cmd
 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の知識も不要で直感的に自動化スクリプトの定義が可能かと思います。

capture_064_25072019_094117.jpg

6. GUI操作自動化サンプル

続いてGUI操作自動化のサンプルとして、あらかじめEXCELに入力されているデータを読み取り、そのデータを電卓に入力(GUI操作)、その結果をテキストファイルに出力してみます

□手順 6-1: インプット用Excelファイルの準備

まずはA列にランダムな数字を記載しただけのExcelファイルを作成しデスクトップ上にインプットファイル.xlsxという名前で保存します

capture_002_03082019_121450.jpg

□手順 6-2: SilulixIDEを起動します

runsikulix.cmdファイルを実行します

capture_064_25072019_094117.jpg

□手順 6-4: [ファイル]メニューから[名前を付けて保存]を選択し任意の名前で保存します

ここではデスクトップ上にGUI操作自動化サンプルという名前で保存します
するとデスクトップ上にGUI操作自動化サンプル.sikuliという名前でフォルダーが作成されます

□手順 6-5: Excelファイル上のシートの読み取り

まずは、先ほど作成したインプット用Excelファイルのシートを "Python(Jython)" で読み込むところまでを記載します

GUI操作自動化サンプル(抜粋)
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: [電卓]アプリの起動の自動化

次に電卓アプリを起動するところの自動化を記載します

アプリケーションの起動は次のように記載します

GUI操作自動化サンプル(抜粋)
 :
中略
 :
# 電卓を起動します
App.open("calc.exe")
wait(<起動画面のスクリーンショット>)
 :
中略
 :

App.open("プログラム名")と記載することでアプリケーションの起動を自動化できます

wait()の部分はSikulixIDEの画面左のコマンドリストからスクリーンショットを取得することができます
スクリーンショットで取得した画像が画面上に表示されるまで次の処理がウェイトされます

capture_003_03082019_122759.jpg

□手順 6-7: "インプットファイル.xlsx"に記載されている数字を順に[電卓]アプリに入力していく処理の自動化

"Python(Jython)" のforループを使って、Excelシート上のデータを0行目から値が記載されている行まで順に読み取ります

GUI操作自動化サンプル(抜粋)
 :
中略
 :
# 読み取った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)" を使ってクリップボードに取り込んだデータをテキストファイルに出力して保存します

GUI操作自動化サンプル(抜粋)
 :
中略
 :
# 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: [ファイル]メニューから[保存]を選択して作成したスクリプトを保存します

ここまでの部分で作成したスクリプトです

GUI操作自動化サンプル
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が行っています

GIF.gif


以上、管理者権限を持たないWindows端末に「jPortable」とRPAツールである「SikuliX」をインストールして「Python(Jython)」スクリプトでGUI操作の自動化を試みた際の手順でした。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?