【UiPath】UI操作自動化の＋αの知識

# はじめに
UiPathでロボットを作っていくにあたって、上手く動作させるために必要な＋αの知識をまとめる。

# クリック
基本的に、「クリック」アクティビティを使う。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/9ab6b024-15c2-4882-261b-14dfa63d64c9.png)

クリックアクティビティを使うとき、プロパティの「クリックをシミュレート」と「ウィンドウメッセージを送信」が重要で、この設定値を変えて色々試しながらワークフローを作ることになる。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/973188ca-570d-b049-5a0f-b98a6e363d05.png)

プロパティの設定で試すべき順番：

1. 「クリックをシミュレート」をTrueにする。
    * このプロパティをTrueにすると、操作対象のアプリケーションへAPIを使ってクリックする。バックグラウンドで動作するため、マウスカーソルがいちいち動かないし、素早く動作する。ただ一部のアプリケーションでは動作しないため、動作確認してから使うとよい。**このプロパティを有効にするとダブルクリックが出来ないので注意。**
2. 「ウィンドウメッセージを送信」をTrueにする。
    * こちらも「クリックをシミュレート」と似たようなものでバックグラウンドで動作する。
3. 上記2つを両方ともFalseにする。
    * 実際のマウスを動かしてクリックするのと同じ動作をする。ほぼ100%動作するが、画面上のマウスカーソルが実際に動くため、ロボット動作中にうっかりマウスを触ったりすると、影響を及ぼしてしまう。

参考：
[UiPath Studio シングルクリック・ダブルクリックを実装する際のデシジョンフロー](https://www.uipath.com/ja/resources/knowledge-base/decision-flow-single-double-click)
[UI Automation](https://docs.uipath.com/studio/lang-ja/docs/ui-automation)


# 文字を入力する
基本的に「文字を入力(TypeInto)」アクティビティを使う。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/49159bf7-e4d4-0fa9-23d6-8ae7a2a1f1fc.png)

文字入力にも「入力をシミュレート」と「ウィンドウメッセージを送信」のプロパティがあり、順番に値をTrueにして動作するかどうか試すと良い。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/3fdfe83e-c62d-86fb-34a0-7b528a6f2ca0.png)

「入力をシミュレート」と「ウィンドウメッセージを送信」のいずれもFalseになっている場合、キーボードを1つずつ入力するように文字が入力され、動作が若干遅い。また、IMEの影響を受けるため、ひらがな入力モードで日本語を入力させようとすると、最後に確定させる必要が出てしまう。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/dd75c901-9d48-e1e4-4e64-3764a9f10a11.png)

この事態をどうしても避けられない場合は、クリップボードを使い、コピー＆貼りつけで文字入力する手段もある。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/12f3457a-e3f1-14af-8a1f-3b31d061aa60.png)

可読性が落ちるが、最終手段として有効ではある。

# 画面の文字を取得する

「フルテキストを取得」と「表示中のテキストを取得」のいずれかを検証しながら選択する。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/bcd923bc-1864-7608-f00c-d89117a44a8f.png)

どちらが良いか検証するためには、メニューの「画面スクレイピング」を押して起動する画面で色々試すと良い。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/fea555a3-3722-af20-3c7a-75abae18c636.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/e17828d4-cc46-d48f-12fc-5808f26ef288.png)

早さ、正確さから試す順番は「フルテキスト」→「ネイティブ」→「OCR」となっている。

参考：
[出力メソッドまたは画面スクレイピングメソッド](https://docs.uipath.com/studio/lang-ja/docs/output-or-screen-scraping-methods)

# 待機する
「待機」アクティビティで指定した秒数(あるいは分)だけ動作を止めることができるが、例えばアプリケーションの起動やWebページが表示のを待つのであれば、代わりに「要素を探す」アクティビティを使う方が良い。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/1c1bd492-9ce9-7dda-9e4c-b6bcc6adf923.png)

このアクティビティを使うと、指定したUIが画面に出てくるまで待機する。プロパティに「表示されるまで待つ」というオプションもあるため、これをTrueにすると確実に表示されるまで待機したりする。

例えば、Webページの自動化でファイルダウンロードがあるとする。ダウンロードのリンクをクリックした後、Webサイトによってはファイルが保存できるようになるまで、若干の間があったりする。このとき、「要素を探す」アクティビティを使って通知が表示されるまで待機させると、確実に動作しやすいロボットに一歩近づく。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/db75958f-752e-2a7a-bf8f-bf354104b81a.png)

# ユーザーと対話する
ロボットにおいても、ワンタイムパスワードの入力や、判断条件が複雑でワークフローに落とし込めない場合など、完全に自動化せず人間による操作を間に挟むことがある。
その場合、ロボットは動作を止めてユーザーの操作を待つ必要がある。やはりここでも「待機」アクティビティは使用せず、他の方法を使う。

## ユーザーへ通知する
「ツールチップ(Callout)」アクティビティを使用し、指定の場所へ吹き出しを表示してユーザーへ操作を促すことができる。
(ちなみにこのアクティビティは以前は「吹き出し」という名前だったが、最近(v19.10.1？)は名前が変わり「ツールチップ」になっている。「吹き出し」アクティビティもまだあるが機能が別物になっている)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/5bfd3579-069c-550e-61bf-9f58235e0b2e.png)

ツールチップは、既定では表示時間が設定されておらず、「OK」を押すまでずっと表示されていて、ワークフローの動作が一時停止する。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/0ca5fa82-4222-1136-e688-4ede273bad6f.png)

この特徴を利用して、ユーザーが「OK」を押すまでロボットを待たせることができる。一方、プロパティの「タイマー」を指定してツールチップの表示時間を決めると、ツールチップが表示されている間だけロボットの動作が停止する。
(ちなみにこのタイマープロパティも、以前のバージョンではTimespan型での指定だった)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/e8847354-94d0-228c-d462-c3844a10b915.png)

この場合、後述の方法を使ってユーザーの操作を待つフローを追加する必要がある。

## ユーザーの操作を待つ
「イベントを監視」と各種トリガーを使用し、ボタンのクリックやエンターキーの押下を監視する方法がある。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/1ac3670f-074e-6107-0744-e5865241cf41.png)

まず「イベントを監視」アクティビティを設置した後、その中に監視するトリガーのアクティビティを設置する。既定では「無限に繰り返す」プロパティがTrueになっているため、監視が無限に繰り返されて先に進まない。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/de64d037-3539-25a5-836a-ed8e3115f06a.png)

トリガー監視が1回だけで良ければ、「無限に繰り返す」プロパティはFalseにする。

トリガーを使ってユーザーの操作を待つ以外に、ユーザーが操作した後の状態になったかどうかを監視する方法もある。たとえばGoogleの検索画面だったら、最初のホーム画面から検索結果ページへ移ればユーザーが検索ボタンを押したと判断できる。そのため、検索結果ページが表示されるまでひたすら待つことでユーザーの操作を待つということができる。

実装方法としては、「要素の有無を検出」アクティビティを使い、結果がTrueになるまでひたすらループを繰り返せば実現できる。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/77d16edc-d5fd-31ce-bd89-ad871509bec5.png)

無限に待機することに問題がある場合は、指定時間が経過したらタイムアウトするように仕掛けておくと良い。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/eed628f0-3304-01c4-fbd4-dc740322771f.png)

# セレクタ

## ワイルドカードを使って変化に強くする

アプリケーションやWebサイトなどのウィンドウにアタッチする際、タイトルバーのテキストをセレクタとするケースがほとんどになる。しかし、タイトルバーのテキストは、意外と変化しやすいことに気を付けておくと良い。Excel(365)を例にすると、ただファイルを開いただけの時点では、セレクタは「ファイル名 - Excel」となっている。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/8ce4ae4a-b0d2-635d-fc6f-6f1e4e3d018f.png)

しかし、このファイルを編集して保存すると、後ろの部分が「保存しました」という文字に変わる。この状態でUiPathでセレクタを取得してみると、title属性のテキストも「保存しました」が付いたものへ変わっている。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/fbe6aa91-1925-f3f2-aef5-e32368da9d7a.png)

こうなると、最初に指定したセレクタでは「保存しました」が付いた状態のExcelにアタッチできなくなる。これを回避するには、セレクタにワイルドカード(*)を指定し、変化する場所を無視できるようにしておくと良い。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/2361adb5-4733-39ee-6940-75f9526791e1.png)

この例以外にも、社内システムなどでログインユーザー名がウィンドウタイトルに入る場合がけっこうあるので注意が必要。一人で開発している間は問題が起きないが、運用で別のユーザーでログインしたりする場合に途端に動かなくなってしまう。

## UI Explorer を使って色々試してみる

「画面上で指定」を使って自動生成されるセレクタは基本的には有効だが、たまにセレクタが非常にあいまいで、画面が少し変化すると違う場所をクリックしてしまうことがある。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/bd35b2fc-8304-0cd9-ba81-e9b93f345b65.png)

こういう場合は、UI Explorer を使用してセレクタを編集し、より確実なセレクタに近づけると良い。
UI Explorer はクリックアクティビティなどセレクタを使用するアクティビティのメニューの「UI Explorerで開く」から起動できる。
(UiPath Studio のメニューからも起動できるが、この方法を使うと特定のアクティビティのセレクタを直接編集できる)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/beed5a56-9faa-5970-071f-029de1ca7996.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/ccf6518d-180e-6ac5-527b-9847b63a721b.png)

セレクタの編集には、HTMLやDOMの知識が必要になってしまうが、親要素もセレクタに含めるなどして、より確実に目的の場所を特定できるようなセレクタを作ると良い。
さきほどのYahooの例の場合、セレクタの階層にHEADERタグを追加し、より目的の要素からずれにくくすると良いかと思う。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/01923fc1-8968-c4db-80d9-0751f6d4df30.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/ae1ec855-4561-5b44-e2e0-337a7aa9c027.png)

[セレクターについて](https://docs.uipath.com/studio/lang-ja/docs/about-selectors)

# Webサイトの自動化

## ファイルダウンロードに使用するブラウザ
IEの方が自動化しやすい。
Chromeの場合、画面下部に表示されるダウンロードファイルの部分が認識できない。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/8ba8a365-bfaa-aca4-b1bb-564ae5915fa0.png)
このままでは、UIを頼りにしたダウンロード完了の確認が難しい。なおかつ、自動的にダウンロードフォルダへ保存される点も注意が必要。