RPAエンジニアの雑記

RPA(Blue Prism)について色々記載してます。

(BluePrism)汎用的にキー送信するオブジェクトを作る ~1 of 2 骨子編~

ちわっす。おむおむです。

最近進めているポケモン図鑑シリーズから外れて、
ちょっと書きたいことがあったので。

以前、コミュニティでこんな投稿がありました。
※Blue PrismのJapan User Communityへの登録が必要です
community.blueprism.com

汎用的にキー送信するオブジェクトある?
とのこと。

一通り探しましたが、確かになさそう。。。
だけど、あったら確実に便利・・・!

ということで、作ってみます☆
f:id:newgraduate19:20200628161945p:plain

機能の要件を確認する

まずは機能要件をまとめてみましょう。

グローバルキー/キーイベント送信のセオリーとして、
アプリケーションをアクティブ化アクションを使用して
キー送信対象のアプリケーションを
アクティブな状態にする必要があります。

そして送信するキーの中に
特殊キー(Ctrl、Alt、Shiftなど)が含まれている場合、
キー送信の時間間隔を入れると内部エラーが発生します。

そのため、入力パラメータの「間隔」には
何も指定しないようにします。

そして、アプリケーションにアタッチする際に
諸々情報が必要になりますが、
プロセス名またはウィンドウタイトル
入力パラメータに指定するような設計にしようと思います。
※アタッチに関しては以下を参照↓
newgraduate19-rpa.hatenablog.com

アプリケーションモデラーを設定する

では実装に入っていきましょう。

アプリケーションモデラーでは、以下のように設定します。

1. 新しいアプリケーションモデルを定義
 アプリケーション名:任意のアプリケーション
2. Windowsアプリケーション
3. アプリケーションは既に実行されており、その既存のインスタンスにアタッチ
4. 対象アプリケーションのウィンドウタイトルを入力
 (入力なし)
5. 対象のアプリケーションのWindowsプロセス名を入力
 (入力なし)
6. アタッチできない場合、アプリケーションは必要に応じて・・・
 (入力なし)
7. それ以降はすべてデフォルトのまま


完了した段階でこんな感じになります。
f:id:newgraduate19:20200628160800p:plain

空っぽです。

テキトーなウィンドウ要素をスパイする

次に、ウィンドウ要素をスパイします。
「アプリケーションをアクティブ化」アクションは
Win32モードでスパイした
ウィンドウ要素にしか使えないからです。
まずはテキトーなアプリケーションを起動し、アタッチします。
自分の場合はメモ帳(notepad.exe)にしました。

そしてウィンドウ全体をスパイします。
「マッチ」のカラム部分をクリックして
チェックがついているところだけをソートすると、
こんな感じになっています。
f:id:newgraduate19:20200628162519p:plain

クラス名」については、
アプリケーションごとに異なるのでチェックを外します。

となると、ウィンドウ要素を一意に識別するためには、
ウィンドウテキスト」属性を
上手いこと使ってあげる必要がありそうですね。

ここをアプリケーションによって動的にするために、
一致タイプ」を
動的」にします。

そして一応「マッチインデックス」にもチェックをつけておきましょう。

最終的にはこんな感じ。
f:id:newgraduate19:20200628163416p:plain

アプリケーションモデラーの設定については、以上で完了とします。

アタッチのアクションを設定する。

続いて、アクションの実装に移ります。

詳細は過去記事参照ですが、
読み取りステージで「接続されているかどうか」、
判断ステージで「[読み取りステージで出力されたフラグ]」、
操作ステージでアプリケーションのルート要素
(今回の場合は「任意のアプリケーション」)で
アタッチ」アクションを選択します。
※入力パラメータについては後述

そしてアタッチが不安定な場合に備えて、
ベストプラクティスからは外れてしまいますが
アタッチのエラーをキャッチし、
一定時間waitしてから何度かリトライできるよう
ロジックを追加しておきます。
f:id:newgraduate19:20200628164227p:plain

こんな感じですね。
ちなみにベストプラクティスに準拠して、
待機時間用の数値型のグローバルデータアイテム
予め初期化ステージに配置しています。

アタッチの入力パラメータ設定

さて、肝心の入力パラメータの設定です。

テキスト型のグローバルデータアイテムとして、
以下の2つを配置します。
ウィンドウタイトル
プロセス名
f:id:newgraduate19:20200628164835p:plain

そしてアタッチアクションに戻り、
操作ステージのプロパティから
入力パラメータを指定していきます。

・ウィンドウタイトル:[ウィンドウタイトル]
・プロセス名:[プロセス名]
・子インデックス番号:0(画像の場合データアイテム)
f:id:newgraduate19:20200628165450p:plain

こんな感じにします。

キー送信アクション

そして本処理である
グローバルキー送信のアクションを作成していきます。

まずは開始ステージのプロパティを開き、
入力パラメータとして
ウィンドウタイトルプロセス名送信キーを追加します。
f:id:newgraduate19:20200628170316p:plain

次に、操作ステージのプロパティを開き、
アクションを2つ設定します。

【1つ目】
要素:ウィンドウ要素
アクション:アプリケーションをアクティブ化
【2つ目】
要素:アプリケーションのルート要素
アクション:グローバルキー送信
入力パラメータ:「テキスト」に「[送信キー]」、「間隔」はなし
【各ステップの後に一時停止】
0.5秒から1秒ぐらい(今回はグローバルデータアイテムを使用)
f:id:newgraduate19:20200628171150p:plain

これで設定完了です!

要素の動的パラメータ

ウソです!
一点、今回のキモといえる部分を忘れていました!

それは、ウィンドウ要素の
ウィンドウタイトル属性の指定です!

操作ステージのプロパティで、
ウィンドウ要素を指定したところの
パラメーター列の三点のやつが
アクティブになっていることが確認できるかと思います。
f:id:newgraduate19:20200628171707p:plain

こいつをクリックすると・・・
f:id:newgraduate19:20200628171805p:plain

先ほどアプリケーションモデラー動的に設定した、
ウィンドウタイトル」属性の値を
設定する画面が開きます。

ここで、このアクション自体の入力パラメータとして与えた
[ウィンドウタイトル]のデータアイテムを指定します。

ただし!
一致タイプを「=(等しい)」のままにしておくと、
ウィンドウタイトルが完全一致しないと
ウィンドウ要素を見つけられずエラーを吐いてしまいます。

そのため、一致タイプを*(ワイルドカードにすることで
部分一致でも見つけられるようにしてあげます。
うーん、ユーザーフレンドリー☆
f:id:newgraduate19:20200628172803p:plain

同様に、グローバルキーイベント送信も
同じように作ります。(テキトー)

大筋としてはこんな感じです。

これだけじゃちょっと味気ないので、
次回コードステージなんかを使って
ユーザーフレンドリー感を増してみます☆

まとめ

・要素タイプを動的にすると汎用性が増す
・その分設定のし忘れや変更がハネる箇所が増えるので注意
・完成したらGitHubとかに上げたい(ジャストアイデア)
・ジャストアイデアなんで
 「ぜひDXにアップしましょう!
 「御社の名前を世界に知らしめるチャンスですよ!」みたいな
 圧かけるのやめてください死んでしまいます