c++ - 如何在 VS Coded UI Test Builder 的自定义控件中将测试提供程序从 MSAA 切换到 UIA

标签 c++ unit-testing visual-studio-2012 coded-ui-tests

我正在为某些第 3 方控件实现自动化提供程序,因此我可以使用 VS 编码的 UI 测试来测试我的应用程序的 UI。我正在使用 UI 自动化方法来执行此操作。在标准检查工具中,它们看起来不错,但是当我使用 VS 编码的 UI 测试生成器时,我的所有控件在技术名称(而不是 UIA)中都被视为 MSAA,因此我的大部分属性都被遗漏了。我该怎么办,所以 VS Coded UI 将其视为 UIA? 这是我返回自动化提供程序的代码:

LRESULT CALLBACK ControlWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_GETOBJECT:
        {
            // If the lParam matches the RootObjectId, send back the RawElementProvider
            if (static_cast<long>(lParam) == static_cast<long>(UiaRootObjectId))
            {
                CustomButton* pControl = reinterpret_cast<CustomButton*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
                IRawElementProviderSimple* pRootProvider = pControl->GetUIAutomationProvider();
                return UiaReturnRawElementProvider(hwnd, wParam, lParam, pRootProvider);
            }

            return 0;
        }
    ...
}

当我在 UIA 模式下使用复杂的自动化工具(如 Ranorex 或简单的 Inspect.exe)时,将调用此代码。但是对于 VS,没有任何 UiaRootObjectId 请求。 相反,它使用 lParam == OBJID_CLIENT 参数调用它。因此它会返回一些默认的 MSAA 提供程序。

UI Control Map snapshot

最佳答案

如果有人遇到同样的问题,这里是我找到的解决方案。您应该创建您的自定义服务器端提供程序,它将用于您的控件类名称(它应该是 VS 插件 .dll 或类似的东西)。

您的自定义提供程序 .dll 应该放在您的 visual studio 目录中,之后您在 VS coded ui 插件中的所有控件都将具有您自己描述的技术名称、字段和角色。可以在 msdn 和其他资源上找到自定义提供程序的示例

关于c++ - 如何在 VS Coded UI Test Builder 的自定义控件中将测试提供程序从 MSAA 切换到 UIA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36695209/

相关文章:

visual-studio-2010 - Visual Studio远程调试器 "invalid access to memory location"功能

c++ - 无法访问好友类的私有(private)成员

c++ - 缩短作为模板参数传递到 CRTP ("pass me"中的长模板派生类)

c++ - 右值引用转换后的地址变化

unit-testing - Clojure - 测试 Pedestal 路线

node.js - 使用 Bookshelf.js 和 knex.js 进行单元测试

sql - 如何基于 SQL Server 中的现有数据库创建 .MDF 文件?

c++ - 通过引用传递智能指针

ios - 如何测试使用 Jest 导入自定义 native 模块的 React Native 组件?

css - Visual Studio 2012 中查找特定 id 或类的 css 的最有效方法是什么