【问题标题】:Programmatically sending tap event to coordinates in background in iOS using KIF使用 KIF 以编程方式将点击事件发送到 iOS 中的后台坐标
【发布时间】:2018-02-04 07:48:19
【问题描述】:

我们的想法是制作一个可以在 iOS 中另一个应用程序的后台连续发送“在坐标 (x,y) 处点击屏幕”事件的应用程序。想想“Cookie Clicker”作弊。我目前正在协助我的朋友开发他的应用程序,而我的工作是尝试尽可能多地解决它。我有一种轻微的感觉,尽可能多地点击他的一个按钮会破坏他的应用程序,这就是我在这里的原因。

该方法是使用 KIF 以及 iOS 中的后台执行来实现的。

  1. 在其中一个类中,文件 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 让事情变得更容易?)

  2. 将类作为后台服务运行会实现后台执行吗?

如果你能回答这个问题,非常感谢。

【问题讨论】:

  • 如果我的理解正确,您想要测试涉及轻击手势的用户交互,以验证应用不能承受重复的 UITouch/轻击手势...您能澄清一下吗?跨度>
  • 是的,这听起来确实像一个奇怪的请求/程序。我被要求故意破坏一个应用程序,我希望在该应用程序上无法承受多次点击调用服务器的按钮。作为一名程序员,公认的逻辑是我也......称它为“懒惰”自己点击按钮,如果我的朋友(应用程序开发人员)想自己测试错误,我可以发送给他点击“黑客”。目标是将触摸手势发送到屏幕上的某些坐标,这将是按钮。即在应用程序的屏幕上轻按没有手指的轻按。这更清楚了吗?
  • A)中的“自动抽头测试仪”在第二个应用程序中,B)在后台模式下运行有什么意义?如果有一个框架可以根据需要自动进行测试,在添加到您的朋友应用程序的重复代码库之后,您会愿意尝试吗?
  • 我的操作更多是凭直觉而不是实际情况。说实话,我不是唯一的测试人员,手头的工作是为了获得他将给予的奖品。所以a)你的方法是一种可能的方法,但我不想浪费他的时间; b) 他不会帮助我放弃他的奖品。总而言之,这是个人程序。此外,我可能会将这个问题的解决方案应用到未来的项目中。谢谢。
  • 我现在明白你在问什么,并且相信这是可以做到的。我这样说是因为我遇到了从 iOS 设备键盘读取数据的间谍软件,称为键盘记录器,它与您正在寻找的领域相同。

标签: ios objective-c iphone background kif


【解决方案1】:

几个选项,具体取决于您可以访问的内容。如果您有想要“调试”的其他应用程序的实际 IPA,并且可以将测试目标附加到它,那么KIF 是一个不错的选择。

这是一个关于使用 KIF 进行 UI 测试的小指南(很容易在谷歌上搜索,链接 here)。一个简短的总结是:

  [tester tapViewWithAccessibilityLabel:@"Clear"];

这种代码应该有一个等效的名称 tapViewAtPoint 或类似的东西(我上次使用 KIF 是一年多前,但它应该有很好的文档记录)。

但是,如果您无法访问您尝试攻击的应用程序(这似乎更适合此类问题),那么您可以完全使用不同的方法。

Automator 可以帮助您编写脚本,如果您至少可以在 iPhone 模拟器中下载该应用程序。由于我相信 Xcode 9 允许您执行此操作,因此这部分应该不难,只要目标应用程序在应用商店中即可。

如果不是,并且您没有代码,我很想知道您是如何分发该应用程序的,因为可能仍有一种方法可以使用我建议的一个或另一个选项。祝你好运!

编辑:基于再次阅读问题 + 赏金请求进行更新

将类作为后台服务运行会实现后台执行吗?

这又取决于您是否可以将其作为后台服务运行。如果您可以访问代码本身,则可以完成,尽管我不确定在您描述的问题中后台执行的目标是什么。

KIF 将无法处理不在前台的任何内容。一般来说,iOS 设备从不会在后台对应用程序进行点击,因此如果正在测试的攻击向量是重复点击应用程序,那么后台执行可能不是答案。

从您的问题来看,这看起来更像是一个并行化抽头循环的用例,您的问题似乎可以从Xcode 9 的并行模拟器功能添加中受益。

虽然我还没有亲自尝试过,但您可以在运行Xcode 9 的机器上在多个模拟器中并行运行KIF。这可能是获取尽可能多的关于导致问题的数据点的最佳方式,就像UI tests 一样,您可以随时截取应用程序的屏幕截图。在Xcode 9 中,我相信还有一个新功能可以直接从Simulator 录制视频(不再需要Quicktime)。

【讨论】:

  • 据我了解,这是一个非常有帮助的答案。关于应用程序本身,它是给我的 IPA,但由于我正在帮助我的朋友测试它,我希望该方法即使已从 App Store 下载也能正常工作,调试目的你看。关于并行化抽头循环的方法,将如何完成以及在什么情况下完成?非常感谢您的回复。
  • 好吧,只有在您使用 Xcode 9 时才能在模拟器上进行并行化(很快就会退出测试版)。不确定“在什么情况下”,我认为这是由你来确定的,但机制是最有可能使用 Automator,并让 Automator 一个接一个地快速运行模拟器,在你想要点击的地方快速连续点击。跨度>
  • 我一定会试一试的。有你的 200,先生!
  • 如果我能再麻烦你一次,我正在寻找的方法是,即使应用程序是从 App Store 下载的,点击事件仍然可以正常工作。您提出的方法仅在我获得 .ipa 时才有用,但对于实时应用程序而言并非如此。有什么想法吗?
  • 啊,我实际上不确定这种情况。我知道Workflow 是一个类似于Automator 的应用程序,但在iOS 本身上。我用过,效果很好,也许可以支持你需要测试的应用(它绝对可以为你循环一个动作)。 fwiw 制造 Workflow 的公司最近被 Apple 收购 :)。
猜你喜欢
  • 2023-03-10
  • 2013-12-21
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2014-01-24
  • 2021-06-04
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多