【Power Automate Desktop】ウィンドウ名の変化に対応したUI要素指定

#環境・前提条件
* OS　：　Windows10 Pro (20H2)
* Power Automate Desktop はWin10用の無償版を使っています。
　（バージョンは2021/6/14時点での最新版）
* PowerAutomateDesktopは始めたばかり（2021年5月～）です。
* 基本的なことなのかもしれませんが、検索してもなかなか出てこなかったので記事にしてみたくなりました。

#ウィンドウ名が変わってしまうアプリケーション
* 業務アプリケーション（PCA◎◎）を自動化しようとして、なかなかうまくUI要素を認識させられずにしばらくハマってしまいました・・・
* 一例としてメモ帳もウィンドウ名が変わります。
![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/86be8fcd-8860-1ea7-6e20-c8d7f144e9c5.jpeg)
* 単にUI要素を追加するだけだと、すぐに次のようなエラーがでてしまいます。（メモ帳の場合は、一文字でも追記するとウィンドウ名の先頭に*がついてしまい、ウィンドウが取得できなくなります）
![07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/cac059e7-9c79-4d49-2afa-711810084837.jpeg)

#結論
* UI要素のセレクタービルダーで、指定したいUI要素の親（ウィンドウ）の設定を次のようにする。（ウィンドウの指定は親の階層）
* 
| 属性 | 演算子 | 値 |
|:-:|:-:|:-:|
| Name  | 含む  | ウィンドウ名に含まれている共通のテキスト |

* eq()やプロセスIDなど、ウィンドウ名以外に変化する要素があればチェックを外す、または消しておく。
* eqの中の数字は、１つ目はeq(0)、２つ目はeq(1)・・・と新たにウィンドウを開くたびに増えていきます。
* セレクタービルダーで変化する要素を消せない場合は、画面左下の「カスタム」をクリックして直接編集することで消すことができます。

# セレクターの文字列について
[★UI Automation / Building UI Selectors](https://docs.winautomation.com/V9_1/en/building-ui-selectors.html#building-ui-selectors)

* 上記リンク先は、WinAutomation（Power Automate Desktop のおそらく前身）の説明ですが、Power Automate にも、だいたいは適用できそうな感じです。

```text:セレクターのサンプル
：desktop > window[process="Notepad"][name="無題"] 
デスクトップアプリケーションのメモ帳で開いている、タイトルが「無題」のウィンドウ 

：desktop > window[process="Notepad"][name*="無題"] 
デスクトップアプリケーションのメモ帳で開いている、タイトルに「無題」を含むウィンドウ

：desktop > window[process="Notepad"][name^="無題"] 
デスクトップアプリケーションのメモ帳で開いている、タイトルが「無題」で始まるウィンドウ

：desktop > window[process="Notepad"][name$="無題"] 
デスクトップアプリケーションのメモ帳で開いている、タイトルが「無題」で終わるウィンドウ

：desktop > window[process="Notepad"][name="%FileName%"] 
デスクトップアプリケーションのメモ帳で開いている、タイトルに変数「FileName」を含むウィンドウ
※変数の指定は、%の外側にさらに"で囲みます。
```
変数の指定については、以下の記事を参考にさせていただきました。

https://qiita.com/etoootak/items/d74fc60f9f8e6460b012

#サンプルフロー（動的なウィンドウ名に対応したUI要素指定）
* 実行すると、開いている処理対象のテキストファイルにタイムスタンプ（日付＋時刻）を押して保存・終了します。
* 開いている処理対象のテキストファイルは、「落書き帳2021.txt」というファイル名。
* 来年は「落書き帳2022.txt」となり、ウィンドウ名も変わってしまうという設定です。

##サンプルの概要
![000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/430f2736-f020-52d7-8f34-9457319fed3e.jpeg)

* １行目　該当のテキストファイルが開いていないときに間違って動かないよう「待機」を入れています。
* ２行目　タイムスタンプが押せるよう、テキストが入力できる領域を１回クリックします。
* ３行目　タイムスタンプは最後尾に入れたいので、一旦改行（Return）し、「F5」（タイムスタンプ）をキー送信
* ４行目　上書き保存のショートカット（Ctrl+S）・終了のショートカット（Alt+F4）をハードウェアキーとして送信。ハードウェアキーのオプションを入れないと「s」が文字として入力されてしまう。
* ５行目　上書き確認がでる前提で、ウィンドウ待機をします。（上書き確認がでない場合の条件分岐は省略）
* ６行目　上書き確認ウィンドウの保存ボタンをクリックします。

##UI要素の追加
* メモ帳のメインのウィンドウと、テキスト入力領域の２つを追加します。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/c4645831-de9c-33cd-d08b-7441bd17ad2a.jpeg)
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/f724eff5-479a-f24e-bd82-09d13dfde266.jpeg)

##画面右上の3重菱形のようなボタンで追加したUI要素を確認
* UI要素の管理画面が開きます。
* 追加した２つのUI要素が親子関係の形（下図赤丸の①と②）で表示されています。
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/66dab507-013c-c497-4437-4e17543fcf04.jpeg)

* ②をダブルクリックすると、その中身が見えます。
![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/452fa1f7-a099-0e94-b356-9cad584a842e.jpeg)
* 子（②）の中身は途中からのような記載（> document[Class="Edit"]）になっています。
* 子（②）には、フルパスが記載されない方式のようで、ウィンドウの指定については親（①）の中身に記載されています。　　
* メモ帳のテキスト入力領域のUI要素（子②）を、ウィンドウ名が変わったときでも安定して指定したい場合は、親（①）の中身をいじればOK！
* 親（①）のダブルクリックし、中身の文字列をさらにダブルクリックすると・・・セレクタービルダーが立ち上がります。
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/32ce5105-5078-6a48-c7d4-dc6ad23c2857.jpeg)

* ここで、Nameの演算子を「含む」にし、値を対象にしたいウィンドウの共通のテキストにすれば、ウィンドウ名が変わってしまうような場合でも、動的に対応できるようになります。
* | 属性 | 演算子 | 値 |
|:-:|:-:|:-:|
| Name  | 含む  | ウィンドウ名に含まれている共通のテキスト |
* 値には変数を使うこともできるようです。（上記サンプル参照）

* これで「落書き帳2021.txt」「*落書き帳2021.txt」「落書き帳2022.txt」とファイル名が変わってしまっても、大丈夫なフローになりました！

#UI要素の整理について
##消す前の確認
UI要素がごちゃごちゃしてきて不要なものを消したいときは、

　　右クリック→使用状況の検索

の機能が便利です。（未使用状態にしてから消去）
![08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/f751b08e-3d78-e5f8-b31f-1285e62bb1fc.jpeg)

##UI要素名の変更のコツ
* なぜかわかりませんが、「UI要素名の変更」で名前を変えたいときにマウスで確定をするとうまく反映されません。（バグでしょうか？）
* どこかのタイミングのアップデートで直ることを期待しています。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/837238de-ce62-fa35-2a4a-9d4ebb18dff7.jpeg)
　　　　↑「落書き帳2」に名前を変更し、マウスで確定した場合は、なぜかフローに反映されない。

* 意識してキーボードだけで名前の編集作業と確定（Enterキー）を行うようにすると、きちんと反映されます。
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/0629ed5e-f45f-bb88-a7d4-0c1ea952a453.jpeg)