Files
custom_wda/WebDriverAgentTests/IntegrationTests/FBXPathIntegrationTests.m
2026-02-03 16:52:44 +08:00

158 lines
8.9 KiB
Objective-C

/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#import <XCTest/XCTest.h>
#import "FBIntegrationTestCase.h"
#import "FBMacros.h"
#import "FBTestMacros.h"
#import "FBXPath.h"
#import "FBXCAccessibilityElement.h"
#import "FBXCodeCompatibility.h"
#import "FBXCElementSnapshotWrapper+Helpers.h"
#import "FBXMLGenerationOptions.h"
#import "XCUIApplication.h"
#import "XCUIElement.h"
#import "XCUIElement+FBFind.h"
#import "XCUIElement+FBUtilities.h"
#import "XCUIElement+FBWebDriverAttributes.h"
@interface FBXPathIntegrationTests : FBIntegrationTestCase
@property (nonatomic, strong) XCUIElement *testedView;
@end
@implementation FBXPathIntegrationTests
- (void)setUp
{
[super setUp];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self launchApplication];
});
self.testedView = self.testedApplication.otherElements[@"MainView"];
XCTAssertTrue(self.testedView.exists);
FBAssertWaitTillBecomesTrue(self.testedView.buttons.count > 0);
}
- (id<FBXCElementSnapshot>)destinationSnapshot
{
XCUIElement *matchingElement = self.testedView.buttons.allElementsBoundByIndex.firstObject;
id<FBXCElementSnapshot> snapshot = [matchingElement fb_customSnapshot];
// Over iOS13, snapshot returns a child.
// The purpose of here is return a single element to replace children with an empty array for testing.
snapshot.children = @[];
return snapshot;
}
- (void)testApplicationNodeXMLRepresentation
{
id<FBXCElementSnapshot> snapshot = [self.testedApplication fb_customSnapshot];
snapshot.children = @[];
FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
NSString *xmlStr = [FBXPath xmlStringWithRootElement:wrappedSnapshot
options:nil];
int pid = [snapshot.accessibilityElement processIdentifier];
XCTAssertNotNil(xmlStr);
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" traits=\"%@\" processId=\"%d\" bundleId=\"%@\"/>\n", wrappedSnapshot.wdType, wrappedSnapshot.wdType, wrappedSnapshot.wdName, wrappedSnapshot.wdLabel, FBBoolToString(wrappedSnapshot.wdEnabled), FBBoolToString(wrappedSnapshot.wdVisible), FBBoolToString(wrappedSnapshot.wdAccessible), [wrappedSnapshot.wdRect[@"x"] stringValue], [wrappedSnapshot.wdRect[@"y"] stringValue], [wrappedSnapshot.wdRect[@"width"] stringValue], [wrappedSnapshot.wdRect[@"height"] stringValue], wrappedSnapshot.wdIndex, wrappedSnapshot.wdTraits, pid, [self.testedApplication bundleID]];
XCTAssertEqualObjects(xmlStr, expectedXml);
}
- (void)testSingleDescendantXMLRepresentation
{
id<FBXCElementSnapshot> snapshot = self.destinationSnapshot;
FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
NSString *xmlStr = [FBXPath xmlStringWithRootElement:wrappedSnapshot
options:nil];
XCTAssertNotNil(xmlStr);
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" traits=\"%@\"/>\n", wrappedSnapshot.wdType, wrappedSnapshot.wdType, wrappedSnapshot.wdName, wrappedSnapshot.wdLabel, FBBoolToString(wrappedSnapshot.wdEnabled), FBBoolToString(wrappedSnapshot.wdVisible), FBBoolToString(wrappedSnapshot.wdAccessible), [wrappedSnapshot.wdRect[@"x"] stringValue], [wrappedSnapshot.wdRect[@"y"] stringValue], [wrappedSnapshot.wdRect[@"width"] stringValue], [wrappedSnapshot.wdRect[@"height"] stringValue], wrappedSnapshot.wdIndex, wrappedSnapshot.wdTraits];
XCTAssertEqualObjects(xmlStr, expectedXml);
}
- (void)testSingleDescendantXMLRepresentationWithScope
{
id<FBXCElementSnapshot> snapshot = self.destinationSnapshot;
NSString *scope = @"AppiumAUT";
FBXMLGenerationOptions *options = [[FBXMLGenerationOptions new] withScope:scope];
FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
NSString *xmlStr = [FBXPath xmlStringWithRootElement:wrappedSnapshot
options:options];
XCTAssertNotNil(xmlStr);
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@>\n <%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" traits=\"%@\"/>\n</%@>\n", scope, wrappedSnapshot.wdType, wrappedSnapshot.wdType, wrappedSnapshot.wdName, wrappedSnapshot.wdLabel, FBBoolToString(wrappedSnapshot.wdEnabled), FBBoolToString(wrappedSnapshot.wdVisible), FBBoolToString(wrappedSnapshot.wdAccessible), [wrappedSnapshot.wdRect[@"x"] stringValue], [wrappedSnapshot.wdRect[@"y"] stringValue], [wrappedSnapshot.wdRect[@"width"] stringValue], [wrappedSnapshot.wdRect[@"height"] stringValue], wrappedSnapshot.wdIndex, wrappedSnapshot.wdTraits, scope];
XCTAssertEqualObjects(xmlStr, expectedXml);
}
- (void)testSingleDescendantXMLRepresentationWithoutAttributes
{
id<FBXCElementSnapshot> snapshot = self.destinationSnapshot;
FBXMLGenerationOptions *options = [[FBXMLGenerationOptions new]
withExcludedAttributes:@[@"visible", @"enabled", @"index", @"blabla"]];
FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
NSString *xmlStr = [FBXPath xmlStringWithRootElement:wrappedSnapshot
options:options];
XCTAssertNotNil(xmlStr);
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" traits=\"%@\"/>\n", wrappedSnapshot.wdType, wrappedSnapshot.wdType, wrappedSnapshot.wdName, wrappedSnapshot.wdLabel, FBBoolToString(wrappedSnapshot.wdAccessible), [wrappedSnapshot.wdRect[@"x"] stringValue], [wrappedSnapshot.wdRect[@"y"] stringValue], [wrappedSnapshot.wdRect[@"width"] stringValue], [wrappedSnapshot.wdRect[@"height"] stringValue], wrappedSnapshot.wdTraits];
XCTAssertEqualObjects(xmlStr, expectedXml);
}
- (void)testFindMatchesInElement
{
NSArray<id<FBXCElementSnapshot>> *matchingSnapshots = [FBXPath matchesWithRootElement:self.testedApplication forQuery:@"//XCUIElementTypeButton"];
XCTAssertEqual([matchingSnapshots count], 5);
for (id<FBXCElementSnapshot> element in matchingSnapshots) {
XCTAssertTrue([[FBXCElementSnapshotWrapper ensureWrapped:element].wdType isEqualToString:@"XCUIElementTypeButton"]);
}
}
- (void)testFindMatchesWithoutContextScopeLimit
{
XCUIElement *button = self.testedApplication.buttons.firstMatch;
BOOL previousValue = FBConfiguration.limitXpathContextScope;
FBConfiguration.limitXpathContextScope = NO;
@try {
NSArray *parentSnapshots = [FBXPath matchesWithRootElement:button forQuery:@".."];
XCTAssertEqual(parentSnapshots.count, 1);
XCTAssertEqualObjects(
[FBXCElementSnapshotWrapper ensureWrapped:[parentSnapshots objectAtIndex:0]].wdLabel,
@"MainView"
);
NSArray *elements = [button.application fb_filterDescendantsWithSnapshots:parentSnapshots onlyChildren:NO];
XCTAssertEqual(elements.count, 1);
XCTAssertEqualObjects(
[[elements objectAtIndex:0] wdLabel],
@"MainView"
);
NSArray *currentSnapshots = [FBXPath matchesWithRootElement:button forQuery:@"."];
XCTAssertEqual(currentSnapshots.count, 1);
XCTAssertEqualObjects(
[FBXCElementSnapshotWrapper ensureWrapped:[currentSnapshots objectAtIndex:0]].wdType,
@"XCUIElementTypeButton"
);
NSArray *currentElements = [button.application fb_filterDescendantsWithSnapshots:currentSnapshots onlyChildren:NO];
XCTAssertEqual(currentElements.count, 1);
XCTAssertEqualObjects(
[[currentElements objectAtIndex:0] wdType],
@"XCUIElementTypeButton"
);
} @finally {
FBConfiguration.limitXpathContextScope = previousValue;
}
}
- (void)testFindMatchesInElementWithDotNotation
{
NSArray<id<FBXCElementSnapshot>> *matchingSnapshots = [FBXPath matchesWithRootElement:self.testedApplication forQuery:@".//XCUIElementTypeButton"];
XCTAssertEqual([matchingSnapshots count], 5);
for (id<FBXCElementSnapshot> element in matchingSnapshots) {
XCTAssertTrue([[FBXCElementSnapshotWrapper ensureWrapped:element].wdType isEqualToString:@"XCUIElementTypeButton"]);
}
}
@end