こんにちは。完全自動化研究所の小佐井です。
RPAとプログラミングの基礎を身に付ける連載の第2回です。
この記事は第1回目の続きとなっています。第1回目を実践していない方は次の記事をお読みください。
無料のオープンソースRPA「SikuliX」を使って、RPAとプログラミングの基礎を身に付けましょう。
1) IT歴20年。開発から業務改善まで幅広く経験してきました
2) 複数の企業において2016年からRPA内製化をサポートしています
3) RPA関連の書籍を5冊出版しています
第2回目の今回は「条件分岐」について解説します。
RPAも学びたいけど、同時にプログラミングも学びたいという方に最適な記事になっています。
実際に手を動かしてSikuliXを操作しながら、お読みください。
それでは、どうぞ!
条件分岐を学ぼう
さっそく開発を始めていきましょう!
これから作る自動化の動作を確認しよう
今回はテキストファイルに名前を付けて保存するシナリオを開発します。
テキストファイルに名前を付けて保存すると、1回目は成功します。2回目も同じ動作をさせると、すでに前回保存したファイルが存在するので上書き保存するかどうか聞かれてしまいます(図1)。
このときの対応方法をプログラミングすることで、「条件分岐」を学んでいきます。
図1:自動化の動作
この連載ではRPAの基本を解説すると同時にプログラミングの基礎も解説しています。どちらも同じ原理だからです。
今回は図2の2番目の条件分岐を解説しながら、RPA開発でよくあるパターンもマスターします。
図2:フロー制御
まず準備をしましょう
「【第1回】Sikuliで学ぶRPA超入門:順次処理でRPAの威力を実感しよう」で使ったプログラムを使いますが、前回作ったプログラムと区別するために別名で保存します。
SikuliX開発画面のメニュー「ファイル」をクリックし(図3❶)、「名前を付けて保存」をクリックします(図3❷)。
図3:名前を付けて保存
前ページのプログラム作成のあと、SikuliX開発画面を終了した方は、「【第1回】Sikuliで学ぶRPA超入門:順次処理でRPAの威力を実感しよう」のおまけ3(ページの一番下の方)にプログラムの開き方を載せていますので、参考にして「JB100101.sikuli」を開いてから、この処理を行ってください。
図4のポップアップが出るはずです。
図4:保存ダイアログ(1)
フォルダ名に「\JB100102」と書き加えて(図5❶)、「Save」をクリックしてください(図5❶)。
図5:保存ダイアログ(2)
これで「JB100102.sikuli」というフォルダーが作成されました
ロボの開発を始めます
実行してください
今保存した「JB100102.sikuli」を一度実行してください。リボンにある「実行」をクリックでしたね。実行後は図6のようにHello.txtに「Hello」と入力された状態で終了します。
図6:実行後のHello.txt
名前を付けて保存します
メニュー「ファイル」→「名前を付けて保存」→ファイル名を「Hello2.txt」としてデスクトップ上に保存する、という手順をロボにやらせます。
まず、12行目にコメントを記述しておきましょう(図7❶)。Enterキーを押して改行することを忘れずに。次にコマンドリストの「click()」をクリックします(図7❷)。
図7:開発画面
クリックすると、Hello.txtをダブルクリックするプログラムを作成したときと同様、画面が暗くなって範囲選択できるモード(キャプチャーモードに移行)になります。
メモ帳の「ファイル(F)」の部分を選択してください(図8❶)。選択が完了すると、ソースコードウィンドウに「click(キャプチャした画像)」というプログラムが生成されます(図8❷)。
図8:メモ帳の選択とソースコードウィンドウ
次は「名前を付けて保存」のクリックです。少しテクニックが必要ですよ。
「名前を付けて保存」は「ファイル」をクリックすると出てくるメニューですから、普通には見えていませんので、キャプチャーできません。どうすればいいでしょうか?
答えはキャプチャーモードになる前に、メモ帳の「ファイル」を素早くクリックする、です。
やってみましょう!
コマンドリストの「click()」をクリックします(図7❷と同じです)。画面がキャプチャーモードになる前に素早く、メモ帳の「ファイル」をクリックします(図9)。
図9:メモ帳のメニュー「ファイル」をクリック
画面が暗くなったら、「名前を付けて保存」を範囲選択します(図10)。
完了するとソースコードウィンドウにプログラムが生成されます。これは、もうおなじみのパターンになったと思います。
図10:「名前を付けて保存」をキャプチャする
もっと階層が深いところにあるメニューをキャプチャーすることになったら、どうすればいいでしょうか?
実はキャプチャモードになるまでの時間は変更することができます。
SikuliXのメニュー「ファイル」をクリック(図11❶)、「環境設定」をクリックします(図11❷)。
「環境設定」画面が表示されるので、キャプチャーを実行するまでの時間を3秒に変更します(図11❸)。
もっと、ゆっくりしたいなら5秒くらいにしてもいいですね。「OK」をクリックします(図11❹)。「References have been saved」画面が表示されるので、「OK」をクリックします(図11❺)。
図11:環境設定の変更
一度、ここでプログラムを振り返っておきます。
図12のようになっていますか?
なっていなければ、戻ってやりなおしてくださいね。
プログラムはメモ帳と同じようにバックスペースキーやデリートキーで消すことができますよ。
図12:現在のプログラム
続けていきます。メモ帳を選択して、メニュー「ファイル」→「名前を付けて保存」をクリックしてください。図13のように「名前を付けて保存」ダイアログが表示されます。
図13:メモ帳の「名前を付けて保存」ダイアログ
ファイル名の所にカーソルが当たっているので、直接キーボードからタイプすることができます。「Hello2.txt」とタイプすることにしましょう。
SikuliXの開発画面を開いて、コマンドリスト「type」をクリックし、「Hello2.txt」と入力します(図14)。
図14:コマンドリスト「キーボードの動作」
できたら、次は手動でメモ帳のファイル名のボックスに「Hello2.txt」をタイプしてください。「SikuliXに記録して、同じことを手動でも実行してゆく」という手順です。
では、保存するプログラムを作成しましょう。
例によって、SikuliX開発画面のコマンドリスト「click」をクリックし、「名前を付けて保存」ダイアログの「保存」を範囲選択します(図15)。
範囲選択してプログラムを生成するパターンは、もう慣れてきたと思いますので、画像は省略していきます。
図15:「名前を付けて保存」ダイアログの「保存」をクリックさせるプログラム
プログラムが生成できたら、図16のようになっているはずです。
図16:現在のプログラム
このままだと、マウスやキーボード操作が早すぎるので、sleepを入れて、ロボの動きを遅くします(図17)。
図17:現在のプログラム(sleepを入れた後)
では、手動で「名前を付けて保存」ダイアログの「キャンセル」をクリックしましょう。
何も聞かれずに「名前を付けて保存」ダイアログが閉じます。
メモ帳を終了します
ここから、保存した「Hello2.txt」を終了するプログラムを解説します。
メモ帳の右上にある「×」で閉じてもいいのですが(【Memo】方法は一つじゃないよを参照)、確実に動作させるために、メニュー「ファイル」→「メモ帳の終了」をクリックしましょう。
メモ帳は、「×」をクリックして終了してもいいです。
でも、もし図18のような状態になったらどうでしょう?どちらの「×」をクリックすればいいのかわかりませんよね?
それは、SikuliXも同じです。なので、なるべく確実に動作する方法を選択します。
図18:画像が混乱した状態
もう一つ、やり方があります。ショートカットコマンドを利用するやり方です。
メモ帳が画面の一番上にあり選択されている状態(アクティブになっているといいます)でキーボードのAltキーとFキーを同時に押します。
するとメニュー「ファイル」をクリックしたのと同様、ファイルのメニューが開きますね。次にXキーを押すと、メモ帳は閉じます。
これを同じ動作をSikuliXにさせればいいのです。この方法が一番確実です。
このように、同じ操作をするのでも複数の方法があります。いろいろなやり方があるんだ、というのだけ知っておきましょう。
正解はないので、楽しく謎解きする気持ちで気楽にいきましょう!
SikuliXのソースコードウィンドウを操作してください。
19行目は改行してスペースを開けます。
20行目にコメントを入力しておきましょう。「#メモ帳を終了する」と入力します。
さて、メモ帳の終了は、「名前を付けて保存」で行った方法とほぼ同じことをやります。
SikuliXの開発画面のコマンドリスト「click」をクリックし、キャプチャーモードになったら、メモ帳の「ファイル」を範囲選択します。これで、「ファイル」をクリックするプログラムが自動生成されます。
次に、もう一度、SikuliXの開発画面のコマンドリスト「click」をクリックし、キャプチャーモードに移行する前に素早くメモ帳の「ファイル」をクリックします(図19❶)。
キャプチャーモードになったら、「メモ帳の終了」を範囲選択しましょう(図19❷)。
キャプチャーモードへの移行する時間が短すぎて、上手くメニュー操作ができないときは【Memo】環境設定の変更を参照してください。
図19:メモ帳の終了をキャプチャー
実行してみましょう
ここまでのプログラムを振り返ってみましょう(図20)。そして、SikuliXのプログラムを上書き保存して(Ctlキー+Sキーで保存できます)、実行しましょう。
図20:現在のプログラム
SikuliXが動いて、結果としてデスクトップ上に「Hello2.txt」が作成されます(図21)。うまく動きましたか?
図21:デスクトップ上にHello2.txtが保存された状態
もう一度実行しましょう
では、一息ついたところで、もう一度SikuliXを実行してみてください。今度はすでにHello2.txtがデスクトップ上にあるので、図22のダイアログが出てきて、プログラムはここで失敗しますね?
図22:名前を付けて保存の確認ダイアログ
21行目のclick(ファイルの画像)までは動くのですが、22行目のclick(メモ帳の終了の画像)が現れないのでエラーとなってしまうんです。
メッセージウィンドウに「[error] FindFailed…」と赤文字で書かれています。FindFailedとは「画像が見つからなかったよ」ということです(図23)。
これを回避するようプログラムしましょう。
図23:エラーを確認
ダイアログが出たときだけ、上書き保存するようにしましょう
Hello2.txtがすでに存在し、「名前を付けて保存の確認」ダイアログが出たときだけ上書き保存するようにプログラムしましょう。ちょっと難しくなりますので、ゆっくりやっていきましょう。
19行目にカーソルを持っていきEnterキーを押し、一行段落をあけます。20行目に「#名前を付けて保存を確認が出たときは上書きする」とコメントを入れて、Enterキーを押します。今、カーソルは21行目にありますね。
21行目に図24の内容を打ち込んで、Enterキーを押してください。 次の22行目はカーソルが右にずれて点滅しています。通常、スペース4つ分右にずれているはずです。これを「インデント」と言います。
if exists():
図24:プログラム
「if」とは「もしも」というプログラムです。「exists」とは「存在する」という意味ですので、つなげると「もしも、存在していれば」ということになります。そのあとの()の中は、後で入れるのですが、何らかのキャプチャー画像が入ります。
つまり、この文は「もし、()の中の画像が存在すれば、これから下に記述する内容を実行しますよ」というプログラムです。同時に「もし、()の中の画像が存在しなければ、下に記述する内容は実行しません」ということにもなります。
これがプログラムの基礎2つ目の「条件分岐」です。
図25:制御フロー
条件により、実行される処理が変わるときに使います。条件分岐の文法について詳しく知りたい方は以下の記事をご覧ください。
参考SikuliXにおける条件分岐(IF文)の書き方22行目からプログラムを続けます。インデントしていますね。その状態でコマンドリスト「click」をクリックし、「名前を付けて保存の確認」ダイアログの「はい」を選択します。選択し終わると図26のようになります。
図26:追加したプログラム
次に、「名前を付けて保存の確認」ダイアログのヘッダー部分が存在したら「はい」をクリックする、というプログラムを完成させます。
21行目の「if exists()」の()の間にカーソルを合わせます(図27❶)。この状態でリボンにある「スクリーンショットを撮る」をクリックします(図27❷)。
図27:スクリーンショットを撮るをクリック
画面がキャプチャーモードに移行しますので、「名前を付けて保存の確認」ダイアログのヘッダー部分を選択します(図28)。
これで、「名前を付けて保存の確認」ダイアログが見つかったら、「はい」をクリックする、見つからなかったら何もしない、という条件分岐プログラムが完成しました。
図28:スクリーンショットを撮る
さらに、もう一度実行してみましょう
プログラムは図29のようになっているはずです。できていれば、SikuliXを保存します。
図29:現在のプログラム
まだ、メモ帳の「名前を付けて保存の確認」ダイアログが出たままですので、「はい」をクリックしてダイアログを閉じ、Hello2.txtを終了させてください。
デスクトップ上にHello.txtとHello2.txtが見えている状態で、SikuliXの「実行」をクリックします。
今度はエラーが出ずに完了しましたね!?
さらにさらに、もう一度実行してみましょう
今度はHello2.txtを削除して、もう一度実行してください(図30)。この場合は、「名前を付けて保存の確認」ダイアログが出てきませんが、問題なく完了しましたね。しっかりと条件分岐できています。
図30:Hello2.txtを削除する
まとめ
このページではプログラムの基本構造の2つ目「条件分岐」について学びました。条件分岐を使う機会は本当にたくさんあります。
この条件分岐プログラムのことを「if文」と呼ぶことも多いですよ。覚えておいてください。
これで、「順次処理」と「条件分岐」という2つの基本構造がわかりました。プログラムの基本構造はあと一つだけです!
でも、次回は一回寄り道します。最後の基本構造を学ぶために必要な知識、「変数」について学びますよ!