这个想法是制作一个应用程序,可以在iOS中另一个应用程序的后台连续发送"点击坐标(x,y(处的屏幕"事件。想想"饼干点击器"作弊。我目前正在帮助我的朋友在他的应用程序中,我的工作是尝试尽可能多地将其排除在外。我有点感觉,尽可能多地点击他的一个按钮会破坏他的应用程序,这就是为什么我在这里。
该方法使用 KIF 以及 iOS 中的后台执行来实现此目的。
-
在其中一个类中,文件 KIFUITestActor.m 具有以下代码:
- (void)tapScreenAtPoint:(CGPoint)screenPoint { [self runBlock:^KIFTestStepResult(NSError **error) { // Try all the windows until we get one back that actually has something in it at the given point UIView *view = nil; for (UIWindow *window in [[[UIApplication sharedApplication] windowsWithKeyWindow] reverseObjectEnumerator]) { CGPoint windowPoint = [window convertPoint:screenPoint fromView:nil]; view = [window hitTest:windowPoint withEvent:nil]; // If we hit the window itself, then skip it. if (view != window && view != nil) { break; } } KIFTestWaitCondition(view, error, @"No view was found at the point %@", NSStringFromCGPoint(screenPoint)); // This is mostly redundant of the test in _accessibilityElementWithLabel: CGPoint viewPoint = [view convertPoint:screenPoint fromView:nil]; [view tapAtPoint:viewPoint]; return KIFTestStepResultSuccess; }]; }
这是否是我正在寻找的代码,我将如何在 Swift 中实现它?(或者Objective-C,如果它让事情变得更容易?(
将 - 类作为后台服务运行是否会实现后台执行?
如果您能回答这个问题,非常感谢。
几个选项,具体取决于您有权访问的内容。如果您有要"错误"的其他应用程序的实际 IPA,并且可以将测试目标附加到它,那么KIF
是一个不错的选择。
这是使用KIF进行UI测试的小指南(易于谷歌搜索,链接在这里(。不过,快速总结一下:
[tester tapViewWithAccessibilityLabel:@"Clear"];
这种代码应该有一个名为tapViewAtPoint
或类似的东西(我上次使用KIF是在一年多前,但它应该像当时一样被很好地记录下来(。
但是,如果您无法访问您尝试攻击的应用程序(对于此类问题似乎更有可能(,那么您可以完全使用不同的方法。
自动操作可以帮助您编写脚本,如果您至少可以在iPhone模拟器中下载该应用程序。既然 Xcode 9 我相信允许你这样做,这部分应该不难,只要目标应用在应用商店里就行了。
如果不是,并且您没有代码,我很想知道您是如何分发应用程序的,因为可能仍然有一种方法可以使用我建议的一个或另一个选项。祝你好运!
编辑:根据重新阅读问题+赏金请求再次更新
将类作为后台服务运行是否会实现后台执行?
这再次取决于您是否可以将其作为后台服务运行。如果您可以访问代码本身,则可以完成,尽管我不确定您描述的问题中后台执行的目标是什么。
KIF
将无法处理任何不在前台的内容。通常,iOS 设备从不将点击漏斗到后台的应用程序,因此如果正在测试的攻击媒介是重复点击应用程序,则后台执行可能不是答案。
从您的问题来看,这看起来更像是并行化分接循环的用例,您的问题似乎可以从Xcode 9
的并行模拟器功能添加中受益。
虽然我还没有亲自尝试过,但您可以在运行Xcode 9
的机器上的多个模拟器中进行并行KIF
运行。这可能是获取尽可能多的有关导致问题的原因的数据点的最佳方式,因为您可以随时截取应用程序的屏幕截图UI tests
。在Xcode 9
,我相信还有一个新功能可以直接从Simulator
录制视频(不再需要Quicktime
(。