我正在尝试使用XCode 7的XCTest UI测试功能创建一个树木漫步者,该功能系统地探索表视图的确定性树到指定的深度.它几乎可以工作,除了我无法可靠地检测任何给定元素上的点击是否实际上触发了到新屏幕的转换.我有工作的时间,这是检测无论是导航栏标签已更改或菜单元素的数量变化最大哈克方法.
第一个测试有假阴性,因为连续的屏幕可以有相同的导航栏标签(我走的代码库不是我的).第二个测试具有误报,因为有时单击表元素不会转换到另一个表/屏幕,而是向当前屏幕添加额外的元素.
在做了一些阅读之后,似乎使用可访问性标签可能是最佳选择.所以我设置为(在viewDidAppear)的应用程序代码的导航栏的辅助功能标签UID和然后在UI测试代码测试它.感觉这应该工作,但我只在测试代码中获得nil值.
我会自由地承认,在UI测试方面我是一个菜鸟,主要是切割/粘贴/调整其他人的代码,而不清楚我正在做什么.所以我可能在可访问性标签代码本身中做出某种天真的错误,并且可能在概念层面上检测到屏幕已经改变; 也许我可以做的事情更简单/更惯用.
在申请中:
- (void)viewDidAppear: (BOOL)animated { [super viewDidAppear: animated]; //... UINavigationBar* navBar = self.navigationController.navigationBar; if( navBar ) { static NSInteger s_UID = 0; navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++]; } }
在XCTest UI测试中:
- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app { NSString* result = NULL; XCUIElementQuery *navBars = app.navigationBars; XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0]; if( firstElem ) { result = (NSString*)firstElem.accessibilityLabel; // This is always nil } return result; }
请注意,firstElem IS被发现,并且我能够非常愉快地从中提取例如firstElem.label.
任何帮助赞赏.
您可以测试元素是否可访问:
在UI测试中左键单击并开始录制,模拟器将启动,您可以单击模拟器内的元素,如果元素可访问,Xcode将在testExample方法中为您编写测试代码.
或者在模拟器中运行您的应用程序并打开辅助功能检查器,并将鼠标悬停在元素上,因为详细信息将显示在检查器中.
除此之外,我认为在您的情况下,您可以通过为每个屏幕添加导航项标题来验证这一点,即 self.navigationItem.title = @"myScreen";
然后用断言验证屏幕即
// let app = XCUIApplication() // Swift UIApplication *app = [UIApplication alloc] init]; // Objective-C XCTAssertEqual(app.navigationBars.element.identifier, "myScreen") // Don't forget to import class XCTest