【发布时间】:2015-12-16 19:57:52
【问题描述】:
我正在尝试使用 XCode 7 的 XCTest UI 测试功能创建一个树遍历器,该功能系统地探索表视图的确定性树到指定深度。它几乎可以工作,除了我无法可靠地检测到任何给定元素上的点击是否实际上触发了到新屏幕的转换。我有一个在大多数情况下都有效的 hacky 方法,即检测导航栏标签是否已更改或菜单元素的数量已更改。
第一个测试有误报,因为连续的屏幕可以有相同的导航栏标签(我正在走的代码库不是我的)。第二个测试有误报,因为有时单击表格元素不会转换到另一个表格/屏幕,而是会向当前屏幕添加额外的元素。
在做了一些阅读之后,似乎使用可访问性标签可能是要走的路。因此,我在应用程序代码中(在 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,并且我能够提取例如firstElem.label 从中非常高兴。
任何帮助表示赞赏。
【问题讨论】:
-
你有什么解决办法吗? @Kaitain?
标签: ios objective-c xcode testing xcode-ui-testing