在iOS应用的UI测试中禁用等待空闲状态

时间:2016-12-22 06:30:20

标签: ios xcode-ui-testing

基本上问题与此问题相同:XCTestCase: Wait for app to idle

我在视图中一直在使用“背景动画”。 Xcode / iOS的!@#$#$& @ UI测试想要等待所有UIView动画在它认为应用程序空闲之前结束并继续点击按钮等等。它只是不能用的方式我们设计了应用程序。 (具体来说,我们有一个使用UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse选项设置动画的按钮,因此它永远不会停止。)

但我认为可能会有某种方式关闭和/或缩短状态“等待应用程序空闲”。在那儿?怎么样?还有其他方法吗?

5 个答案:

答案 0 :(得分:15)

您实际上可以禁用wait for app to idle。这是一个黑客,可能不稳定。禁用动画,并启用此黑客攻击后,我发现性能提升了20%(除了禁用动画带来的性能提升)。

所有你需要做的就是调出一个叫做空闲应用程序的方法,然后不用它。该方法为XCUIApplicationProcess waitForQuiescenceIncludingAnimationsIdle:

这是我在swift 3中的工作解决方案 - 可能有更好的方法,但这可用于概念验证。

扩展XCTestCase课程。生病了我的MyTestCase

static var swizzledOutIdle = false

override func setUp() {
    if !MyTestCase.swizzledOutIdle { // ensure the swizzle only happens once
        let original = class_getInstanceMethod(objc_getClass("XCUIApplicationProcess") as! AnyClass, Selector(("waitForQuiescenceIncludingAnimationsIdle:")))
        let replaced = class_getInstanceMethod(type(of: self), #selector(MyTestCase.replace))
        method_exchangeImplementations(original, replaced)
        MyTestCase.swizzledOutIdle = true
    }
    super.setUp()
}

@objc func replace() {
    return
}

注意wait for app to idle将不再出现在日志中。

答案 1 :(得分:10)

不幸的是,使用Apple的UI测试,您无法等待应用程序闲置'或者轮询其他网络活动,但是您可以使用环境变量来禁用应用中的动画,以使测试更加稳定。在测试之前的设置方法中设置一个这样的环境变量。

override func setUp() {
    super.setUp()
    continueAfterFailure = false
    let app = XCUIApplication()
    app.launchEnvironment = ["UITEST_DISABLE_ANIMATIONS" : "YES"]
    app.launch()
}

现在在您的源代码中:

if (ProcessInfo.processInfo.environment["UITEST_DISABLE_ANIMATIONS"] == "YES") {
    UIView.setAnimationsEnabled(false)
}

如果您只想禁用该特定视图的动画或在代理文件中禁用整个应用中的动画,则可以将该检查置于特定视图中。

答案 2 :(得分:2)

如果有人需要,我在Objective-C中使用了gh123man答案:

this.dataService.getDatas().subscribe((data: Datas[]) => { // good!
      for (let item of data) {
        this.arr.push(item);
      }
      console.log("smartlamps from Map ", this.item);

答案 3 :(得分:0)

我使用了h.w.powers' Objective-C中的解决方案,以防任何人需要它。

设置:

XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchEnvironment = @{@"UITEST_DISABLE_ANIMATIONS":@"YES"}; 
[app launch];

然后在你的代码中

if ([[[NSProcessInfo processInfo] environment][@"UITEST_DISABLE_ANIMATIONS"] isEqualToString:@"YES"]) {
// do something like stopping the animation
}

答案 4 :(得分:0)

我在几个测试类的setUp()中使用了gh123man的解决方案,在升级到iOS 13.3之前,它的工作原理很吸引人。从那以后,应用程序陷入启动状态。

发现,如果我将其移至disableWaitForIdle()和enableWaitForIdle()之类的方法并仅以最精细的方式(在我知道应用将永远不会变为空闲的水龙头之前和之后)调用它们,它仍然可以正常工作。像这样:

@discardableResult func selectOption() -> Self {
    disableWaitForIdle()
    app.cells["Option"].firstMatch.waitAndForceTap(timeout: 20)
    enableWaitForIdle()
    return self
}