Я использую Microsoft UI Automation (т.е. AutomationElement
) выполнять автоматизированные приемочные испытания против моего приложения. Это подходило, но я поразил ситуацию, которая, кажется, не выставляется платформе автоматизации.
Я имею ItemsControl
(хотя я мог использовать одни из его полученных средств управления, например. ListBox
) и я использую CollectionViewSource
к объектам группы. Вот полное окно для демонстрации:
Это производит окно, содержащее объекты, сгруппированные в их категории, и каждый объект имеет кнопку, которую я хотел бы нажать с Автоматизацией UI:
(источник: brizzly.com)
Однако, если я смотрю в UISpy.exe (или перешел с AutomationElement
) Я только вижу группы (даже в представлении Raw):
(источник: brizzly.com)
Как Вы видите, группы там, но они не содержат объектов, таким образом, нет, чтобы нигде искать кнопки. Я попробовал это и в WPF 3.5 SP1 и в WPF 4.0 и получаю тот же результат.
Действительно ли возможно использовать Автоматизацию UI на объектах, которые сгруппированы, и если так, как?
Какие инструменты вы используете для написания автоматизированных сценариев? Я бы подумал, что есть возможность углубиться в логические / визуальные деревья WPF, а не полагаться на дерево Win32 (как показано UISpy).
Если вы посмотрите на то же приложение, использующее Snoop , вы увидите полные визуальные и логические деревья.
Я не уверен на 100% насчет кнопок, но элементы управления TextBlock
, которые находятся внутри DataTemplate
, не не помещаются в дерево автоматизации пользовательского интерфейса. По-видимому, это оптимизация, позволяющая избежать тысяч ненужных текстовых блоков.
Вы можете обойти это, создав подкласс TextBlock. Вот мой:
public class AutomatableTextBlock : TextBlock
{
protected override AutomationPeer OnCreateAutomationPeer()
{
return new AutomatableTextBlockAutomationPeer(this);
}
class AutomatableTextBlockAutomationPeer : TextBlockAutomationPeer
{
public AutomatableTextBlockAutomationPeer(TextBlock owner)
: base(owner)
{ }
protected override bool IsControlElementCore()
{ return true; }
}
}
Примечание: UI Automation также не предоставляет различные другие элементы управления, такие как Canvas
, Panel
, вы можете заставить их отображаться с помощью аналогичного подкласса.
Говоря это, я не понимаю, почему кнопка
не появляется .... Хмммм