C# System.Windows.Automation 获取元素文本

标签 c# ui-automation

我正在尝试使用 C# 中的自动化从应用程序控件中获取文本/标签。

到目前为止,我能够使用此功能获得应用程序(例如记事本)的 AutomationElement 树:

    private void WalkControlElements(AutomationElement rootElement, TreeNode treeNode)
    {
        AutomationElement elementNode = TreeWalker.ContentViewWalker.GetFirstChild(rootElement);;

        while (elementNode != null)
        {
            TreeNode childTreeNode = treeNode.Nodes.Add(elementNode.Current.ControlType.LocalizedControlType);

            // here I want to get text from 'elementNode'

            WalkControlElements(elementNode, childTreeNode);
            elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
        }
    }

我试着关注这篇文章http://msdn.microsoft.com/en-us/library/ms788751(v=vs.110).aspx但它只能获取字体名称、字体粗细等文本属性。

谁能告诉我如何使用自动化获取元素文本的正确过程?

最佳答案

该示例向您展示了如何获取文本属性,即关于 UI 中文本显示的信息,而不是实际显示的文本。获取一般应用程序的所有实际显示文本比它第一次出现时要困难得多。

获取文本的方式有多种,而且应用程序和控件的支持不一致,这让事情变得很困难。有两种模式很有用,ValuePatternTextPattern。按照惯例,Name 属性包含显示给用户的文本,但是遵守这一点是不一致的。下面是我在 UI 自动化测试中使用的辅助方法。它基本上通过这些模式来检查控件的支持,然后回退到名称。

public static class AutomationExtensions
{
    public static string GetText(this AutomationElement element)
    {
        object patternObj;
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out patternObj))
        {
            var valuePattern = (ValuePattern)patternObj;
            return valuePattern.Current.Value;
        }
        else if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj))
        {
            var textPattern = (TextPattern)patternObj;
            return textPattern.DocumentRange.GetText(-1).TrimEnd('\r'); // often there is an extra '\r' hanging off the end.
        }
        else
        {
            return element.Current.Name;
        }
    }
}

这负责从标签、文本框( Vanilla 文本框和富文本框)和按钮等简单控件中获取文本。列表框和组合框(尤其是在 WPF 中)之类的控件可能比较复杂,因为它们的项目可以虚拟化,因此在用户与它们交互之前它们可能不存在于自动化树中。您可能希望仅在某些 UI 自动化控件类型(例如您知道包含文本的编辑、文本和文档)上过滤和调用此方法。

关于C# System.Windows.Automation 获取元素文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850176/

相关文章:

c# - 如何从外部代码开始对 .Net 类进行基准测试

windows-8 - 如何实现 Metro 风格应用的 UI 自动化?

c# - 如何在编码的 UI 测试中处理更改控件 ID

c# - 是否可以获取任何窗口的选定文本,包括非 UI 自动化元素?

testing - Ranorex 8.3.0,当尝试创建新记录时,它不显示选择网络、桌面或移动应用程序的选项

winapi - 获取窗口所有 ui 元素的最佳方法是什么?

c# - 在 C# 中清理永久线程的正确方法

c# - 如何从 C# 编辑或取消保护 protected Excel 工作表中的单个单元格?

c# - 声明具体实现具有具体类型的接口(interface)

c# - 具有多个命名空间的 DataContractSerializer