Power Automate Desktop のWebUI要素を自作し、動的に活用する

#### ■ 2021/3/28に完全に蛇足なるとなる情報を追記しました。

# Power Automate DesktopのUI要素って何なん？

Power Automate Desktop（以下PAD）で、ウィンドウやブラウザの部品に対し設定されるUI要素ですが、レコーダー機能やUI要素の取得機能を使って取得するのがセオリーだと思います。
セレクタービルダーを利用して編集が可能ですが、何をどう設定すればいいのかよくわからない。
#### 特にWEB画面でのUI要素。
わたしもそうでした。
色々試してみるうちに法則が見えてきた結果、これ自分で作れそうでは？

ということで法則と作り方を記載します。

# 注意

今回利用するYahoo路線案内は問題ありませんが（2021年3月現在）、
利用規約で自動化を禁止しているサイトも存在します。
ご注意ください。

この記事で作成できないUI要素があるかもしれません。その際はご容赦願います。

# まずはUI要素の取得

Web画面のUI要素はWebレコーダー利用して、取得するのが手っ取り早いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/79f6470b-5c95-180d-4e20-ebb327f1ddaa.png)

画面上部の[Webレコーダー]を選択し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/2a14b336-172b-bd08-767a-d016c60bd4b2.png)

あらかじめ開いておいたWebブラウザで、目的のタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/39c4600f-2863-1e58-3510-6e000f9ecbda.png)

表示されたウィンドウの右上の[記録の開始]をクリックし、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4133e08d-085b-3a9b-a900-ebab5e572872.png)
該当のWebパーツにマウスホバーさせると、図のように赤枠で囲まれるので、ctrlキーを押下しながら左クリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/5dc39a1d-5e79-e61d-e527-0de65ac988f9.png)
マウスホバーの状態で、右クリックするとWebパーツに表示された値を取得する等のアクションも可能です。

Web レコーダーの終了ボタンを押下すれば、記録完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/eb13f23f-fa43-4a90-93e3-4e6757f8df18.png)

# UI要素の内容

取得したUI要素の内容は、[セレクターの編集]から見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/6c30fd46-04c2-e611-2e88-469db9f230e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/d6bba357-ba85-75b8-a953-9569dfda9da2.png)
右側のメニューから[セレクターの編集]を選択すると、編集が可能です。

余談ですが、[UI要素の追加]から追加すると、違った形式でUI要素が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/31e4fba6-5c06-475e-7a3e-45349ca3c92c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/91e58edb-c848-f6f4-6399-83d9d6109211.png)
今回はこの形式での作成は行わないため、詳細は割愛します。

# UI要素の理解

UI要素を理解するためには、対象WebページのHTML構造を知る必要があります。

ブラウザ上で右クリックメニューより[ページのソースを表示]を選ぶと、HTMLが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/e843c34e-6d07-3728-3b61-ab6684340f45.png)

これをVisual Studio Codeに貼付け下記の設定をします。
・言語モードをHTMLに変更
・ドキュメントのフォーマットで整形
・[表示]-[外観]-[サイドバーを表示]
・サイドバーで右クリックし、[アウトライン]
・サイドバー上部の三点メニューより、[カーソルに追従]
・サイドバー上部の[すべてを折りたたんで表示します。]（下記）でアウトラインをすべて折りたたみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b720a281-299c-98cc-544b-b5705ba98b17.png)

ここまで設定したら、HTMLより目的の部品のエレメントを選択すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b1229068-0344-ee12-ff1e-b248fb308d55.png)
サイドバーのアウトライン表示に、選択したWebパーツ要素までの階層構造が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/d984fefd-685c-fd42-2913-c40598b10c8d.png)

# UI要素の構築
ここまでこればもうUI要素が作成できたも同然です。

上記で取得したHTML階層構造から、
####htmlタグから順に、下矢印になっているタグ（展開されているタグ）を『 > 』で繋いでいくだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/8399f8c5-c4cb-e2c1-c6e2-c78b85b91a80.png)

この図ですと下記のようになります。

```
html > body > div > div > div > div > div > ul > li > a
```

ただし、同一階層に同じタグが複数存在する場合は注意が必要です。
↓こことか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/1c7e8e86-d312-dd4f-ea46-c1daca52e52c.png)

この場合、
#### 同一階層の何番目のタグを選択するのか指定する必要がありますので、『:eq([添え字]』を付与します。
※添え字は0からスタートになりますので、この例では上から2番目＝「1」になります。

```
html > body > div > div:eq(1) > div > div:eq(1) > div > ul > li > a
```

こうなります。
この部分にもliタグが同一階層に6個並んでいますが、1番目のものを指定する場合は『:eq([添え字]』はつけなくても問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/034a284b-180d-f4f4-61fa-83ac1566f1a9.png)

#### 2021/3/28 ここから追記
逆に、同一階層に指定するタグが一つしかない場合に、『:eq(0)』を付けてもPADでは動きます。（笑）

```
html:eq(0) > body:eq(0) > div:eq(0) > div:eq(1) > div:eq(0) > div:eq(1) > div:eq(0) > ul:eq(0) > li:eq(0) > a:eq(0)
```

↑ これでも動きます
#### 2021/3/28 ここまで追記

これで、目的のWebパーツへのUI要素を作ることができました。



# フローでUI要素を動的に指定する

さらに、UI要素に変数を組み込むことで、フローにおいて動的にWebパーツを指定することが可能です。

一例ですが、下記のようなテーブル構造のWebパーツより、テーブル情報を取得するようなフローを組む場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/783b7ba0-96ea-e385-aeea-496ab611c64e.png)

セオリーは、Webレコーダーでテーブル構造をまるっと取得する方法になると思います。

1行目の1列目から要素の抽出を行い、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/3f3ae458-49b0-80de-4fb2-56f70504c59f.png)

2行目の2列目から同様に抽出すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/ac9d7c77-d2ea-32ca-f806-0ad600ba039b.png)

列の情報が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0b253d2c-7cdc-7a47-9104-fb71da8e470d.png)


さらに、1行目の2列目の要素を抽出し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/2842ece7-1dce-addd-849a-1ffdda69a269.png)

3列目、4列目・・・と全ての列に対して、1行目の要素を抽出すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4df8dec3-2258-c4cd-2711-c4acf9605edb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/668f1d40-cfb1-1356-e919-3417464d7269.png)


テーブル全体の要素が、DataTable形式で取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/11893845-8f02-8d1d-a1ea-44fae13db4e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/e2319f66-1ba6-ad85-7541-6d9ac441db8c.png)


が、
#### 「全行の情報はいらない」とか、「列が多くて大変」というような状況では、以下のような、UI要素を動的に指定する方法が有効です。


処理としては下記のように左上から一行の項目を順に取得し、次の行で同様に左から取得という処理になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/061a484b-68cd-1387-8266-eb94bcb24f6d.png)

下記のように縦方向のループの中に、横方向のループをネストし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/534deea3-df78-36a6-db15-8ccd3f5d8909.png)

HTML構造とにらめっこしながら、テーブル構造の行と列を表現している階層を見つけ、

↓列の横方向の配列を定義している階層
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/88e898fa-6ba9-cc12-f075-e7791c63007a.png)

↓行の縦方向の配列を定義している階層
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/c9153950-9706-938f-8663-e8e07b992c42.png)

UI要素の該当の箇所に、Loop処理で生成される変数を設定します

```
html > body > div > div:eq(1) > div:eq(1) > div > div > div:eq(1) > div > ul:eq(1) > li:eq(%LoopIndex2%) > dl > dd > ul > li:eq(%LoopIndex1%)
```

実行すると、下記のように値が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/147dc1b4-6ad9-9a7c-fb75-21e2d6b172aa.png)

# まとめ
PADのUI要素の中身を解読できると、動的にWeb部品を指定できます。
より、効率よくフローを構築するの役立ちそうです。