将应用程序发送到后台并从 XCTest 中的最近应用程序重新启动它

Sending app to background and re-launching it from recents in XCTest

我一直在寻找解决我的问题的方法,我需要将我的应用程序发送到后台并在特定时间间隔后从最近的应用程序重新启动它。 deactivateAppForDuration() 用于在 Instruments UIAutomation 中实现此目的。 有人知道如何在 XCTest 中实现吗?

不确定是否可行,因为我还没有测试过,但值得一试。如果不出意外,它应该会让您知道去哪里看。

XCUIApplication class 提供以编程方式终止和启动您的应用程序的方法:https://developer.apple.com/reference/xctest/xcuiapplication

XCUIDevice class 允许您模拟设备上的按钮按下:https://developer.apple.com/reference/xctest/xcuidevicebutton

您可以将它们与 UIControlNSURLSessionTask 一起使用来暂停您的应用程序。

此过程使用 Swift 3 的示例可能看起来像这样(Swift 2 及以下的语法可能略有不同):

func myXCTest() {

    UIControl().sendAction(#selector(NSURLSessionTask.suspend), to: UIApplication.shared(), for: nil)

    Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(launchApp), userInfo: nil, repeats: false)   
}

func launchApp() {
    XCUIApplication().launch()
}

另一种方法可能只是按下主页按钮,然后在计时器结束后重新启动应用程序:

func myXCTest {

    XCUIDevice().press(XCUIDeviceButton.Home)

    Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(launchApp), userInfo: nil, repeats: false)     
}

这两种方法都不能满足您的要求,也不能完美地工作,但希望它能为您提供一个起点。您可以使用它并找到适合您的解决方案。祝你好运!

如果您可以在当前测试中使用 Xcode 8.3 和 iOS 10.3,那么您可能想试试这个:

XCUIDevice.shared().press(XCUIDeviceButton.home)
sleep(60)
XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {appName}")

请务必在测试套件文件的顶部包含 @available(iOS 10.3, *)

这将相对等同于 deactivateAppForDuration()。只需将 sleep() 更改为您想要的持续时间。