【发布时间】:2016-08-10 06:19:34
【问题描述】:
我正在为一些 3 方控件实现自动化提供程序,因此我可以使用 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 参数调用它。所以它会返回一些默认的 MSAA 提供程序。
【问题讨论】:
标签: c++ unit-testing visual-studio-2012 coded-ui-tests