如何使用TestStack.White来模拟在WPF中单击动态菜单项?



我正在尝试使用 TestStack.White 来模拟在 WPF 应用程序中单击菜单子项。该子项是在运行时添加的,我几乎无法控制它的创建方式。我似乎找不到要单击的菜单子项。

我试过这个:

MainWindow.xaml

<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem x:Name="MainMenu" Header="Menu">
<MenuItem x:Name="SubMenu" Header="Sub Menu"/>
</MenuItem>
</Menu>
</DockPanel>
</Window>

主窗口.cs

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 5; i++)
{
var newItem = new MenuItem();
newItem.Header = string.Format("Item {0}", i + 1);
newItem.Name = string.Format("Item{0}", i + 1);
this.SubMenu.Items.Add(newItem);
newItem.Click += new RoutedEventHandler(MenuItemClickHandler); 
}
}
private void MenuItemClickHandler(object sender, RoutedEventArgs e)
{
var menuItem = (MenuItem)sender;
MessageBox.Show(this, "You clicked " + menuItem.Header, "Menu Click", MessageBoxButton.OK, MessageBoxImage.Information);
}
}

控制台应用程序1.程序

class Program
{
static void Main(string[] args)
{
string path = @"C:{path}WpfApplication3binDebug";
string prog = Path.Combine(path, "WpfApplication3.exe");
TestStack.White.Application app = TestStack.White.Application.Launch(prog);
var window = app.GetWindow(SearchCriteria.ByText("MainWindow"), InitializeOption.WithCache);
window.WaitWhileBusy();
var menu = window.MenuBar.MenuItem("Menu", "SubMenu", "Item2");
menu.Click();
}
}

我不确定如何找到菜单子项,我猜是因为编译应用程序时它们不存在?

Noddy的例子道歉,但WPF不是我的强项,TestStack.White也不是。

这是我到达的地方(有效(,但是为什么添加的菜单项是"ChildMenus",并且无法以与"菜单"和"子菜单"相同的方式找到?另外,为什么子菜单的名称为"item 2">(而不是像我认为的那样,是"item2"(?为什么在 xaml 中使用"名称"和"标头"的明显混合?

//var menu = window.MenuBar.MenuItem("Menu", "SubMenu", "Item2");
var menu = window.MenuBar.MenuItem("Menu", "Sub Menu");
var menus = menu.ChildMenus;
menu = menus.First(m => m.Name == "Item 2");
menu.Click();

最新更新