Codeer.Friendly で WPF の ContextMenu を取得する方法

Codeer.Friendly とは

Friendly は 株式会社 Codeer が開発した WindowsGUI を自動テストするためのライブラリです。

DLLインジェクションという方法で自動化するため、アプリケーションの内部のコードも操作でき、他の自動化ツールではできないような細やかな操作が可能となるため重宝しています。ただ、privateメソッドすら実行可能というある意味恐ろしいツールなので用法・用量を守って正しく使わないとえらいことになります。

Friendly の使い方については他の方のブログを見ていただくとして、今回は ContextMenu の取得で手間取ったので備忘録として記事を書きます。

ContextMenu の取得

ContextMenu を VisualTree() を使って取り出そうとして取り出せません。 Friendly では VisualTreeWithPopup() というのが別に用意されていてこちらを使えばContextMenuを取り出せます。 なぜ別々のメソッドになっているのかは謎ですが、これでいけます。

Popup を取得するときは VisualTree() でも VisualTreeWithPopup() でも取り出せるので好きなほうを使いましょう。

var process = Process.Start(@"C:\dev\source\repos\WpfApp3\WpfApp3\bin\Debug\net8.0-windows\WpfApp3.exe");
Thread.Sleep(1000);
var app = new WindowsAppFriend(process);
var shell = app.WaitForIdentifyFromTypeFullName("WpfApp3.MainWindow");
var contextMenus = shell.VisualTreeWithPopup().ByType("System.Windows.Controls.ContextMenu");
var contextMenu = contextMenus[0];
var menuitems = contextMenu.VisualTree().ByType("System.Windows.Controls.MenuItem");
var menuitem = new WPFMenuItem(menuitems[2]);
menuitem.EmulateClick();