Yag*_*iya 5 ios xcode-ui-testing xcuitest
在我的一个UITableView有超过10行.我想在UITestCase跑步时滚到最后一排.
我写下面的代码滚动到最后一行.
-(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];
}
}
-(BOOL)visible:(XCUIElement *)element withApplication:(XCUIApplication *)app{
if (element.exists && !CGRectIsEmpty(element.frame) && element.isHittable) {
return CGRectContainsRect([app.windows elementBoundByIndex:0].frame, element.frame);
} else {
return FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
我UITestCase通过下面的代码在我的方法之一中调用了上面的方法
XCUIElement *searchResultTableView = app.tables[@"searchResultView"];
[self waitForElementToAppear:searchResultTableView withTimeout:30];
XCUIElement *table = [app.tables elementBoundByIndex:0];
XCUIElement *lastCell = [table.cells elementBoundByIndex:table.cells.count - 1];
[self scrollToElement:lastCell application:app];
Run Code Online (Sandbox Code Playgroud)
通过这段代码,我可以滚动到最后一行,但到达最后一行后,它继续做滚动手段无法停止滚动.
请帮我滚动到最后一行,然后它应该停止滚动,以便我可以执行下一个动作事件.
我已经提到了StackOverFlow答案,但没有一个符合我的要求.
提前致谢.
我在我的一个项目中遇到过类似的问题.我想通过TestKit框架测试"加载更多"功能.
以下是实现相同方案的一些解决方法.
//app : is your current instance of appliaction
//listTable : is a Table which you've found via accessibility identifier
//loadMoreTest : is a parameter to determine whether code should perform test for loadmore feature or not
- (void)testScrollableTableForApplication:(XCUIApplication *)app
forTable:(XCUIElement *)listTable
withLoadMoreTest:(BOOL)loadMoreTest {
[listTable accessibilityScroll:UIAccessibilityScrollDirectionUp];
[listTable swipeUp];
if (loadMoreTest) {
__block BOOL isLoadMoreCalled;
__block XCUIElement *lastCell;
__block __weak void (^load_more)();
void (^loadMoreCall)();
load_more = loadMoreCall = ^() {
XCUIElementQuery *tablesQuery = app.tables;
XCUIElementQuery *cellQuery = [tablesQuery.cells containingType:XCUIElementTypeCell identifier:@"LoadMoreCell"];
lastCell = cellQuery.element;
if ([lastCell elementIsWithinWindowForApplication:app]) {
[self waitForElementToAppear:lastCell withTimeout:2];
[lastCell tap];
isLoadMoreCalled = true;
[self wait:2];
}
[listTable swipeUp];
if (!isLoadMoreCalled) {
load_more();
}
};
loadMoreCall();
}
}
- (void)waitForElementToAppear:(XCUIElement *)element withTimeout:(NSTimeInterval)timeout
{
NSUInteger line = __LINE__;
NSString *file = [NSString stringWithUTF8String:__FILE__];
NSPredicate *existsPredicate = [NSPredicate predicateWithFormat:@"exists == 1"];
[self expectationForPredicate:existsPredicate evaluatedWithObject:element handler:nil];
[self waitForExpectationsWithTimeout:timeout handler:^(NSError * _Nullable error) {
if (error != nil) {
NSString *message = [NSString stringWithFormat:@"Failed to find %@ after %f seconds",element,timeout];
[self recordFailureWithDescription:message inFile:file atLine:line expected:YES];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
为XCUIElement XCUIElement + Helper.m创建一个类别, 并将其导入到各自的Test类中.
#import <XCTest/XCTest.h>
@interface XCUIElement (Helper)
/// Check whether current XCUIElement is within current window or not
- (BOOL)elementIsWithinWindowForApplication:(XCUIApplication *)app ;
@end
@implementation XCUIElement (Helper)
/// Check whether current XCUIElement is within current window or not
/*
@description: we need to check particular element's frame and window's frame is intersecting or not, to get perfectly outcome whether element is currently visible on screen or not, because if element has not yet appeared on screen then also the flag frame, exists and hittable can become true
*/
- (BOOL)elementIsWithinWindowForApplication:(XCUIApplication *)app {
if (self.exists && !CGRectIsEmpty(self.frame) && self.hittable)
return CGRectContainsRect(app.windows.allElementsBoundByIndex[0].frame, self.frame);
else
return false;
}
@end
Run Code Online (Sandbox Code Playgroud)
要获得"加载更多"单元格,我已经给出了
cell.accessibilityIdentifier = @"LoadMoreCell";
Run Code Online (Sandbox Code Playgroud)
其余代码是testScrollableTableForApplication中的递归函数,使Tableview滚动到达底部,这样我就可以访问加载更多单元格(在您的情况下是最后一个单元格).然后我执行动作点击从服务器获取新记录.然后我再次滚动表以验证是否已从服务器获取新记录.
提示:您可以使用do while或while循环替换递归函数来实现相同的功能.
希望这可以帮助!
快乐编码!!
| 归档时间: |
|
| 查看次数: |
702 次 |
| 最近记录: |