0

アクセシビリティ 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);
}

もともと私は、関心のあるアクセシビリティ オブジェクトを取得するために、XPath のような式をアクセシビリティ オブジェクト階層で評価できるようにする API を Apple が提供しているのではないかと思っていました (読み: 期待しています)。これは存在します。

コードをあまり使わずにアクセシビリティ オブジェクト階層を反復するために使用できる別の標準 API はありますか?

4

1 に答える 1

1

最善の選択肢は、Apple のUI Automationを採用することです。これにより、 InstrumentsおよびJavaScript APIを介してアクセシビリティ階層内の要素をクエリおよび操作できます。これは、インターフェイスの自動化に推奨される手法です。を採用するためにすでに行った作業から直接利益を得ることができますUIAccessibility

于 2014-08-21T00:20:32.717 に答える