Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Friendlyで「出来たらいいな」2つ

WPFアプリのE2Eテストを書く必要があり、Friendlyを触ってみた。

ishikawa-tatsuya.hatenablog.com

2つほど出来たらいいな、があった。

1. ViewModelのオブジェクトを取りたい

//WindowControl w 
var vm = w.AppVar.Dynamic().DataContext();
if(vm is HogeViewModel) {
   //falseになる
}

ってやると、dynamicで対象のビューのVMが取れるし、メソッドを叩くこともできる。ただ、VMの型にキャストすることが出来ない。VMの型にキャストできれば、Assertするのが楽になるので、やりたい。

2. HierarchicalTemplate

こちらに書いたが、メニューの子メニューをVisualTreeで辿れない。

qiita.com

とりあえず、書き散らかしただけですいません。。。

追記(2020.12.11)

vmへのキャストについてですが、別途[Serializable]を適用しないと、だめっぽい。

WPFGridのdataitemを取るのに、string code = ListGrid[1].itemcode とかやれば、stringで取れる。このstringで代入するときに、dynamicから型推論で型を解決するようなのだが、これがシリアライズによって値を持ってくるっぽいの。dynamicの機構のようだ。(怪しいけど、代入を実行することで、相手プロセスから自分のアプリのプロセスに展開されるっぽい)

HierarchicalTemplateのたどり方は、相変わらずうまくいかなかったが、ViewModelを叩くことが出来るので、メニューのUIを捕まえるのではなくViewModelのコマンドをそのまま実行して、ま、とりあえずなんだけど、テストケースを実行することは出来た。メニューや右クリックメニュー等は、Windowsのネイティブのオブジェクトらしくて、色々大変なようだ。

右クリックメニューを捕まえるの苦労したが、VisualTreeでWPFUserControlをセットして、x:Nameで辿ったら取れた。

PageObject.InputGrid.MouseDown(MouseButtonType.Left, 100, 50);
PageObject.InputGrid.MouseUp(MouseButtonType.Left, 100, 120);
PageObject.InputGrid.Click(MouseButtonType.Right, 100, 100);

var hoge = new WPFMenuItem(PageObject.ContentPage.Dynamic().StatusMenu); 
hoge.Click();

モーダルダイアログの操作もできた。モーダルの連鎖も、WaitForNextModalを連発することで、動いた。

 var async = new Async();
 button.EmulateClick(async);
 var dlg = w.WaitForNextModal();
 var dlg_po2 = new DialogPageObject(dlg);
 dlg_po2.OKButton.EmulateClick();
async.WaitForCompletion();

まず、PageObjectを作ろう

PageObjectは多分Seleniumの用語だと思うけど、テスト対象画面に存在するUIオブジェクトをVisualTreeから取得して変数に保存しておくこと。まず、これを当該画面を表示したら行う。PO初期化()っていう関数を作って、ClassInitilizeで呼び出すようにしてます。対象のオブジェクトがないと例外を出してくれるので(ナイス!)、そこで動かない場合はそこから。これができれば、7割ぐらい出来たようなもの。