我正在尝试使用XCode 7的XCTest UI测试功能创建一个树步行者,系统地将一个确定性的表视图树探索到指定的深度.它几乎可以工作,除了我无法可靠地检测任何给定元素上的点击是否实际触发了转换到新屏幕.我有一个hacky方法大多数时间工作,这是检测导航栏标签已更改或菜单元素的数量已更改.
第一个测试有假阴性,因为连续的屏幕可以有相同的导航栏标签(我正在走的代码不是我的).第二个测试有误报,因为有时单击表格元素不会转换到另一个表/屏幕,而是向当前屏幕添加额外的元素.
做了一些阅读后,似乎使用辅助功能标签可能是要走的路.所以我在应用程序代码(在viewDidAppear中)为导航栏的辅助功能标签设置一个UID,然后在UI测试代码中进行测试.感觉这样应该可以工作,但是我只会在测试代码中回复一个零值.
在UI测试中,我会自由地承认我是一个noob,主要是剪切/粘贴/调整其他人的代码,而不会对我在做什么有一个清晰的了解.所以我可能会在辅助功能@R_301_213@本身和可能在概念层面检测屏幕已经改变了一些天真的错误.也许有更简单/更惯用的我可以做的事情.
在应用程序中:
- (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