Как я использую Автоматизацию UI на WPF ItemsControl, это группирует объекты?

Я использую Microsoft UI Automation (т.е. AutomationElement) выполнять автоматизированные приемочные испытания против моего приложения. Это подходило, но я поразил ситуацию, которая, кажется, не выставляется платформе автоматизации.

Я имею ItemsControl (хотя я мог использовать одни из его полученных средств управления, например. ListBox) и я использую CollectionViewSource к объектам группы. Вот полное окно для демонстрации:


    

        
        
            
                
                    
                    
                    
                
            
        

        
        
            
                
            
        
    

    
    
        
            
                
                    
                        
                    
                
            
        
        
            
                
                    
                        

Это производит окно, содержащее объекты, сгруппированные в их категории, и каждый объект имеет кнопку, которую я хотел бы нажать с Автоматизацией UI:

Screenshot of window with a list
(источник: brizzly.com)

Однако, если я смотрю в UISpy.exe (или перешел с AutomationElement) Я только вижу группы (даже в представлении Raw):

UISpy
(источник: brizzly.com)

Как Вы видите, группы там, но они не содержат объектов, таким образом, нет, чтобы нигде искать кнопки. Я попробовал это и в WPF 3.5 SP1 и в WPF 4.0 и получаю тот же результат.

Действительно ли возможно использовать Автоматизацию UI на объектах, которые сгруппированы, и если так, как?

6
задан Glorfindel 25 July 2019 в 11:18
поделиться

2 ответа

Какие инструменты вы используете для написания автоматизированных сценариев? Я бы подумал, что есть возможность углубиться в логические / визуальные деревья WPF, а не полагаться на дерево Win32 (как показано UISpy).

Если вы посмотрите на то же приложение, использующее Snoop , вы увидите полные визуальные и логические деревья.

1
ответ дан 9 December 2019 в 20:40
поделиться

Я не уверен на 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 , вы можете заставить их отображаться с помощью аналогичного подкласса.

Говоря это, я не понимаю, почему кнопка не появляется .... Хмммм

3
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: