我正在考虑使用 Accessibility API 来自动执行一些 UI 任务,但我发现编写代码来降低可访问性对象层次结构需要大量代码,并且如果我忘记调用 CFRelease(),很容易发生意外的内存泄漏。例如,这是我为查找AXSplitGroup
可访问性对象的子项而编写的代码:
//AXError axErr;
//CFTypeRef typeRef;
AXUIElementRef axSplitGroup = NULL;
{
CFIndex objectChildrenCount;
axErr = AXUIElementGetAttributeValueCount(axObject, kAXChildrenAttribute, &objectChildrenCount);
assert(kAXErrorSuccess == axErr);
CFArrayRef objectChildren;
axErr = AXUIElementCopyAttributeValues(axObject, kAXChildrenAttribute, 0, objectChildrenCount, &objectChildren);
assert(kAXErrorSuccess == axErr);
assert(CFArrayGetCount(objectChildren) == objectChildrenCount);
for (CFIndex i = 0; i < objectChildrenCount; ++i) {
AXUIElementRef objectChild = CFArrayGetValueAtIndex(objectChildren, i);
axErr = AXUIElementCopyAttributeValue(objectChild, kAXRoleAttribute, &typeRef);
assert(kAXErrorSuccess == axErr);
assert([(__bridge id)typeRef isKindOfClass:[NSString class]]);
CFStringRef role = (CFStringRef)typeRef;
if (kCFCompareEqualTo == CFStringCompare(role, kAXSplitGroupRole, 0)) {
axSplitGroup = objectChild;
i = objectChildrenCount - 1;
}
CFRelease(role);
}
CFRelease(objectChildren);
assert(axSplitGroup);
}
最初我想知道(阅读:希望)Apple 提供了一个 API,它允许在可访问性对象层次结构上评估类似 XPath 的表达式以检索感兴趣的可访问性对象,但通过一些搜索,我不认为这存在。
是否有另一个标准 API 可用于在没有太多代码的情况下迭代可访问性对象层次结构?