Как использовать TestStack.White для имитации нажатия на динамический MenuItem в WPF? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь использовать 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>

MainWindow.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);
    }
}

ConsoleApplication1.Program

class Program
{
    static void Main(string[] args)
    {
        string path = @"C:\{path}\WpfApplication3\bin\Debug";
        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

1 Ответ

0 голосов
/ 03 сентября 2018

Вот где я добрался до (который работает) , но почему добавленные пункты меню "ChildMenus" и не могут быть найдены таким же образом, как "menu" и "sub menu"? Кроме того, почему дочернее меню находится под именем "item 2" (а не, как я думал, в случае "item2") ? Почему очевидное смешение «name» и «header» используется в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...