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で辿れない。
とりあえず、書き散らかしただけですいません。。。
追記(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割ぐらい出来たようなもの。