フリーズツリーを使った ロボットの処理高速化

## はじめに

BizRobo! には `フリーズ ツリー` という機能があり、それを利用することで `ロボット` の処理速度を上げることができるのですが、何となくわかりづらいという声も聞きます。
今回は `フリーズツリー` について簡単にまとめてみたいと思います。

:::note
本記事は、BizRobo! v11.4.0.2 時点の情報を基に記述しています。
:::
## `フリーズツリー` とは

名前の通り「ツリー」を「フリーズ（凍結）」する機能なのですが、その前に「ツリーって何だ？」「凍結するってどういうこと？」について確認しておく必要があるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/dd251151-34a5-17d1-4f96-ce3b18537e2b.png)

上は見慣れたロボット編集画面の一部です。

BizRobo! では自動化するアプリケーションをウィンドウごと読み込み、見た目のUIと構成情報（ヴィジェットツリー）を上下対に表示します。

ロボットに動作を覚えさせるには上段のUI部分をマウスで疑似操作し、「ステップ」を組んでいきます。

画面によってはUI部分（見た目）だけでは要素を十分に識別得できない場合があったり、画面に表示されていない情報を取得したい場合があります。

そのような場合には下段のヴィジェットツリーから必要な情報を特定するのですが、実際のアプリケーションでは（特にWebアプリに顕著ですが）利用者の操作と独立して画面の情報が更新されたり、UIとして見えない部分でも構成情報が更新されることがあります。

こんなイメージです。👇[^1]

![動く床](http://www.unitygamebox.com/wp-content/uploads/2020/08/01.gif)

[^1]: アニメーションGifはこちらのページから拝借（リンク）いたしました。
https://www.unitygamebox.com/?p=621

BizRobo! の仕様として利用中の意図しない画面変化でロボットがエラーにならないよう、ステップ実行の度にヴィジェットツリーの状況（ `アプリケーション` や `コンポーネント` のファインダー）を確認しています。

👷🚧 安全第一 🚧👷

一方、平地であっても一歩ずつ足元を確認して進むことになるので「遅い」と感じることもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/3951be08-2854-0938-9834-fe62d977ef59.png)

ということで、毎回実施する「ツリー」の状態確認を「凍結（停止）」することで処理のオーバーヘッドを削減し、実行スピードを向上（処理効率の向上）させる機能が `フリーズツリー` ということになります。


## `フリーズツリー` の使い方

1. 対象を決める
1. 範囲を決める
1. 処理を覚えさせる

の３ステップです。

まずは `フリーズツリー` のステップをワークフローから右クリックで追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/78c22dc6-f64c-0e2e-a557-f2cdb2038372.png)

### 1．対象を決める

`フリーズツリー` を適用する `アプリケーション` を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/1d3ddfdf-c399-fcf1-61e6-f4af72e1878b.png)

① `フリーズツリー` ステップの直前に現在位置があることを確認。
② ファインダー（アプリケーション）部分をクリックして緑の枠を確認。
③ 設定するアプリケーションのタブを選択してレコーダービューに画面を表示
④ 上書きアイコンをクリックしてファインダー情報を書き換え

### 2．範囲を決める

具体的に何か作業をするわけではありませんが、`フリーズツリー` が有効なのは、そのステップで囲われた範囲の操作です。

一般的な使い方としては、「特定のページからデータを抽出する」一連の動作や、「特定のページにデータを入力する」一連の動作をにおける適用でしょう。

例えば、「画面上に項目をN個入力すると、画面の表示が一部切り替わるので、その後追加で項目をM個入力する」ような場合、途中に画面の更新が必要となるため、`フリーズツリー` は画面の更新前後で2つ用意することになります。

1つ目の `フリーズツリー` で N個入力をした後、2つ目の `フリーズツリー` で M個入力する。といった感じです。

### 3．処理を覚えさせる

`フリーズツリー` ステップの中にアクションを設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/34a6b015-638b-6bb2-9dae-798bc44532e3.png)


## 効果検証

では、`フリーズツリー` によりどの程度高速化が実現するのか一例を見て見ましょう。

**ユースケース**

* Excel（Built-in-Excel）を読みこんで1行目の10カラムのデータを抽出。
* 順番を逆にして2行目に抽出したデータを書き込み、背景色（黄色）を付ける。 **通常パターン**
* 順番を逆にして2行目に抽出したデータを書き込み、背景色（黄緑色）を付ける。 **高速化パターン**

以下はデバッグ実行の様子を記録したものです。

![Animation256.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/4f2c55c7-eb93-4b1f-3f6d-767bfdc36a00.gif)

この例では、通常の場合 15秒掛かっているのに対し、高速化後は 2秒で処理しています。


## まとめ

結構速くなりましたね。
`フリーズツリー` は DASを使ったリモート端末操作時や、サーバー側実行の場合でも Built-in-Excel に対しては有効に働きます。

一方で、Chromium を使ったブラウザ操作は対象外[^2]です。まぁ、理由はよくわかりませんが、ただ実行速度にストレスを感じるとすれば、DASを使ったデスクトップアプリの操作や、画面要素数の多い Excel 関連かなぁと思いますので、まぁ、いいかな。。。というのが正直なところではあります。

というのも、実際にロボットの処理を遅くしているのはロボットの処理そのものというよりも、必須ではない固定の待ち時間（ガードチョイスによるタイムアウトガードの挿入[^3]）がほとんどなので。

[^2]: 設定することはできますが無視されてしまうようです。

[^3]: 画面遷移やアプリケーション起動時に固定で「5秒待ち」などのステップを挿入している例を多く見かけますが、少なくともv11.4現在においてはロボットが勝手にタイミングをとってくれるので、固定の待ち時間はほとんどの場合必要ないです。（大抵は「ツリーの変更停止」でOK。）