【WinActor】今日からできるRPAチューニング

この記事は[エイチーム引越し侍/エイチームコネクトAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/hikkoshi)18日目の記事です。本日はエイチームコネクト@namiitaが担当いたします。ソウルフードは沖縄そばです。:ramen:

今年のアドカレもいろんなジャンルの記事があって毎日楽しみにしています。
私は普段の業務でよく触る分野を中心に読んでいるのですが、その中で[RPA (Robotic Process Automation) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rpa)がとてもためになったので、便乗してRPAのことを書きたいと思います。

なお、本記事は**"RPA導入後、シナリオの維持・修正を担当している方向け"**です。導入を検討されている方にも参考になればと思います。:ok_woman:

# 0.RPAおさらい
![図２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/17652e34-3a1a-8cf6-4a10-bb4e4655e147.png)
RPAは「Robotic Process Automation(ロボティック・プロセス・オートメーション)」の略語です。主に定形作業の自動化に使われる仕組みで、「[WinActor®](https://winactor.com/)」はNTTグループが開発したRPAツールの名称です。

画面操作の自動化という点ではSeleniumなどのUIテストツールの仲間と言えますが、非エンジニアでもシナリオを直感的に組み上げることができるのが大きな特徴です。


# 1.RPAを運用にのせるために
皆さんの現場ではRPAをどのくらい活用されていますか？エイチームコネクトでは昨年よりWinActorを使って業務の一部を自動化しており、その結果、業務を大幅に改善することに成功しました。

今でこそ現場で活躍してくれているRPAですが、導入当初はなかなか使ってもらえず、本運用にのせるのにとても苦戦しました。**RPAより社員の方が早く作業をこなすことができたため**です。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/c9e9e1cc-6326-7d60-26a0-87307f2f9584.png)
### せっかく作ったシナリオが使ってもらえない
私が用意したシナリオは半自動化のシナリオで、作業の途中で一時停止したり、選択ボックスに値を入力するフローがあります。

そのため、導入には現場の人の協力が必要不可欠でしたが、肝心の現場からは**「操作にコツがいる」「エラーがストレス」「というか手でやった方が早い(※)」**などの理由で本運用に乗せられないと言われてしまいました。(※…信じたくなくて現場に計測に行ったら本当にRPAより早く動いてた）

RPAが悪いということではありません。シナリオは正確に動き、「業務の半自動化」という目的は達成できていました。ただ弊社の社員が**業務効率化の鬼**だったために、RPA導入の最大の目的であった「業務スピード向上」が達成できなかったのです。

**現場にRPAを超越する社員がいた場合、シナリオのチューニングは必要不可欠です。**
そこで表題です。

# 2.RPAチューニングのすすめ
RPAのシナリオはトライ＆エラーを繰り返して徐々に完成形に近づいていきます。以下はWinActorのコラムからの引用ですが、私が言いたいことはこれに尽きます。
>「RPA」という言葉が、注目を集めています。その使い方は、短期集中型で導入したら終わりというよりも、業務の現場でチューニングを重ねながら長期にわたって成長させていくことで、効果を最大限に発揮するものです。そのため、新入社員に例えられたりもしています。

[RPAの導入を成功させる方法とはRPA 国内シェアNo.1 「WinActor（ウィンアクター）」｜NTTデータ公式サイト](https://winactor.com/column/723/)より
![shinsyakaijin_couple2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/a5f88e05-3da8-d28d-3dd9-2c198d1fb77b.png)

**"RPAは新入社員"**
額縁に入れて玄関に飾りたい、良い言葉です。

作りたてのシナリオは入社初日の新入社員と言えます。シナリオを成長させるのは開発担当である私たちです。RPAが動いているところを何度も観察し、より良いシナリオを目指しましょう。

# 3.シナリオ改善のためにしたこと
以下は、私が手塩をかけて作ったシナリオを無駄にしたくない一心で実施した内容です。WinActorが前提ですが、他のRPAツールにも概ね通用するのではないかと思います。細かい改善の中でも、とくに効果があったと感じたものをピックアップしました。

## 3-1.実行速度アップ
シナリオ自体の実行速度を上げる小ネタです。
どんなフローに関わらず時間短縮できるので、まず一番最初に抑えておきたいところです。

### 【実行速度アップ】ライブラリのカスタム
WinActorには「スクリプト実行」アクションと豊富なライブラリが用意されており、VBScriptをシナリオに折り込むことができます。自作スクリプトを書くも良し、ライブラリ（テンプレート）をそのまま使ったり、カスタムするも良しです。速度改善を図るのであれば、ぜひともカスタムしてみてください。

例えば、ライブラリ「指定クラス内のテキストを取得する」アクションをカスタムしてみます。スクリプトの概要は以下のとおりです。

 * フレームを取得
 * クラス名でフレーム内を検索
 * テキストを抽出

このアクションを以下のように連続して使うフローの場合、フレームを取得する処理は１番最初のアクションだけにあれば良いので、スクリプトを分けてやります。
<img width="573" alt="スクリーンショット 2019-12-17 21.21.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/2f514506-a250-eb68-927c-dfd2b5c84378.png">

アクション間で変数の値を共有したい場合はそれぞれのアクションのプロパティ左下の「変数を他のスクリプトアクションと共有する」にチェックを入れておくのを忘れずに！上記の例だと、最初に取得したフレームを後続のスクリプト実行アクションに使いまわしています。
![ふろー２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/68b32a92-64f2-81b6-01b0-7b3f53a3d398.png)

### 【実行速度アップ】カーソル枠やメイン画面を非表示
シナリオ実行中はできるだけ画面上になにも表示されないようにしましょう。フローチャートで実行中のアクションが点滅するのも、画面上のカーソルに枠が表示されるのも、描写に多少時間がかかってしまいます。

シナリオの設定から「ターゲット枠を表示する」チェックを外し、メイン画面は最小化します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/5f2f8140-5000-5873-488e-dd8348851402.png)

## 3-2.起動〜終了までのフロー見直し
シナリオの中で効率の悪い動きをしている部分を直します。
フローチャートを眺めるだけでなく、動かしながら確認すると改善ポイントが見つけやすいです。

### 【フロー見直し】起動ショートカットの活用
WinActorには起動オプションが存在し、ショートカットアイコンをクリックするだけでスムーズにシナリオ起動できるようになっています。まず「設定＞起動ショートカット生成」から起動ショートカットを作りましょう。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/b781daf7-9a94-e8ce-38a2-d8a4c2387544.png)

* -f シナリオファイル設定
    * 起動時に指定したシナリオを開く
* -d データファイル設定
    * シナリオに使うデータをcsvなどで管理している場合、起動時にデータファイルを読み込む

出来上がったショートカットアイコンのプロパティを見てみると、シナリオとデータファイルが設定されていることが確認できます。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/bad55162-898b-378f-01b2-623fcdb700db.png)

これで目当てのシナリオが１発で開くようになりました。ここから更にお好みの起動オプションを追記することが可能です。私は以下がおすすめです。:ok_woman:

* -r 起動後にシナリオを実行
* -e シナリオの実行完了後にWinActorを終了
* -t メイン画面を非表示の状態で起動

全部設定するとこうなります。↓
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/bc970caa-95ef-5b7b-2f5d-053fa71d7b8f.png)

### 【フロー見直し】キーボード操作を意識する
人間が作業しても同じことが言えますが、マウスではなくキーボードで操作するように意識すると無駄が無くて良いです。**速さを重視する場合、できるだけ「画像マッチング」でクリックする操作を減らしましょう。**例えば、Tab移動できるフォームを画像マッチングのクリックで移動するのは効率が悪いので避けたいところです。

## 3-3.エラー処理短縮
エラーそのものが発生しないようにできればベストですが、実行時の様々な要因でどうしてもエラーになってしまう場合があります。特に半自動シナリオは作業１回ごとに違う操作をするためエラーが起きやすいです。ポイントは細かいエラーでシナリオが中断されないようにすることです。

### 【エラー処理短縮】操作者が復帰しやすいフローにする
作業者自身がエラー復帰をスムーズにできるかどうかでトータルの作業スピードが大幅に変わってきます。そのため、エラーを投げっぱなしにせず、通常のWebアプリケーション同様、例外処理を漏れなく設定します。

例外処理の機能はあらかじめノード「例外処理グループ」が用意されているのでそれを利用します。左の「正常系」枠の中の処理に失敗した時点で右の「異常系」枠の中に処理がスキップするので、エラー時の処理を「異常系」枠の中に書いておきます。
![ふろー5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/96c9c3c6-0402-ac53-0182-7de97a17e23c.png)

シナリオが長くなってくると例外処理の設定漏れが起きかねないので、メインフローを大きな例外処理グループで囲むことをおすすめします。例えば以下のように、処理のまとまりをサブルーチン化して各サブルーチンの中でエラーフラグを設定し、エラーメッセージを出し分けすると作業者がよりエラー復帰しやすくなります。
![ふろー6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/32376bb1-7f89-aaf1-a825-07a7946d4e10.png)

### 【エラー処理短縮】タイムアウトを待ちすぎない
一部のアクションは「タイムアウト」が設定できるようになっています。
![ふろー3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/e740ee83-d4e0-569f-de8a-87ef313b39b6.png)
「画像マッチング」アクションはデフォルトが10秒待つようになっているのですが、そんなに待つ必要がないと判断できるところは思い切って短くしてしまいましょう。例外処理がきちんと設定されていればエラーは怖くありません。

# まとめ
いかがでしたか？本記事が少しでもRPAシナリオ作成のヒントになれば幸いです。
現場の人たちと、シナリオ担当と、みんなで協力して優秀なシナリオを育てていきましょう！:seedling:

# お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](https://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)よりご応募ください！

Qiita Jobsの[エイチーム引越し侍社内システム企画 / 開発チーム](https://jobs.qiita.com/employers/a-hikkoshi/development_teams/176)、[社内システム開発エンジニアを募集！](https://jobs.qiita.com/postings/309)からチャットでご質問いただくことも可能です！

# 明日
明日は@lostfindさんがGoについて書いてくれます。お楽しみに！