BizRobo! DAで処理が空振ってしまう原因と対策（アプリ選択編）

## はじめに

私の知る限りBizRobo！以外のRPAツールはPCなど端末側にロボットが配布され、直接その端末で動作します。
起動する時点で端末が固定されているので、ロボットの命令中に「どの端末で実行する操作か」という情報は含みません。

一方のBizRobo！はサーバでロボットが起動して必要に応じて端末を操作する仕組みなので、端末処理を記録するときには
1. どの端末で（デバイス）
1. なんのソフトの（アプリケーション）
1. どの場所を（コンポーネント）

操作するのか指定します。

といっても人が手動で値を「設定」する必要はなく、レコーダービューで画面イメージを操作することによりDAが自動的に操作を記録します。人は後からその結果を調整してあげる程度ですが、まぁ、その調整に手こずることもありますね。

今回は「端末で同じソフト（以降アプリケーション）が複数起動している場合に、どうやってそれを判別するの？」という素朴な疑問について記述してみたいと思います。

:::note info
実際には経験ないですが、BizRobo！の場合1つのロボットで複数の端末を操作することができます。
一つのロボットが複数の端末A～Cに対して順番に処理を回してしていくようなこともできるかもしれないですね。
例えば無理やりですが、A端末でデータ入力・申請し、B端末で申請内容承認し、C端末で決済・印刷するまでを一気通貫で行うとか。。。
自己承認はだめですね。😱
:::

## アプリケーションの指定方法

DAエディターには以下の通り端末で起動されているアプリケーションがタブ形式で表示されます。
例えば特定のアプリケーションをフォーカスし画面を前面表示させたい場合、以下のようにタブでアプリケーションを指定して「フォーカス」をメニューから選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/b2e2c063-af12-1f40-e4f6-9a5c7adbbbd1.png)
するとDAがその命令を受け取って以下のように処理ステップを自動的に生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/6e3be850-bda7-0e4d-688e-0111c96e3130.png)
アプリケーションとして指定された値（firefox.exe）はプロセス名と同一です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/984b04db-ca4d-4896-1fc7-f8565d83b425.png)

DAが値をセットしてくれるので何も難しいことはないのですが、それゆえ以下一度ハマると抜け出しにくかったりします。

## 同じプロセス名のアプリが複数起動しているとき①
以下の場合、どちらもアプリケーションは「firefox.exe」であり前述の設定ではどちらのブラウザを操作すべきか判別できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/1bf3f738-76a0-3b29-807f-b2eafd0f8cc7.png)
このような場合には以下のようにプロセス名に続けて属性を設定することによりユニークにします。
それにより処理対象の画面が一意となりロボットも迷わず操作を継続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/9b2c2d1d-f34a-3508-dab3-a16e6b3b0681.png)
属性としてどんな値がよさそうかは Widget Tree から判断しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/da089b36-c62b-3a8f-1944-7e39f07bea74.png)

:::note info
ちなみに手っ取り早く属性を設定する方法としては、あらかじめ複数アプリを開いた状態で「アプリケーションの指定」操作をすることです。
ロボットに操作を記録させる時点で複数のアプリが開いている場合、DAは自動的にアプリのタイトル情報を属性値として設定します。
:::

## 同じプロセス名のアプリが複数起動しているとき②
では、次のようにどちらも同じタイトル情報を持っている場合はどうでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/ed801394-1f0f-35f1-3d83-5d7b6bb6954c.png)
Widget Tree を見比べてみると `processId` 以外はすべて同じ値で見分けがつきません。とはいえ `processId` は起動の都度変更される値なので識別子としても使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/e3539fb4-f79d-5c1a-282a-5540bee48d5d.png)
こういった場合DAはどうやってアプリケーションを判別するのか、試しにレコーダービューから操作してみたところ `:nth-of-type(1)` というセレクタが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/7477ff09-2e5b-cf76-9c0e-8f3768148676.png)
これは [CSSセレクタ](https://webliker.info/css-selector-cheat-sheet/) による記法で、`X:nth-of-type(N)` という表示は XのN番目の子要素を意味します。
```
notepad.exe[title="*無題 - メモ帳"]:nth-of-type(1)
```
は、__1番目に開いている「*無題 - メモ帳」というタイトルのメモ帳__ という意味になります。  
なので2番目（起動順）に開いたメモ帳を指定したいときには `:nth-of-type(2)` となるわけですね。


:::note warn
パターン②の場合には基本的には起動順でアプリケーションを判定する必要がありますが、仮に起動の順番が実行時の状況やタイミングにより特定できない場合、両方を順番に選択してコンポーネント内の値（今回の場合であれば「1個目」「2個目」）を読み取ることでしかどちらのアプリケーションが正しいのか判断できないのかなと思っています。

ちなみに、コンポーネント評価の前提条件としてアプリケーションが特定されている必要があります。ゆえに以下のようなアプリケーション自体が一意になっていない状況下ではコンポーネントの評価は行われず、Location Foundも空振ってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524794/52bf1d32-0c62-b529-8fec-57d5600f7a03.png)

:::



## まとめ

特段知っていなくても何となくロボットを触っていると気づいたりしますが、気づくまでの探索の時間を省略するために書いてみました。

---

関連記事はこちら

https://qiita.com/macrisis/items/6eacd98207b4b963403c