RPAの画面要素分解機能でいろいろなアプリの画面を分解してみた

# RPAが画面を操作する仕組み
RPAで画面操作の自動化をする手段として一般的に用いられているのが**「画面要素分解」「UI要素分解」「セレクター」「UIタグ」**などと呼ばれている手法です。主要なRPAベンダーではたとえば**UiPath**や**Automation Anywhere**などがこの方法に対応しています。(**WinActor**は画像認識による方法であり、標準ではこの方法はサポートしていません)

この「画面要素分解」の手法は、Windows のAPIを使っているため、対応しているどのRPAツールでもほぼ同じように分解できます(できるハズです)。

### MSAAとUI Automation
Windowsで実装されている「画面要素分解」のAPIには[**MSAA (Microsoft Active Accessibility)**](https://ja.wikipedia.org/wiki/Microsoft_Active_Accessibility)と[**UI Automation**](https://ja.wikipedia.org/wiki/Microsoft_UI_Automation)があります。UI AutomationはMSAAの後継にあたるAPIです。これらは元々スクリーンリーダーや音声合成ソフトウェア等に対応するためのソフトウェアの**アクセシビリティ(支援テクノロジー)**を標準化するために生まれたAPIですが、この仕組みを使うことで画面操作をする際のUI要素を抜き出すこともできるのです。

UiPathでは「デスクトップレコーディング」においてUIフレームワークとしてMSAAとUI Automationの両方に対応しています。**既定の状態ではMSAAを使う**ようになっており、場合に応じてUI Automationも選択できるようになっています。レコーディング中に `F4` キーで切り替えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/2517db76-e915-2a31-854e-d3bbd872fdd7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/0b9e891e-cf31-69a6-d8d5-01fa1a91eb32.png)
UI ExplorerでもUIフレームワークを選択することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/94580345-bbe3-3114-2ebd-b0c503a69dbe.png)

Automation Anywhereの場合、A2019の「ユニバーサルレコーダー」ではTechnology Typeは**MSAA一択**です。v11ではUI Automationを含めいくつかの他の手法にも対応していたので選択肢が狭まっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/51c81783-2ae6-0b57-6d55-f49dfc10e796.png)

### MSAAとUI Automationの動作の違い
この2つのAPIですが、実際に使ってみて画面要素分解を行ってみると、動作が違う部分があります。

以下はUWP (Universal Windows Platform)で作られたMicrosoft StoreアプリをUI Automation/MSAAでUI要素分解してみた例です。UI Automationでは右上の最小化、最大化、閉じるボタンがそれぞれ認識されている一方、MSAAだと3つの領域がひとまとまりで認識されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/2a7ffa79-cc8a-73ec-b0b6-a2b057b7f078.png)

これはどのRPAツールで試すかによっても違うことがあります。特にブラウザーの場合は特別なプラグインが必要な場合もあるため、動作が違うようです。

また、試す回や手順などによって動作が異なってくる対象アプリもあるようで、一部動作不安定なところもある可能性があります。


### Windows SDKのInspectで同等の機能が試せる
MSAAやUI AutomationはRPAツールのレコーダーで実際に使うことができるが、同じAPIはWindows SDKに含まれている**Inspect.exe**というツールで再現できる。
入手方法は以下の記事を見てください。

[Inspect.exe のインストール (Windows SDK)](https://qiita.com/RPAbot/items/f1d6438c8f2500db65ae)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/b562f8ec-fd68-d40d-bd61-1e1caa9df5f8.png)

Inspect.exeを起動している間は、マウスカーソルを置いている部分の画面要素が分解され、黄色い枠でハイライトされます。
Inspect.exeツールのウィンドウの左上のドロップダウンでMSAAかUI Automationかを選ぶことができます。


# 様々なアプリを試してみる
せっかくなので、Inspect.exeを使って、さまざまなアプリで画面要素分解がきちんとできるかどうかを試してみました♪

### 電卓
Windows付属の標準アプリでUWPです。MSAAでは右上の最大化、最小化、閉じるボタンが分解できないことを除いて問題なく要素分解できます。「常に手前に表示」モードになっているときは、黄色い枠が電卓ウィンドウの下に隠れてしまうため、黄色いハイライトが表示されなくなりますが、Inspect.exeのウィンドウの中を見ると、それぞれのボタンにマウスカーソルをホバーさせると、正常に要素が分解されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/f1fc8136-cd9e-6097-9cc3-5c8abad45501.png)

### メモ帳
Windows付属の標準アプリですが、こちらはWin32アプリで、しかもレガシーな部類です。本体のエディットコントロール、メニュー、ダイアログボックスなど、一通り問題なく要素分解可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/06020b46-9470-5063-f8bd-f8ead7e730ce.png)

### ワードパッド
Windows付属の標準アプリで、Win32アプリですが、リボンなども実装されています。リボンのタブやボタンなども含め大方問題なく画面要素分解できますが、リッチエディットコントロールの上の「ルーラー」は、つまみまで分解できないため、ここをRPAで操作するのは難しそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/179ec285-926f-0f98-6072-32c5cc633b65.png)

### ペイント
こちらもWindows付属の標準アプリで、Win32アプリ、リボンも実装されています。こちらはリボンの中のカラーパレットとキャンバスの中は完全にカスタムドローイングで、中身は要素分解できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/43d09590-b1b3-b8e9-499d-13cd6c2871cb.png)

また、ここで使われている色の編集ダイアログボックスも、Windowsの標準ダイアログボックスではあるのですが、カラーパレットの指定部分は分解できないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/b8dad89b-793d-9233-6666-577e8b6d6299.png)


### エクスプローラ
タスクバーやスタートメニュー、デスクトップやフォルダなどのエクスプローラウィンドウの中に表示されるアイコンなどの要素はばっちり分解してくれます。ただし、スタートメニューなどは表示されるのに少し時間がかかるため、RPAで画面操作したときに動作が安定するかどうかは微妙なところです。

### Microsoft Excel
Excelといえば、Microsoft Office (もしくはOffice 365 / Microsoft 365)に含まれる代表的なアプリケーションですね。マイクロソフトがアクセシビリティにも力を入れて開発しているアプリなので、細かいところまで画面要素分解が可能に作られています。

MSAAとUI Automationを使ったときの違いですが、実はスプレッドシートはMSAAを使うとひとつのキャンバスのように認識されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/16fd673e-27a4-48be-53c3-a8d9c0836f17.png)

しかし、UI Automationを使うと、なんとセルの一つ一つまで分解が可能となっています。Excelのスプレッドシートの中身を触る際にはUI Automationが必須となってきます。もっとも通常はRPAツールではExcel関連のアクティビティからExcelのCOM Object Modelを通して操作する方が安定性が良いですが♪
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/6f00388a-d2d7-9a1c-dd80-4c29ace92d37.png)

また、数式バーの左上の部分は、MSAA/UI Automationのいずれでも分解できない部分がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/c7d25432-212b-7193-aaba-7c25c17a0364.png)

ちなみに、ExcelをはじめとしたMicrosoft Officeアプリで使われているカラーパレットは、ひとつひとつの色まで要素分解できる構造になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/1da21fa2-1691-45e7-9392-dd5803a3da3c.png)
さすがに、このUIの先にあるダイアログボックスになると、カスタムドローイングの部分が出てくるようですが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/4b6979f3-d22c-6b03-a907-5c092f4fdf58.png)


### Microsoft Word

Excelと同じく、文書部分はMSAAでは分解されず、UI Automationだと段落単位くらいでコンテンツも認識して分解します。
ワードパッドと同じく、ルーラー部分はこれ以上分解できないようです。
その他はだいたい要素分解してくれます。

### Microsoft Outlook
こちらもかなりの部分が画面要素分解可能です。MSAAだとメール一覧のリストや、メール本文 (読み取り専用/編集可能エディットコントロール)は、ひとつのコントロールとして認識され、中身までは分解できません。UI Automationを使うと、リストの中の項目の一つ一つや、メール本文の段落単位 (箇条書き、ハイパーリンクのカタマリの認識を含め)でコンテンツも分解の認識をします。

### Microsoft Teams
こちらもチャットの中のコンテンツ (吹き出しの中に書いた表のセルの一つ一つ etc.)まで、要素分解が可能です。タイトルバーのところに文字がないのでウィンドウタイトルがどれなのか迷いますが、" XXXXX | Microsoft Teams"のようなウィンドウタイトルになっているのがそうで、スレッドのタイトルになっていたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/e678075c-0d4a-13cb-9727-97c4bdfe4cd8.png)


### Zoom
Zoomはホームページダイアログは特に問題なく要素分解できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/915bf41d-081d-bd6c-ebfd-fef3e1441b99.png)

会議中のウィンドウは、下のツールバーがマウスがホバーしたときにのみ表示される仕組みになっているため、MSAAだとマウスをツールバーエリアをホバーさせてもツールによっては取れないことがある (Inspect.exeだと取れない、UI Explorerだと取れる)。

MSAAの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/69bf1355-aaad-817a-5cc0-bb3ce61ab23d.png)

UI Autmoationにするときちんと取ることができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/021a2afe-2d89-59cb-f1e6-fa9c6aed4375.png)


### Internet Explorer
ブラウザーのページキャンバスの中身はMSAAだとアプリケーション (UI Explorer etc.) によっては取れないことがあるようです。inspect.exeでは取れていました。UI Automationでは、ブラウザーのページキャンバスの中身のコンテンツもHTMLコントロールの単位で分解して取得できます。ツールバーやタブは問題なく分解できます。

### Firefox
Internet Explorerとほぼ同じですが、MSAAでもUI Automationでは、ブラウザーのページキャンバスの中身のコンテンツもHTMLコントロールの単位で分解して取得できます。ツールバーやタブも問題なく分解できます。

### Chrome / Edge (Chromium版)
Firefoxと同じです。ツールバーやタブも問題なく分解できます。

### Adobe Acrobat Reader
1年前のビルドでは、UI要素分解ができないコントロールが多かったAdobe Acrobat Readerですが、2020年12月現在の最新のビルドでは、きちんと掴めるようになっていました。(ただ、試す回によっては赤い部分が相変わらずつかめない場合があり、動作が不安定である可能性があります。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/d95bd05b-a86a-8c87-f83a-cb315d6e3301.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/a6164793-9b01-1f41-66e8-cfad2147e1f4.png)

参考:(1年前の記事)
[【UiPath】アンカーを使ったコントロールの指定についてもう一度解説!](https://qiita.com/Okura_/items/6e8ac244485c740023ee)


### Lotus Notes (IBM Notes 9.0 Social Edition)
メニュー、タブ、ツリービューなど、基本的な要素はある程度要素分解できる。リッチエディットコントロールに貼られている添付ファイルも要素分解できるため選択が可能です。ただし、ツリービューでの選択など、実際にRPAで動かしてみると思い通りに動かない箇所もあるため、RPAで動作をさせるには工夫が必要になる場合があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/cdea8a74-852a-655e-784c-349722aa938a.png)
<font color="Green">緑</font>: MSAA、UI Automationとも分解可能
<font color="Orange">橙</font>: UI Automationで分解可能、MSAAは不可。
<font color="Red">赤</font>: いずれでも分解できない