使用KIF在iOS中以编程方式在后台发送到坐标的轻击事件

6
这个想法是制作一个应用程序,可以在iOS上的另一个应用程序的后台连续发送“点击屏幕坐标(x,y)”事件。想象一下“Cookie Clicker”作弊。我目前正在协助我的朋友开发他的应用程序,我的工作是尽可能地试图使其出现漏洞。我有一种轻微的感觉,尽可能多地点击他的按钮会导致他的应用程序出现故障,因此我来到这里。
该方法使用KIF以及iOS的后台执行来实现此目的。
  1. In one of the classes, the file KIFUITestActor.m has the code:

    - (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;
        }];
    }
    

    Would this be the code I'm looking for, and how would I implement it in Swift? (Or Objective-C if it makes things easier?)

  2. Would running the class as a background service achieve the background execution?
如果您能回答这个问题,将不胜感激。

如果我理解正确的话,您想要测试涉及轻拍手势的用户交互,以验证应用程序是否能够承受重复的UITouch/Tap手势...您能否澄清一下? - ChrisHaze
2
确实,这听起来像是一个奇怪的请求/过程。我被要求故意使一个应用程序出现错误,我预计它无法承受调用服务器的按钮多次点击。作为一名程序员,被认为是太...称之为“懒”,自己点击按钮,如果我的朋友(应用程序开发者)想要测试这个错误,我可以发送给他这个点击“黑客”。目标是向屏幕上的某些坐标发送触摸手势,即按钮。也就是说,在应用程序上不用手指轻点屏幕,而是使用“轻击”“轻击”“轻击”的方式。这样清楚了吗? - planetastro
在第二个应用程序中拥有“自动化水龙头测试器”并在后台模式下运行的意义是什么?如果有一个框架可用于按需自动化测试,并已添加到您朋友的应用程序的重复代码库中,那么您是否愿意尝试? - ChrisHaze
1
我更多地是凭直觉而非实际事实在操作。说实话,我不是唯一的测试人员,手头的工作是为了获得他将要给予的奖品。因此,a) 你的方法很有可能可行,但我不想浪费他的时间;b) 他不会帮助我放弃他的奖品。总之,这是一个个人过程。此外,我可能会将解决这个问题的方案应用到未来的项目中。谢谢。 - planetastro
1
我现在明白你的问题,并且相信这是可以做到的。我这么说是因为我曾经遇到过一种名为键盘记录器的间谍软件,它可以从iOS设备键盘中读取数据,这与你所寻找的东西处于同一领域。 - ChrisHaze
1个回答

1

根据您所拥有的访问权限,有几种选择。如果您拥有其他应用程序的实际IPA,并且可以将测试目标附加到它,则KIF是一个很好的选择。

这是关于使用KIF进行UI测试的小指南(容易搜索,链接在这里)。简要概述如下:

  [tester tapViewWithAccessibilityLabel:@"Clear"];

那种代码应该有一个名为tapViewAtPoint或类似的等效名称(我上一次使用KIF是一年前,但它应该被记录在案)。但是,如果您无法访问要攻击的应用程序,这似乎更有可能是这种类型的问题,那么可以完全使用不同的方法。如果您至少可以在iPhone模拟器中下载应用程序,则Automator可以帮助您编写脚本。自Xcode 9以来,我相信允许您这样做,只要目标应用程序在应用商店中,这部分就不难。如果没有,并且您没有代码,则我很想知道您如何分发应用程序,因为仍然可能有一种使用我建议的选项之一的方法。祝你好运!编辑:根据再次阅读问题+赏金请求进行更新。运行类作为后台服务是否可以实现后台执行?
这取决于您是否可以将其作为后台服务运行。如果您可以访问代码本身,则可以完成此操作,尽管我不确定后台执行的目标是什么。
KIF无法在非前台工作。一般来说,iOS设备从不将点击漏斗到后台应用程序中,因此,如果要测试的攻击向量是重复点击应用程序,则后台执行可能不是答案。
根据您的问题,这更像是并行化点击循环的用例,您的问题似乎可以从Xcode 9的并行模拟器功能添加中受益。
虽然我个人还没有尝试过这个,但您可以在运行Xcode 9的机器上的多个模拟器中进行并行KIF运行。这很可能是获取有关导致问题的尽可能多的数据点的最佳方法,因为使用UI测试可以在任何时候对应用程序进行屏幕截图。在Xcode 9中,我认为还有一个新功能,可以直接从模拟器录制视频(不再需要Quicktime)。

据我所知,这是一个非常有帮助的答案。关于应用本身,它是一个给我的IPA文件,但由于我正在帮助我的朋友测试它,我希望方法是这样的,即使它已经从App Store下载了,也能正常工作,你懂的,为了调试目的。关于并行化tap循环的方法,如何实现以及在什么情况下进行?非常感谢您的回复。 - planetastro
很好,如果您正在使用即将发布的Xcode 9,则可以在模拟器上进行并行化。不确定“在什么情况下”,我认为这取决于您的判断,但机制可能是使用Automator,并让Automator按照快速连续的方式逐个模拟器进行点击操作。 - BHendricks
1
我一定会尝试的。先生,这是您的200! - planetastro
如果我可以再麻烦您一次,我正在寻找的方法是,即使应用程序是从App Store下载的,点击事件仍将正常工作。您提出的方法仅在我获得.ipa时有用,但对于实时应用程序来说并非如此。有任何想法吗? - planetastro
啊,那种情况下我其实不太确定。我知道Workflow是一款类似于Automator的应用程序,但它是在iOS上运行的。我用过它,它的效果相当不错,也许能够支持你需要测试的应用程序(它肯定可以为你循环执行一个操作)。顺便说一句,制作Workflow的公司最近被苹果收购了 :)。 - BHendricks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接