如何检查 XAML 元素是否支持 AutomationId 属性

2024-04-05

我需要一种方法来检查代码库中的每个 WPF 控件是否都有 AutomationProperties.AutomationId 属性。 (这是自动化 UI 测试所必需的。)我还需要确保将来在可能添加到代码库的所有未来表单上强制执行此要求。我考虑了几种不同的方法,但到目前为止,没有一种方法是正确的。

选项 1:为应用程序中的每个 WPF 表单编写单元测试。

这是一个相当简单的方法。我已经编写了一个方法,该方法检查 DependencyControl 的所有逻辑后代并确保每个后代都有一个 AutomationId。这是一些 C#:

    private bool AllControlsHaveAutomationId(DependencyObject control)
    {
        bool result = true;

        if (this.ControlHasAutomationId(control))
        {
            foreach (object o in LogicalTreeHelper.GetChildren(control))
            {
                FrameworkElement frameworkElement = o as FrameworkElement;
                if (frameworkElement != null)
                {
                    result = this.AllControlsHaveAutomationId(frameworkElement);
                }
            }
        }
        else
        {
            result = false;
        }

        return result;
    }

    private bool ControlHasAutomationId(DependencyObject control)
    {
        return !string.IsNullOrEmpty(AutomationProperties.GetAutomationId(control));
    }

这种方法的问题在于,我假设其他开发人员会为其表单编写单元测试,这不是一个好的假设。如果我不能假设 AutomationIds 将添加到所有 WPF 控件中,那么我也不能假设将编写单元测试。

选项 2:使用 System.Xml.XmlDocument 读取每个 XAML 文件。检查文档中 AutomationProperties.AutomationId 的元素。

这种方法似乎很有前途。我最初的计划是将每个 XAML 文件加载到 XmlDocument 中,并检查文档中每个元素的 AutomationProperties.AutomationId 属性。但是,我意识到并非 XAML 中的每个元素类型都支持 AutomationProperties.AutomationId 属性。我需要一种读取 XAML 文件中的元素并确定该元素是否支持 AutomationProperties.AutomationId 属性的方法。有没有办法做到这一点?


您可以查看代码库所有程序集中的 BAML(编译的 XAML)......有多种方法可以做到这一点。

通过 .NET Reflector 和 AddIn 查看 BAML

一种方法是编写一个 Reflector 插件。

您也许可以将其基于已经可用的 BAML 查看器。

  • http://wpf.2000things.com/tag/baml/ http://wpf.2000things.com/tag/baml/

然后希望这只是给 Reflector 你的组件并说在没有自动化 ID 的情况下给我找东西的情况。

通过 StylesExplorer 查看 BAML

  • http://stylesexplorer.codeplex.com/ http://stylesexplorer.codeplex.com/

允许您使用程序集访问 BAMLBamlAssembly class.

通过 LocBAML 查看 BAML

  • http://msdn.microsoft.com/en-us/library/ms746621.aspx http://msdn.microsoft.com/en-us/library/ms746621.aspx

  • http://bloc.codeplex.com/releases/view/44124 http://bloc.codeplex.com/releases/view/44124(相关链接)

Windows SDK 中提供了该工具的源代码。您可以进行修改以查找自动化属性而不是可本地化的属性。

使用 XamlReader.Load()

你甚至可能只需要到达某个地方XamlReader.Load()与未编译的 .xaml 文件一起使用。

  • http://go4answers.webhost4life.com/Example/xamlreaderloadbaml-removed-125290.aspx http://go4answers.webhost4life.com/Example/xamlreaderloadbaml-removed-125290.aspx

使用 XamlReader.LoadBaml()

  • http://wpftutorial.net/baml.html http://wpftutorial.net/baml.html

其他选项

各种自动化的运行时验证器

  • http://acccheck.codeplex.com/releases/view/46527 http://acccheck.codeplex.com/releases/view/46527
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 XAML 元素是否支持 AutomationId 属性 的相关文章

  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00

随机推荐