如何使用Subliminal模拟表格视图或集合视图滚动?

时间:2013-08-15 13:51:56

标签: ios integration-testing subliminal

我目前正在尝试用于iOS集成测试的KIF和Subliminal。但我仍然无法弄清楚如何使用两个框架模拟表视图或集合视图上的滚动。就像滚动到表视图或集合视图的底部一样。

编辑1

我在这里制作了简单的单一收藏视图应用https://github.com/nicnocquee/TestSubliminal

基本上我想测试最后一个单元格的标签。我做不到

SLElement *lastLabel = [SLElement elementWithAccessibilityLabel:@"Label of the last cell"];
[lastLabel scrollToVisible];

因为标签在集合视图滚动到底部之前还不存在。

编辑2

我将Aaron的答案标记为答案。但杰弗里也有效:)

3 个答案:

答案 0 :(得分:1)

您还可以通过拖动集合视图来模拟用户滚动查看单元格的集合,直到单元格变为可见:

while (!SLWaitUntilTrue([UIAElement(lastLabel) isValidAndVisible], 1.0)) {
    [[SLWindow mainWindow] dragWithStartOffset:CGPointMake(0.5, 0.75) endOffset:CGPointMake(0.5, 0.25)];
}

这些偏移转换为沿着集合视图的中间向上拖动,从视图的75%向下拖动到视图的25%。 -isValidAndVisible允许您检查单元格的可见性,而不必担心它是否存在(如果单元格不存在,-isVisible会抛出异常)。然后我将-isValidAndVisible包裹在SLWaitUntilTrue中,以便我们让集合视图在再次拖动之前完成滚动。

与@ AaronGolden的app hook解决方案相比,此方法要求您能够识别要滚动到的特定单元格。所以我将这种方法描述为“滚动到一个单元格”,而app钩子可以让你“滚动到一个位置”。

答案 1 :(得分:1)

这可能更具侵略性,但也很简单 - 转到SLUIAElement.m并添加以下方法:

- (void)scrollDown {
[self waitUntilTappable:NO thenSendMessage:@"scrollDown()"];
}


- (void)scrollUp {
[self waitUntilTappable:NO thenSendMessage:@"scrollUp()"];
}

您还必须在SLUIAElement.h文件中声明这些方法签名,以使这些新方法对测试套件可见。

然后你可以做的是在集合视图中添加一个辅助功能标识符,调用该标识符并在其上滚动。实施例:

SLElement *scrollView = [SLElement elementWithAccessibilityIdentifier:@"scrollView"];

[scrollView scrollDown];

答案 2 :(得分:0)

问题是您在测试用例中尝试查找的单元格,标签为“This is cell 19”的单元格,在集合视图已滚动之前不存在。所以我们需要先使视图滚动,然后然后查找单元格。使用Subliminal进行集合视图滚动的最简单方法是通过应用程序挂钩。在(例如)视图控制器的viewDidLoad方法中,您可以注册视图控制器以响应来自任何潜意识测试用例的特定消息,如下所示:

[[SLTestController sharedTestController] registerTarget:self forAction:@selector(scrollToBottom)];

并且视图控制器可以将该方法实现为:

- (void)scrollToBottom {
    [self.collectionView setContentOffset:CGPointMake(0.0, 1774.0)];
}

1774只是将测试应用中的集合视图一直滚动到底部的偏移量。在实际的应用程序中,app钩子可能会更复杂。 (在实际应用中,您需要确保在视图控制器的[[SLTestController sharedTestController] deregisterTarget:self]方法中调用dealloc。)

要从潜意识测试用例中触发scrollToBottom方法,您可以使用:

[[SLTestController sharedTestController] sendAction:@selector(scrollToBottom)];

或便利宏:

SLAskApp(scrollToBottom);

共享SLTestController会将scrollToBottom消息发送到注册接收它的对象(您的视图控制器)。

sendActionSLAskApp宏返回时,您的单元格19已经可见,因此您不再需要打扰[lastLabel scrollToVisible]调用了。您的完整测试用例可能如下所示:

- (void)testScrollingCase {
    SLElement *label1 = [SLElement elementWithAccessibilityLabel:@"This is cell 0"];
    SLAssertTrue([UIAElement(label1) isVisible], @"Cell 0 should be visible at this point");

    SLElement *label5 = [SLElement elementWithAccessibilityLabel:@"This is cell 5"];
    SLAssertFalse([UIAElement(label5) isValid], @"Cell 5 should not be visible at this point");

    // Cause the collection view to scroll to the bottom.
    SLAskApp(scrollToBottom);

    SLElement *lastLabel = [SLElement elementWithAccessibilityLabel:@"This is cell 19"];
    SLAssertTrue([UIAElement(lastLabel) isVisible], @"Last cell should be visible at this point");
}