#環境・前提条件
- OS : Windows10 Pro (20H2)
- Power Automate Desktop はWin10用の無償版を使っています。
(バージョンは2021/6/14時点での最新版) - PowerAutomateDesktopは始めたばかり(2021年5月~)です。
- 基本的なことなのかもしれませんが、検索してもなかなか出てこなかったので記事にしてみたくなりました。
#ウィンドウ名が変わってしまうアプリケーション
- 業務アプリケーション(PCA◎◎)を自動化しようとして、なかなかうまくUI要素を認識させられずにしばらくハマってしまいました・・・
- 一例としてメモ帳もウィンドウ名が変わります。
- 単にUI要素を追加するだけだと、すぐに次のようなエラーがでてしまいます。(メモ帳の場合は、一文字でも追記するとウィンドウ名の先頭に*がついてしまい、ウィンドウが取得できなくなります)
#結論
- UI要素のセレクタービルダーで、指定したいUI要素の親(ウィンドウ)の設定を次のようにする。(ウィンドウの指定は親の階層)
属性 | 演算子 | 値 |
---|---|---|
Name | 含む | ウィンドウ名に含まれている共通のテキスト |
- eq()やプロセスIDなど、ウィンドウ名以外に変化する要素があればチェックを外す、または消しておく。
- eqの中の数字は、1つ目はeq(0)、2つ目はeq(1)・・・と新たにウィンドウを開くたびに増えていきます。
- セレクタービルダーで変化する要素を消せない場合は、画面左下の「カスタム」をクリックして直接編集することで消すことができます。
セレクターの文字列について
★UI Automation / Building UI Selectors
- 上記リンク先は、WinAutomation(Power Automate Desktop のおそらく前身)の説明ですが、Power Automate にも、だいたいは適用できそうな感じです。
: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」を含むウィンドウ
※変数の指定は、%の外側にさらに"で囲みます。
変数の指定については、以下の記事を参考にさせていただきました。
#サンプルフロー(動的なウィンドウ名に対応したUI要素指定)
- 実行すると、開いている処理対象のテキストファイルにタイムスタンプ(日付+時刻)を押して保存・終了します。
- 開いている処理対象のテキストファイルは、「落書き帳2021.txt」というファイル名。
- 来年は「落書き帳2022.txt」となり、ウィンドウ名も変わってしまうという設定です。
- 1行目 該当のテキストファイルが開いていないときに間違って動かないよう「待機」を入れています。
- 2行目 タイムスタンプが押せるよう、テキストが入力できる領域を1回クリックします。
- 3行目 タイムスタンプは最後尾に入れたいので、一旦改行(Return)し、「F5」(タイムスタンプ)をキー送信
- 4行目 上書き保存のショートカット(Ctrl+S)・終了のショートカット(Alt+F4)をハードウェアキーとして送信。ハードウェアキーのオプションを入れないと「s」が文字として入力されてしまう。
- 5行目 上書き確認がでる前提で、ウィンドウ待機をします。(上書き確認がでない場合の条件分岐は省略)
- 6行目 上書き確認ウィンドウの保存ボタンをクリックします。
##UI要素の追加
##画面右上の3重菱形のようなボタンで追加したUI要素を確認
-
UI要素の管理画面が開きます。
-
子(②)の中身は途中からのような記載(> document[Class="Edit"])になっています。
-
子(②)には、フルパスが記載されない方式のようで、ウィンドウの指定については親(①)の中身に記載されています。
-
メモ帳のテキスト入力領域のUI要素(子②)を、ウィンドウ名が変わったときでも安定して指定したい場合は、親(①)の中身をいじればOK!
-
ここで、Nameの演算子を「含む」にし、値を対象にしたいウィンドウの共通のテキストにすれば、ウィンドウ名が変わってしまうような場合でも、動的に対応できるようになります。
-
| 属性 | 演算子 | 値 |
|:-:|:-:|:-:|
| Name | 含む | ウィンドウ名に含まれている共通のテキスト | -
値には変数を使うこともできるようです。(上記サンプル参照)
-
これで「落書き帳2021.txt」「*落書き帳2021.txt」「落書き帳2022.txt」とファイル名が変わってしまっても、大丈夫なフローになりました!
#UI要素の整理について
##消す前の確認
UI要素がごちゃごちゃしてきて不要なものを消したいときは、
右クリック→使用状況の検索
##UI要素名の変更のコツ