4

我目前正在尝试使用 KIF 和 Subliminal 进行 iOS 集成测试。但我仍然无法弄清楚如何使用这两个框架来模拟表格视图或集合视图的滚动。比如如何滚动到表格视图或集合视图的底部。

编辑 1

我在这里制作了简单的单一集合视图应用程序https://github.com/nicnocquee/TestSubliminal

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

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

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

编辑 2

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

4

3 回答 3

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];
于 2013-12-03T01:01:56.790 回答
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 的应用挂钩解决方案相比,这种方法要求您能够识别要滚动到的特定单元格。所以我将这种方法定义为“滚动到一个单元格”,而应用程序钩子可以让你“滚动到一个位置”。

于 2013-08-16T19:25:19.387 回答
0

问题是您试图在测试用例中找到的单元格,即带有标签“这是单元格 19”的单元格,直到集合视图已经滚动后才存在。所以我们需要先让视图滚动,然后再寻找单元格。使用 Subliminal 使集合视图滚动的最简单方法是通过应用程序挂钩。在(例如)您的视图控制器的viewDidLoad方法中,您可以注册视图控制器以响应来自任何 Subliminal 测试用例的特定消息,如下所示:

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

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

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

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

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

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

或便利宏:

SLAskApp(scrollToBottom);

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

sendActionorSLAskApp宏返回时,您的单元格 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");
}
于 2013-08-16T17:59:34.357 回答