XCUI测试中UITableView滚动至最后一行后无法停止的问题求助
解决UITest中滚动到TableView最后一行后无法停止的问题
你遇到的问题核心是滚动循环的逻辑写反了,再加上可见性判断的条件过于严格,导致滚动到目标行后还会持续执行滚动操作。下面是具体的解决方案:
1. 修正滚动循环的逻辑
你的scrollToElement方法中,while循环的条件是当元素可见时继续滚动,这完全搞反了正确逻辑——我们应该在元素不可见的时候才持续滚动,直到它出现在视图中为止。
同时,建议给滚动操作加个小延迟,避免滚动过于频繁导致测试不稳定。
2. 优化元素可见性判断
原来的visible方法使用CGRectContainsRect要求元素完全显示在窗口内,但最后一行往往只能部分显示在屏幕底部,这会导致判断一直返回NO,循环无法停止。我们改用CGRectIntersectsRect,只要元素和窗口有交集(部分可见)就判定为可见。
修改后的完整代码
-(void)scrollToElement:(XCUIElement *)element application:(XCUIApplication *)app{ // 当元素不可见时,持续执行滚动操作 while (![self visible:element withApplication:app]) { XCUIElement *searchResultTableView = app.tables[@"searchResultView"]; XCUICoordinate *startCoord = [searchResultTableView coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5)]; // 向上拖动(内容向下滚动),适配从顶部滚到底部的需求 XCUICoordinate *endCoord = [startCoord coordinateWithOffset:CGVectorMake(0.0, -262)]; [startCoord pressForDuration:0.01 thenDragToCoordinate:endCoord]; // 添加小延迟,提升滚动稳定性 [NSThread sleepForTimeInterval:0.2]; } } -(BOOL)visible:(XCUIElement *)element withApplication:(XCUIApplication *)app{ // isHittable已经包含了元素存在、frame非空的判断 if (element.isHittable) { // 判断元素是否和窗口有交集(部分可见即视为可见) return CGRectIntersectsRect([app.windows elementBoundByIndex:0].frame, element.frame); } else { return NO; } }
为什么原来的代码会无限滚动?
- 循环逻辑错误:原来的循环在元素可见时仍继续滚动,导致好不容易滚到的最后一行被继续滚出屏幕,陷入无效的滚动循环;
- 可见性判断过严:
CGRectContainsRect要求元素完全在窗口内,但TableView的最后一行通常只能部分显示在屏幕底部,导致visible方法一直返回NO,循环持续执行滚动操作。
调整后,当最后一行部分可见时,visible方法就会返回YES,循环停止,你就可以执行后续的测试操作了。
内容的提问来源于stack exchange,提问作者Yagnesh Dobariya
相关产品推荐
相关产品推荐

