Snippetのコードを改良してUI特性を把握する


# 概要

UiPath Studioで操作対象アプリをレコーディングをすれば、ほとんどの画面操作をアクティビティにすることができます。

しかし、操作する対象のアプリによっては、なかなかアクションを受け付けない場合があります。

受け付けない場合は、
クリックや文字入力の仕方を切り替えたり、3つ（Default, Simulate Click/Type, Send Window Message)準備されており、
最も合う方法を探すことができます。
アクティビティを実施前に、アプリケーションの反応を待つために、ウェイト時間を適切に設けたりする必要があります。
こういったトライアンドエラーを繰り返しながらの開発・チューニングには結構時間がかかります。

そこで、セレクターを用いて、入力できる項目に対して最適な方法を見つけます。


※12/23の段階では、特性把握の為のアイデアを散りばめてあります。
　完成したらもう少し詳しく記述する予定です。

#作り方

大きく分けて以下の３つの方法で特性を把握します。

1. 入力受付項目の抽出
　　Snippetを改良して、入力を受け付ける項目（セレクター、ID、Tag）を抽出します。
　　今回のメインです。

2. 入力受付の試行
　　１で抽出したデータを、入力を実施するアクティビティ（Type Into、Click等)と
　　モードを切り替えながら試していきます。
　　また、ホットキーを打ち込んで動的にチェックが走るか等をチェックします。

3. レポート出力
　　２で試した結果をレポートにまとめます。
　　各モードでの動作時間、成功/失敗状況、参考となるスクリーンショット、
　　ホットキー利用時の挙動などを出力します。


## 1. 入力受付項目の抽出
ベースのプログラムとしてUiPathのスニペットを用います。

使うスニペットは、UiPath Studioに準備されている「For Each Child.xaml」です。

・操作したいアプリケーションを開いておきます。
・スニペットで「For Each Child」を選んで、シーケンスにドラッグします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/235283/edfe2d6a-2d0c-3cd5-aa1f-5bba1a95d849.png" width=75%>
・エラーが発生している「Find children of」で、「画面上で指定」を選びます。

``この時点で調査したい範囲を選択できない場合は、拡張機能が入っているか確認してください。``
``それ以外の場合は、セレクターが使えませんので画像認識で自動化する必要があります。``
``この記事では対象外とします。``

・調査したいエリアを選択します。　（画面はGoogleフォームです。）
<img src="https://qiita-image-store.s3.amazonaws.com/0/235283/0f1a2dff-8c8c-1afc-c5ec-5faed68ab72c.png" width=50%>
・プロパティのスコープを「FIND_CHILDREN」から「FIND_DESCENDANT」に変えます。
　これで、調査したいエリア内の画面要素をすべて対象にすることができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/235283/334a843f-63f5-6bef-d9bf-de430b4277a0.png" width=30%>

ここまでで実行すると、テキスト文字だけが出てきます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/235283/80aa8941-de38-fe18-936d-8cf1d6da4b42.png" width=30%>

Log Message アクティビティを使って、Selectorの文字列を出してみましょう。
プロパティのメッセージに「child.Selector.ToString」と入れます。
同じ入力項目でも冗長なものがあることがわかります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/235283/36ea19a8-01f7-8b73-b2b4-712fdc216a38.png" width=75%>

操作対象の中の傾向を見るために、
tag属性とname属性を抽出して出力してみます。
正規表現で抽出しています。

tag
<pre>System.Text.RegularExpressions.Regex.Match(child.Selector.ToString, "tag='.+?'").Value</pre>

name
<pre>System.Text.RegularExpressions.Regex.Match(child.Selector.ToString, " name='.+?'").Value</pre>

出力してみると、name属性が操作対象になります。
（レコーディングした時も同じIDをつかみます。）

<img src="https://qiita-image-store.s3.amazonaws.com/0/235283/d13c736d-e75b-a9a6-e590-711eb36e4a6e.png" width=75%>

name-SelectorをDictionary<String, UiElement>として格納します。
name-DIVもDictionary<String, String>に格納します。

ループ後にDictonaryのサイズを確認します。


## 2. 入力受付の試行

上の２つのDictionaryを利用して総当たりでのチェックを行います。
以下のようなイメージを試行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235283/ac80ec3a-901d-a4be-cbe7-c212d505ede4.png)

総当たりだと時間がかかりすぎるので、Tagの種類毎に１パターンでもよいと思います。
その場合は以下のようなイメージを試行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235283/6e4743c4-6bb7-3858-75ab-cde1ff0a455a.png)

（実際のサンプルを例示できずにすみません。。）

## 3. レポート出力
　　２で試した結果をレポートにまとめます。
　　以下のような項目をExcel等にまとめてエビデンスとします。

　　・各モードでの動作時間
　　・成功/失敗状況
　　・参考となるスクリーンショット、
　　・ホットキー利用時の挙動
　　
　　また、それ以外のRPAとして動作する環境の判断のために、以下のような情報も収集するとよいかもしれません。
　　・マシンのスペック（メモリ、CPU）
　　・ping動作時間(Webアプリや、共有フォルダに対して）

# まとめ

　　業務上、客先の業務アプリの初期調査で思うように動作できないことがあり、
　　大幅にスケジュールが遅れてしまうことがあった経験から、
　　こういったツールがあれば初期の段階が楽になるかと思います。
　
　　時間の関係で後半以降はアイデアにだけになってしまいましたが、
　　どこかのタイミングで完成させたいと思います。

　　Ui特性の把握はRPAの肝になる部分なので、
　　もっと使いこなせるようになりたいと思っています。

　　乱文乱筆失礼いたしました。
　　ここまで読んでいただきありがとうございました。