Как можно получить элементы Viewbox/Canvas/Path для тестирования закодированного пользовательского интерфейса?

При выполнении закодированных тестов пользовательского интерфейса в приложении WPF нужную мне кнопку WPF можно найти следующим образом:

WpfButton button = new WpfButton(mainWindow);
button.SearchProperties[WpfButton.PropertyNames.AutomationId] = "btn";
button.WindowTitles.Add("MainWindow");

После этой инициализации я могу успешно выполнять любые проверки и проверки.

Проблемы начинаются, когда я пытаюсь проверить состояние элемента ViewBox, содержащего Canvas, который, в свою очередь, содержит Path. Ни один из этих элементов не имеет аналогового типа из пространства имен Microsoft.VisualStudio.TestTools.UITesting.WpfControls. После небольшого расследования я обнаружил, что эти типы также не имеют переопределенного метода OnCreateAutomationPeer.

Итак, как удобнее всего получить Canvas, ViewBox или Path для тестирования пользовательского интерфейса?

Может быть, я пропустил совместимый тип из пространства имен Microsoft.VisualStudio.TestTools.UITesting.WpfControls или, может быть, я должен получить пользовательский тип (например, из Canvas) и переопределить в нем метод OnCreateAutomationPeer, а затем создать коллегу автоматизации для моего класса DerivedCanvas? Я новичок в тестировании закодированного пользовательского интерфейса, поэтому, если второе решение решает проблему, как его можно реализовать?


person undermind    schedule 20.06.2014    source источник
comment
Из любопытства, почему вы не используете карту пользовательского интерфейса? По крайней мере, вы можете исследовать сгенерированный код, чтобы увидеть, как он обращается к этим элементам.   -  person Daniel Mann    schedule 20.06.2014
comment
@DanielMann Вы имеете в виду код, сгенерированный утилитой Coded UI Test Builder? К сожалению, он не видит Canvas. Если я, например, щелкну холст, содержащийся в окне, он распознает только окно. А вот для таких элементов, как TextBlock или Button, все будет ок.   -  person undermind    schedule 20.06.2014


Ответы (1)


Я нашел ответ. Это кажется очень простым. Во-первых, новый класс AutomatisableCanvas должен быть производным от Canvas:

public class AutomatisableCanvas : Canvas
{
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new CanvasAutomationPeer(this);
    }
}

Во-вторых, новый класс CanvasAutomationPeer должен быть производным от FrameworkElementAutomationPeer:

class CanvasAutomationPeer : FrameworkElementAutomationPeer
{
    public CanvasAutomationPeer(Canvas owner)
        : base(owner) { }

    protected override AutomationControlType GetAutomationControlTypeCore()
    {
        return AutomationControlType.Custom;
    }
}

И теперь элемент управления AutomatisableCanvas можно просто найти следующим образом:

WpfCustom canvas = new WpfCustom(mainWindow);
canvas.SearchProperties[WpfCustom.PropertyNames.AutomationId] = "an AutomationId you've specified for an AutomatisableCanvas instance";
canvas.WindowTitles.Add("MainWindow");
person undermind    schedule 28.06.2014