jkp*_*jkp 4 acceptance-testing gesture ios uispec ios-ui-automation
我正在尝试使用frank(反过来UISpec)为我们的新iOS应用程序编写一些验收测试.虽然框架支持触摸作为与视图交互的基本方式,但它目前不支持任何更多涉及的手势(例如,捏合,滑动等).我需要添加对滑动的支持,至少因为这是我们应用程序功能的核心,没有它我们的测试将毫无用处.
如果我能找到一种模拟Cocoa事件的方法,那么实现它应该相当简单.如果您使用Apple的UIAutomation框架(请参阅此处),则可以发送滑动手势,因此这是一个在外部生成这些事件的示例.我在网上搜索过,但没有找到任何人这样做的例子(虽然有一个帖子,有人在此之前要求类似的东西......).
非常感谢您的帮助/想法......
我昨天花的时间试图让这个工作最终解决各种问题.我对此并不完全满意,但这是我现在能做的最好的事情 - 如果有人能提出任何改进建议或者有其他工作方式我会欢迎他们......
无论如何,对于其他试图做类似事情的人.我根据我对中详述的API解决方案这篇文章 -我记录的事件,我想模拟序列,然后发挥他们回来.唯一的障碍是我无法使内置播放API工作(我在底部提到的评论中提到了同样的崩溃).经过一段时间在ASM土地上挖掘,我最终编写了自己的版本.
@implementation UIApplication (EventReplay)
///
/// - replayEventsFromFile:
///
- (void)replayEventsFromFile:(NSString *)filename
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:filename];
NSArray* eventList = [[NSArray arrayWithContentsOfFile:filePath] retain];
[self replayEvents:eventList];
}
///
/// - replayEvents:
///
- (void)replayEvents:(NSArray *)events
{
if (!events.count)
return;
NSDictionary *eventDict = [events objectAtIndex:0U];
GSEventRef thisEvent = GSEventCreateWithPlist((CFDictionaryRef)eventDict);
uint64_t eventTime = thisEvent->record.timestamp;
thisEvent->record.timestamp = mach_absolute_time();
mach_port_t appPort = GSCopyPurpleNamedPort([[[NSBundle mainBundle] bundleIdentifier] UTF8String]);
GSSendEvent(&thisEvent->record, appPort);
mach_port_deallocate(mach_task_self(), appPort);
if (events.count <= 1)
return;
NSIndexSet *remainderIndexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, events.count - 1)];
NSArray *remainingEvents = [events objectsAtIndexes:remainderIndexes];
GSEventRef nextEvent = GSEventCreateWithPlist((CFDictionaryRef)[remainingEvents objectAtIndex:0U]);
NSTimeInterval nextEventDelay = GetTimeDelta(nextEvent->record.timestamp, eventTime);
if (nextEventDelay > 0.05)
[self performSelector:@selector(replayEvents:) withObject:remainingEvents afterDelay:nextEventDelay];
else
[self replayEvents:remainingEvents];
CFRelease(nextEvent);
CFRelease(thisEvent);
}
@end
Run Code Online (Sandbox Code Playgroud)
上面的代码段显示了我如何回放事件.我的实现相当苛刻 - 你会看到我不得不捏造这样一个事实:如果我盲目地使用计时器来安排下一个事件,有时它不会发射 - 似乎是在延迟太小时.你看到的可怕黑客似乎让事情变得正常
无论如何,希望这能以某种方式帮助别人.
| 归档时间: |
|
| 查看次数: |
4945 次 |
| 最近记录: |