【Blue Prism】プロセスとアプリの足並みを揃える

# はじめに
日頃、Blue prismの開発案件を担当しておりますが参画したての頃こんなエラーに良く遭遇していました。

* **最速のデバッグだとプロセスがエラーになる**<br>
* **セッション実行にした途端上手く動かなくなる**<br>

後輩からも似たような相談を受ける事が増えたので今回はここにまとめようと思います。<br>
## 今回使用した動作環境
* Blue Prism ver6.10.1

## 自動化したもの
今回は、「[yahoo路線情報](https://transit.yahoo.co.jp/)を起動し、運行情報をクリックする」を自動化しました。<br>
アプリを起動し、下記画像の「運行情報」ボタンをクリックします。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/1f61f288-0bcb-8931-d983-aaef0d7d1f64.png)

# よくある原因
多い事象として以下が考えられます。<br>
* **アプリで読み込み時間が発生し、その間にプロセスの処理が進んでしまう**<br>
* **アプリだけ先に進んでしまいプロセスが追い付かない**<br>

要するにプロセスとアプリ間の動作で足並みが揃っていない事が原因です。<br>
これらは、オブジェクトやプロセスの実装を修正すれば大抵解決できるのでその方法を下記にまとめてみました。<br>
## オブジェクト側の対策
### 1.画面遷移する場合は、遷移後の要素が存在するか待機ステージを入れる
アプリの起動やボタンを押して画面遷移を行う場合は、遷移後の画面が表示されているか<br>
待機ステージを入れて確認しましょう<br>
この「起動」ステージの後に・・・<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/91cfbc6d-1884-f9fd-6609-2c23ed06af93.png)
待機ステージを入れ、起動後の要素が存在するか確認しましょう。<br>
今回、遷移後に確認する要素は画面赤枠のロゴにしました。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/b33a2756-6c4e-e44d-ea44-4f5d11bd29fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/b1c20647-deb2-4655-9443-56b4f1a81da5.png)
### 2.待機ステージの条件は「親ドキュメントの読み込み完了」に設定する
待機プロパティの条件には「親ドキュメントの読み込み完了」を指定します。<br>
これにすると「**要素が存在し且つ画面の読込みが完了しているか**」を確認できるまで待機するので<br>
オブジェクトがアプリの動作と合わせてくれます。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/9fa49b43-f52c-0ac3-11a5-fe85f8375d13.png)

アプリによっては画面遷移に時間がかかる場合もあるのでその都度、待機時間を調整する必要があります。<br>
## プロセス側の対策

### リトライロジックを実装する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/c5263877-b8c9-3a68-ad12-d4d4cb21bda6.png)
オブジェクトの修正は完了しました。<br>
次はプロセスにも一工夫しましょう<br>
こうする事で予期しないエラー等が発生してもリトライするので稼働の安定性が向上します。<br>
配置した各データアイテムの詳細は以下の表をご確認ください。<br>
|  データアイテム  |  説明  |
| ---- | ---- |
|  Retry Limit  |  リトライの上限を設定する  |
|  Retry Count  |  現在のリトライ回数をカウントする  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/88447f25-a9aa-f54c-7771-24ae0bb29451.png)
リトライの判断をする「再試行？」の判断ステージには以下のロジックを実装しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/a1021c71-ca4c-1f7e-e3ff-51f03dab78e8.png)
```
[Retry Count]<[Retry Limit]
```
オブジェクト側でビジネス例外などを実装しており、その時はリトライをさせない場合は以下のように設定します。
```
[Retry Count]<[Retry Limit] AND (Lower(ExceptionType())=
"system exception" OR Lower(ExceptionType())="internal")
```

追加で配置した計算ステージには以下のロジックを実装しています。<br>
#### 追加した計算ステージのプロパティについて
リトライをする際はここで現在のリトライ数に+1します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/1d2832ea-a12d-69ef-0612-e842524686ab.png)

ここでは、前の処理でリトライした回数を「0」にリセットしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/48f20de6-ab18-6b72-0bbc-bb5784cf4621.png)

### 補足
上記のリトライ実装では、**起動**アクションのリトライをそのまま実行しますがアプリケーションによっては
2重起動を避けるため以下のようにリトライ時に「Kill Process」アクションを入れるパターンもあります。<br>
これを入れる事でアプリを強制終了できます。<br>
|  オブジェクト名  |  アクション名  |
| ---- | ---- |
|  Utility - Environment  |  Kill Process  |

|  入力プロパティ  |  値（例）  |
| ---- | ---- |
|  Process Name  |  起動させたプロセス名を入力する（例：google chromeならchrome,Microsoft Edgeならedgeなど）  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/b6d4ff6b-bdf9-0c05-9eba-75e1f099982e.png)
# さいごに
いかがだったでしょうか？<br>
今回はプロセスとアプリで動作にズレが起きない対策についてまとめてみました。<br>
弊社では他にも
* グローバルマウスクリックを行う際、「右クリック」を行う方法

* ウィンドウサイズの取得方法

などBlueprismの開発で得たナレッジ・小技などを記事にしておりますので
そちらも是非参考にしていただければと思います！