是否有一个更简单的API来降低可访问性对象层次结构?

时间:2014-08-16 18:56:14

标签: objective-c accessibility uiaccessibility

我正在考虑使用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可用于在没有太多代码的情况下迭代可访问性对象层次结构?

1 个答案:

答案 0 :(得分:1)

您最好的选择是采用Apple UI Automation,它允许您通过InstrumentsJavaScript API查询辅助功能层次结构中的元素并与之互动。这是界面自动化的首选技术。您将直接受益于您已采取的任何工作{/ 1}}。