2017/08/31 Friendly勉強会 の第1回に参加しました。参加してみての感想などを簡単に書いていきます。
Friendlyとは?
テスト自動化を目的としたWindowsアプリの操作ライブラリです。ネイティブ、.NetのForm、WPFアプリケーションに対応しているようです。
何をやったか?
勉強会はハンズオン形式で参加者は説明を受けながらコードを打ち、わからなければ都度質問する、という形で進められました。今回はWPFアプリケーションを対象とし、「コントロールの特定方法」について学びました。以下、ハンズオンで記載したコードです。なお、ハンズオン資料はこちらからダウンロード可能です。
// ウィンドウの特定 - バリエーション4つ
// 1. 最前面にあるウィンドウ
var main = WindowControl.FromZTop(_app);
// 2, 3. ウィンドウ情報を基に特定する - MainWindow.xamlに記載されている
main = WindowControl.IdentifyFromTypeFullName(_app, "WpfApplication.MainWindow");
main = WindowControl.IdentifyFromWindowText(_app, "Friendly Handson");
// 4. 現在操作中のアプリケーションのメインウィンドウ
var mainWindowCore = _app.Type<Application>().Current.MainWindow;
main = new WindowControl(mainWindowCore);
最初にウィンドウの特定方法について4パターン紹介して頂きました。どの方法でも操作対象アプリケーションのメインウィンドウを特定できますが、
WindowText
を使った方法が良く使われるとのことです。アプリケーションのウィンドウ名は "Friendly Handson" ではなく、"FRIENDLY HANDSON" とすべて大文字になっていますが、
これは別途使用しているライブラリの関係でそうなっているのではないかということでした。そのため、WindowText
を指定する時は WpfApplication の MainWindow.xaml にあるTitle="Friendly Handson"
を参考にするのが良さそうです。
// タブの特定
// logicalツリー:xamlファイルの木構造を取得する
var logicalMain = main.LogicalTree();
// AppVar => コントロールオブジェクトそのもの
// オブジェクトのポインタのようなものが入っているイメージ
AppVar tabCore = logicalMain.ByType<TabControl>().Single();
var tab = new WPFTabControl(tabCore);
// タブの操作
tab.EmulateChangeSelectedIndex(1);
tab.EmulateChangeSelectedIndex(0);
// 以下、テキストボックスの特定、コンボボックスの特定 と続いたが、ここでは省略
.
.
.
次にタブやテキストボックス、コンボボックスなど各種コントロールの特定・操作方法について紹介して頂きました。ここで、Friendly の大きな特徴である「対象プロセスのハッキング」が登場します。logicalツリーを使って MainWindow.xaml の木構造を取得した後、各コントロールを取得していきます。それを実現しているのが、AppVar
クラスです。このクラスのオブジェクトには、コントロールオブジェクトのポインタのようなものが入っているイメージと説明を受けました。実際、AppVar
オブジェクトの情報を基にタブを切り替えたり、テキストボックスから値を取得したり、といった各コントロールの操作や情報取得を体験することができました。
今回の勉強会では手を動かしたのはここまでで、最後に質問タイムがあって終了となりました。
所感
自分はWPFアプリケーションを触るのは今回初めてだったのですが、丁寧に教えて頂けたため楽しんでハンズオンを進めることができました。「対象プロセスのハッキング」がFriendlyの大きな特徴とおっしゃっていましたが、実際体験したことでその凄さを感じ、どうやって実現しているか興味もわいてきました。勉強会は今後も一回完結ものの形で継続的に行われるようなので、参加して理解を深めていきたいと思います。