Enterprise 技術情報 Enterprise Technical information
外部との連携 KompiraからWindowsGUIアプリケーションを操作する (1/2)
運用の中で既に利用されているアプリケーションを自動化することができれば、運用効率の向上が期待できます。しかし、そのアプリケーションのインターフェースがGUIしか存在しない場合、それを自動化することは容易ではありません。
そこで本稿では、「KompiraからWindowsGUIアプリケーションを操作する」方法(全2回)を紹介します。
初回である今回は、Windowsアプリケーション操作ライブラリFriendlyを用いて、Windowsの代表的なアプリケーションの「メモ帳」を操作します。
2回目は、KompiraからWindowsに接続し、メモ帳を操作する方法を紹介します。
図: 全体像
動作確認環境
ソフトウェア | バージョン |
---|---|
Kompira | 1.4.10.post10 |
LinuxOS | CentOS6.10 |
または
ソフトウェア | バージョン |
---|---|
Kompira | 1.5.5.post7 |
LinuxOS | CentOS7.8.2003 |
Windowsアプリケーションの自動操作
Windowsアプリケーションを自動操作する方法には、以下の2種類の方法が考えられます。
・マウスやキーボードをエミュレートする
・ボタンやテキストボックスなどUI要素にアクセスし操作する
ここでは、 時刻や内部データに応じて、UIの表示量や表示順が変わる場合でも、確実に操作できる「UI要素にアクセスし操作する」方法を取り上げます。
Friendly
Friendlyとは、Codeer社が開発したWindowsアプリケーション操作用ライブラリです。Friendlyを使用することで、対象アプリケーションに別のプロセスからアタッチし、操作することができます。
Friendlyによるメモ帳の操作
以下は、「メモ帳」の編集欄に任意の文字列を入力するコンソールアプリケーションのコードです。
このアプリケーションを実行すると、メモ帳を触ることなく、メモ帳に”buz”という文字列を表示することができます。
using System; using System.Diagnostics; // Fiendlyライブラリの読み込み using Codeer.Friendly; using Codeer.Friendly.Dynamic; using Codeer.Friendly.Windows; using Codeer.Friendly.Windows.Grasp; using Codeer.Friendly.Windows.NativeStandardControls; using Ong.Friendly.FormsStandardControls; namespace kompira { class Program { static int Main(string[] args) { int processid = int.Parse(args[0]); // プロセスへアタッチ及び構成要素へのアクセッサ取得 Process process = Process.GetProcessById(processid); WindowsAppFriend app_notepad = new WindowsAppFriend(process); WindowControl main_window = WindowControl.FromZTop(app_notepad); NativeEdit txt_edit = new NativeEdit(main_window.IdentifyFromDialogId(15)); // 編集欄への書き込み string test_txt = "buz"; txt_edit.EmulateChangeText(test_txt); return 0; } } }
Friendlyライブラリの読み込み
Friendlyのライブラリを読み込みます。
using Codeer.Friendly; using Codeer.Friendly.Dynamic; using Codeer.Friendly.Windows; using Codeer.Friendly.Windows.Grasp; using Codeer.Friendly.Windows.NativeStandardControls; using Ong.Friendly.FormsStandardControls;
Friendlyはnugetに登録されているので、プロジェクト設定ファイル.csprojに以下の設定を追加することで、使用することができます (※)。
<Project Sdk="Microsoft.NET.Sdk"> <!-- 省略 --> <ItemGroup> <PackageReference Include="Codeer.Friendly" Version="2.5.2"/> <PackageReference Include="Codeer.Friendly.Windows" Version="2.9.0"/> <PackageReference Include="Codeer.Friendly.Windows.Grasp" Version="2.7.1"/> <PackageReference Include="Codeer.Friendly.Windows.NativeStandardControls" Version="2.6.0"/> <PackageReference Include="Ong.Friendly.FormsStandardControls" Version="2.6.1"/> </ItemGroup> <!-- 省略 --> </Project>
※ または、以下のように開発環境上で以下のコマンドを実行すると、.csprojに自動的に上記が追加することができます。
> dotnet add package Codeer.Friendly.Windows.Grasp --version 2.7.1
プロセスへアタッチ及び構成要素へのアクセッサ取得
プロセスIDを指定し、メモ帳のプロセスへアタッチします。
メモ帳は、下図のように、「編集欄」と「ステータスバー」から構成されます。
図: メモ帳の構成
編集欄のIDを指定し、アクセッサ(text_edit)を取得します。
Process process = Process.GetProcessById(processid); WindowsAppFriend app_notepad = new WindowsAppFriend(process); WindowControl main_win = WindowControl.FromZTop(app_notepad); NativeEdit txt_edit = new NativeEdit(main_win.IdentifyFromDialogId(15));
構成要素のIDを取得するためには、別途、アプリケーションの解析が必要となります。
アプリケーションの解析方法については、後ほど説明します。
編集欄への書き込み
取得したアクセッサを使い、文字列を編集欄へ書き込みます。
string test_txt = "buz"; txt_edit.EmulateChangeText(test_txt);
アプリケーションの解析
構成要素を指定・操作するためには、対象となる要素のIDを知っておく必要があります。IDは、専用のツールを用いてアプリケーションを解析することで得ることができます。
TestAssistant
TestAssistantはCooder社が提供するGUI解析用ツールです。以下からダウンロードすることで使用することができます。
「https://www.codeer.co.jp/CodeAndTool」
TestAssistantによるメモ帳の解析
それでは、TestAssistantを使って、メモ帳を解析してみましょう。
1. メモ帳を起動します
2. TestAssistantを起動します
3. メモ帳にアタッチします
テスト対象プロセス選択ボタンを押して、対象アプリケーション(=メモ帳)にアタッチします
4. 要素の解析を行います
4.1. トップレベルウインドウ解析ボタンを押下します
4.2. 中央ペインで、編集欄をクリックすると、右ペイン下の表に指定した要素の情報が記載されます
本稿では、DialogId=15を用いて、記入欄の要素にアクセスします(※)
※ 要素のIDには、複数の種類が存在します。アプリケーションによっては、同じIDを持つ構成要素が存在するため、状況に応じてIDを使い分けてください。
TestAssistantによる操作のキャプチャ
TestAssistantには、アプリケーションの操作をキャプチャする機能が存在します。この機能を用いることで、アプリケーション操作の実装が簡単になるため、覚えておいた方がよいでしょう。
1. メモ帳、TestAssistantを起動し、メモ帳にアタッチします
2. 「操作によるコード生成ボタン」を押下します
3. メモ帳の編集欄にフォーカスし、文字を入力します
4. 操作によるコード生成ウインドウに入力した文字列を入力する操作のコードが生成されます
5. OKボタンを押下すると、TestAssistantの左ペインに、以下のような「メモ帳の編集欄に文字列を追加する」操作のコードが追加されます。
// GuiMap WindowControl notepad = WindowControl.FromZTop(app); NativeEdit edit1 = new NativeEdit(notepad.IdentifyFromDialogId(15)); // Operation edit1.EmulateChangeText(@"ああああ");
まとめ
本稿では、Friendlyを用いてメモ帳を操作する方法を紹介しました。この方法を応用することで様々なWindows GUIアプリケーションを自動的に操作することができます。
次回は、今回説明した方法を拡張し、Kompiraからメモ帳を操作する方法をご紹介いたします。
スタートガイド
Kompiraジョブフローの基礎
ジョブフローの簡単な例
Kompiraの機能
-
- フィールド修飾子でフィールドの入力内容に制約を設ける
- Kompiraでの文字列のパターンマッチング
- Kompira上でWikiページを作成する
- スケジューラを使って定期的にジョブを実行する
- ジョブフローを実行するフォームを作成する
- テーブル内の情報を選択して処理を実行する
- ジョブフローに権限設定をする
- ジョブフロー画面の各種設定
- Pythonで記述された処理をKompiraから呼び出す
- Kompiraオブジェクトのプロパティ,メソッド,フィールドを扱う
- Windowsでリモートスクリプトを実行する(その1)
- Windowsでリモートスクリプトを実行する(その2)
- Kompira上のデータをバックアップする(その1)
- Kompira上のデータをバックアップする(その2)
- Kompira上のデータをバックアップする(その3)
外部との連携
-
- Prometheusからの通知をKompiraで受信する
- Kompira cloud Pigeonを利用した通知電話の利用
- ネットワーク機器へのコマンド投入
- KompiraからWindowsGUIアプリケーションを操作する (1/2)
- メールを送信する
- メール受信をトリガーにしてジョブフローを実行する
- アラートメールをフィルタリングして転送する
- チャネルを利用して外部システムからデータを受信する
- Webページから内容を取得する
- Redmineへ新規チケットを登録する
- Redmineでのチケット作成をKompiraに通知する
- Kompira REST APIを利用して外部からジョブフローを実行する
- Kompira REST APIを利用して外部からオブジェクト情報を取得する
- KompiraからSlackに通知する
- Slackでの投稿をKompiraに通知する
- KompiraからTwilioで電話をかける
- Zabbixからの通知をKompiraで受信する
- syslogをKompiraで受信する
- snmptrapをKompiraで受信する
- KompiraでExcelファイルの読み書きをする
- KompiraでGoogle SpreadSheetの読み書きをする
- Active Directoryから情報を取得する
- Active Directoryにユーザーを登録する