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