视图模式差异
UI Automation (UIA) 提供了不同的视图来访问和操作用户界面(UI)元素的树结构:控制视图(Control View)和原始视图(Raw View)。这些视图决定了哪些元素在遍历UI树时被考虑。
控制视图(Control View)
控制视图主要反映了对最终用户可见和可交互的控件。它是针对辅助技术和自动化测试最常用的视图,因为它只包含用户可以操作的元素。
在控制视图中,某些不可见或不可交云的元素(如中间布局控件)可能不会被包括在树中。这使得树结构更简洁,更容易理解和操作。
原始视图(Raw View)
原始视图提供了UI树的完整视图,包括所有可见和不可见的元素。这包括布局容器、非交互式控件和用于内部目的的控件。
原始视图允许访问控制视图中可能不可见的元素。它对于需要完整访问UI结构的高级自动化和分析任务非常有用。
原始视图使用 TreeWalker 接口来遍历 UI 树,而不是直接使用 IUIAutomationElement 接口。这使得可以更灵活地控制遍历过程,以便访问所有元素。
IUIAutomationTreeWalker* pRawViewWalker = NULL;
// 获取原始视图的 TreeWalker
pAutomation->get_RawViewWalker(&pRawViewWalker);
这种两种视图模式是可以相互替换操作的。例如,正在开发一个自动化测试脚本,需要定位并操作一个复杂窗口中的特定控件,就可以先获取这个窗口的元素,然后使用 TreeWalker 来查找需要交互的子控件。
通过 TreeWalker,可以灵活地遍历和操作 UI 元素,而不需要从根元素开始逐级查找,这样可以显著提高自动化脚本的效率和性能。
使用示例
可以直接从某个特定应用程序的某个元素开始,获取其下的原始视图元素,而不需要从根元素开始遍历整个 UI 树。
// 假设 pTargetElement 是目标应用程序窗口的 IUIAutomationElement*
// 获取UI Automation对象
IUIAutomation* pAutomation = NULL;
HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, IID_IUIAutomation, (void**)&pAutomation);
if (SUCCEEDED(hr) && pAutomation)
{
// 获取原始视图的 TreeWalker
IUIAutomationTreeWalker* pRawViewWalker = NULL;
pAutomation->get_RawViewWalker(&pRawViewWalker);
if (pRawViewWalker)
{
// 从目标元素开始遍历
IUIAutomationElement* pChild = NULL;
pRawViewWalker->GetFirstChildElement(pTargetElement, &pChild);
while (pChild)
{
// 对 pChild 进行操作...
IUIAutomationElement* pNext = NULL;
pRawViewWalker->GetNextSiblingElement(pChild, &pNext);
pChild->Release(); // 释放当前子元素
pChild = pNext; // 移至下一个子元素
}
pRawViewWalker->Release(); // 释放 TreeWalker
}
pAutomation->Release(); // 释放 UI Automation 对象
}
这里调用 pAutomation->get_RawViewWalker(&pRawViewWalker); 这行代码时,获取的是一个 TreeWalker 对象,这个对象配置为遍历 UI Automation 树的原始视图。
这个 TreeWalker 对象并不是指向树的根元素或任何特定的元素。相反,它是一个工具,可以用它从任何给定的元素开始遍历 UI 树。
TreeWalker 在 UI Automation (UIA) 中是一个非常关键的对象,用于遍历 UI Automation 元素的树。它提供了一组方法来按照特定顺序访问元素树中的节 点,比如获取父元素、子元素、兄弟元素等。这使得开发者可以编写代码来遍历整个 UI 结构,寻找需要的信息或进行操作。