2010-06-08 4 views
2

У нас есть несколько автоматических тестов пользовательского интерфейса для нашего приложения WPF (.NET 4); эти тесты используют API UI Automation.WPF UI Automation - AutomationElement.FindFirst не работает, когда есть много элементов

Мы вызываем AutomationElement.FindFirst, чтобы найти целевой элемент, а затем взаимодействовать с ним.

Пример (псевдокод):

var nameEquals = new PropertyCondition(AutomationElement.NameProperty, "OurAppWindow"); 
var appWindow = DesktopWindow.FindFirst(TreeScope.Children, nameEquals); 
// this succeeds 

var idEquals = new PropertyCondition(AutomationElement.AutomationIdProperty, "ControlId"); 
var someItem = appWindow.FindFirst(TreeScope.Descendants, idEquals); 
// this suceeds sometimes, and fails sometimes! 

Проблема заключается в том, то appWindow.FindFirst иногда будет прервана и возвращать нуль, даже когда элемент присутствует. Я написал вспомогательную функцию, которая вручную обрабатывает дерево автоматизации пользовательского интерфейса и выводит его на печать, а элемент с правильным идентификатором присутствует во всех случаях.

Кажется, что это связано с тем, сколько других предметов также отображается в окне. Если нет других элементов, то это всегда удастся, но когда рядом с ним отображается много других сложных элементов пользовательского интерфейса, поиск оказывается неудачным.

Кажется, что мы сталкиваемся с каким-то внутренним пределом элемента. Я не могу найти какой-либо документированный лимит элементов, упомянутый для любого из API автоматизации, - есть ли какой-то путь вокруг этого? Я думаю, что мне, возможно, придется написать свое собственное исполнение FindFirst, которое делает дерево вручную вручную ... Насколько я могу судить об этом, это должно работать, потому что моя утилита для утилиты tree-printer делает именно это, и все в порядке, но кажется, что это было бы ненужным и медленным :-(

Любая помощь будет принята с благодарностью

+0

I'am работает с несколькими дней с основой автоматизации пользовательского интерфейса, и это действительно позор, сколько ошибок я нахожу. Это ПОЛНОСТЬЮ ошибок на всех уровнях. Microsoft сделала очень неряшливую работу. Но ошибки, похоже, находятся на стороне сервера, потому что это имеет большое значение, если вы автоматизируете Win32 или WPF или приложение .NET Forms. В зависимости от базовой структуры пользовательского интерфейса вы получаете другие типы ошибок. Кроме того, многие элементы управления не поддерживаются вообще, или функциональность настолько базовая, что вы не можете их автоматизировать. – Elmue

ответ

2

Doing дерево ходить вручную, вероятно, лучший способ обойти эту проблему.

и в самом деле, вы, вероятно, обнаружите, что реализация FindFirst с использованием древовидной ходьбы будет быстрее, используя FindFirst на элементе с большим онемением детей. Если вы посмотрите на код для AutomationElement.FindFirst в Reflector, вы увидите, что он работает, потянув за границу автоматизации всех детей, соответствующих условию, а затем вернул первый из них. Напротив, подход TreeWalker будет пытаться вытащить единственного первого ребенка через границу.

+0

Это то, что я закончил делать, я не использовал никаких инструментов для создания пользовательских интерфейсов TreeWalkers, хотя я просто сделал рекурсивный 'foreach (child in x.children)'. Это было медленным, как черт, поэтому я буду изучать использование класса «TreeWalker» и посмотреть, помогает ли это –

2

У меня была такая же проблема в одном из моих приложений, которые я автоматизировал. У меня был пользовательский элемент управления, который был на AdornerLayer, и я модифицировал дерево автоматизации пользовательского интерфейса, чтобы AutomationElement Adorner появился как дочерний элемент UI Visual для элемента управления, который он украшал, вместо того, чтобы появляться в качестве дочернего элемента корня приложения.

Когда я запускал UI Spy, я получал бы ряд ошибок в окне вывода, в которых сообщалось о некорректном родителе, когда я перемещался по его дереву. Я разрешил ошибку в своем коде в том, как я воспитывал AutomationElement для AutomationElement Adorner. Как только я исправил ошибку, UI Spy больше не отображал ошибки в окне вывода, и я больше не получал сбоев от вызовов метода FindFirst.

Если оригинальный плакат по-прежнему отслеживает этот вопрос, я бы спросил, имеет ли UI Spy какие-либо проблемы с навигацией через ваше приложение?

+0

Где я могу получить UISpy? Я никогда не мог найти для него загрузку :-( –

+0

Вы должны загрузить его через Microsoft как часть SDK. Попробуйте здесь: http://www.microsoft.com/downloads/en/details.aspx? familyid = 4377F86D-C913-4B5C-B87E-EF72E5B4E065 & displaylang = en, и согласно кому-то вам нужно только выбрать «.NET Development Tools». Я получил UISpy из другой полной загрузки SDK. – RodKnee

-1

Я даже застрял с этой проблемой, но я только не видел свою ошибку.

var window = new System.Windows.Window(); 
window.Show(); 
window.Content = addControl; 
GetWindow(window.Name); 

Я создаю окно летать и добавил элемент управления в качестве содержимого окна. Моя неудача здесь была в том, что я показал окно, а затем назначил Контент. Это даже не удается.После нескольких часов поиска я изменил его код:

var window = new System.Windows.Window(); 
window.Content = addControl; 
window.Show(); 
GetWindow(window.Name); 

... и он работает.

Теперь Майкл

+0

Какой позор! Вы даже не поняли, вопрос! – Elmue

Смежные вопросы