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

时间:2016-04-18 13:20:14

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

我正在为一些第三方控件实现自动化提供程序,因此我可以使用VS编码的ui测试来测试我的应用程序的UI。我正在使用UI自动化方法来做到这一点。在标准的检查工具中,它们看起来很好,但是当我使用VS编码的UI测试构建器时,我的所有控件都被视为技术名称中的MSAA(而不是UIA),因此我的大部分属性都被遗漏了。我应该怎么做,所以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;
        }
    ...
}

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

UI Control Map snapshot

1 个答案:

答案 0 :(得分:0)

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

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