2017-10-09 6 views
0

私はUIテストフレームワークを勉強していますWebDriverAgent facebookから。それは非常に素晴らしく役立ちます。これには、iOSのUIテストに関する知識がほとんど含まれています。iOS UI Testingの要素のlastSnapshotからの子のプロパティは常に空ですが、なぜですか?

XCTestには多くの非公開のクラスとプロパティがあります。例えば、XCUIElementはlastSnapshotという名前のプロパティを持っている、とlastSnapshotもラベル識別子フレーム、電気ショック療法子供pathDescription、のように、多くの有用な性質を有します。

子供プロパティは、ビューのサブビューと同様に、特定の要素からすべての子要素を取得するために使用されます。しかし、私が要素のlastSnapshotから子の値を取得しようとすると、常に空になります。私は正しく、ラベル、識別子、親などのような他のプロパティの値を取得することができますが、これは数日間私に苦労します。ここでexapmleコードです:

- (void)testExample { 
    XCUIApplication *app = [[XCUIApplication alloc] init]; 
    XCUIElement *windowElement = [app.windows elementBoundByIndex:2]; 
    XCUIElement *statusBarElement = [windowElement.query elementBoundByIndex:0]; 
    XCUIElement *otherElement = [statusBarElement.query elementBoundByIndex:1]; 
    XCUIElement *timeElement = [otherElement.query elementBoundByIndex:2]; 

    [timeElement query]; 
    [timeElement resolve]; 
    NSLog(@"lastSnapshot = %@", timeElement.lastSnapshot); 
    NSLog(@"children = %@", timeElement.lastSnapshot.children); 
} 
+0

WebDriverAgentをビルドする前に、XCUIElementのカテゴリを使用して要素ツリーを再帰的に作成しました。 –

答えて

0

がWebDriverAgentを勉強する前に、私は要素ツリーを再帰するXCUIElementのカテゴリを使用:

- (XCUIElementNode *)recursiveUIElementsWithLevel:(NSInteger)elementLevel { 
    XCUIElementNode *node = [XCUIElementNode new]; 
    node.elementLevel = elementLevel; 
    node.elementValue = self; 
    NSArray *arrayNotIncludeSelf = [self recursiveUIElementsNotIncludeSelfWithLevel:elementLevel]; 
    node.subNodes = [NSMutableArray arrayWithArray:arrayNotIncludeSelf]; 

    return node; 
} 

- (NSArray *)recursiveUIElementsNotIncludeSelfWithLevel:(NSInteger)elementLevel { 
    NSMutableArray *elementArray = [NSMutableArray new]; 

    XCUIElementQuery *childrenQuery = [self childrenMatchingType:XCUIElementTypeAny]; 

    for (NSUInteger elementIndex = 0; elementIndex < childrenQuery.count; elementIndex ++) { 
     XCUIElement *element = [childrenQuery elementBoundByIndex:elementIndex]; 
     XCUIElementNode *subNode = [XCUIElementNode new]; 
     subNode.elementLevel = elementLevel + 1; 
     subNode.elementValue = element; 
     subNode.subNodes = [NSMutableArray arrayWithArray:[element recursiveUIElementsNotIncludeSelfWithLevel:subNode.elementLevel]]; 
     [elementArray addObject:subNode]; 
    } 

    return [NSArray arrayWithArray:elementArray]; 
} 

それは、この方法で作業をdoeseが、再帰的トラバーサルの経験がたくさんかかります受け入れられない時間の

+0

Xcode 9とiOS 11シミュレータにアップグレードすると、スナップショットと繰り返しのトラバーサルがそれほど遅くならないようにクエリ時間が最適化されました。 – Oletha

+0

私はXcode 9とiOS 11シミュレータにアップグレードした後にもう一度試しましたが、childrenMatchingTypeのクラスによって子要素をトラバースするのはまだ非常に遅いです: –

関連する問題