以编程方式将应用程序发送到后台

16

有没有一种方法可以将应用程序发送到后台?类似于您可以调用XCUIApplication.terminate(),我有一些要在applicationDidBecomeActive(_:) 上测试的UI元素。有人知道这是否有可能吗?

4个回答

10

我建议查看XCUIDevice。以下是如何按Home按钮,然后重新启动应用程序的示例:

我建议您查看XCUIDevice。以下是一个例子,演示如何按下Home按钮,然后重新启动应用程序。

func testExample() {

    // Has a nav bar.
    XCTAssert(XCUIApplication().navigationBars.element.exists)

    XCUIDevice().press(XCUIDeviceButton.home)
    // Before Swift 3: XCUIDevice().pressButton(XCUIDeviceButton.Home)
    XCUIApplication().launch()

    // Navigationbar still there on second launch.
    XCTAssert(XCUIApplication().navigationBars.element.exists)
}

可以很好地与iOS模拟器(9.3)和Xcode 7.3配合使用。谢谢! - Vish
6
根据XCUIApplication.launch()(Xcode 7.3.1)的API文档,如果应用程序已在运行,则该方法将终止该应用程序。我认为这对于此情况不适合 - 最好让应用程序进入后台,然后再将其重新启动。 - Jeremy Kao

7

我的情况是我想将应用程序后台运行,并在我上一次离开的地方重新打开它。要将应用程序放入后台:

XCUIDevice.shared.press(.home)

重新打开我上次使用的应用程序:

XCUIApplication().activate()

使用 XCUIApplication().launch() 重新启动应用程序将会从头开始启动应用程序。

我正在使用Swift 4.2


5

我刚刚成功地尝试了UIApplication.sharedApplication().performSelector("suspend")

dispatch_after(2, dispatch_get_main_queue(), {       
    // suspend the app after two seconds
    UIApplication.sharedApplication().performSelector("suspend")
})

// Swift 4 version
UIApplication.shared.perform(Selector("suspend"))

我正在尝试让这个适用于XCode自动化UI测试,这应该可以工作吗?还是这个答案适用于其他类型的测试? - Liam
@tilo 对我不起作用(Xcode 7.3.1)。dispatch_after(2, dispatch_get_main_queue(), { // suspend the app after two seconds UIApplication.sharedApplication().performSelector(#selector(NSURLSessionTask.suspend)) })它只是将应用程序置于暂停状态,而不是后台状态吗? - Jeremy Kao
@Liam 你找到在UITest中实现这个功能的方法了吗?我还在寻找中,但是毫无头绪 :( - Confused

5
在Xcode 9.0中,苹果引入了XCUIApplication.activate()activate()会在需要时启动应用程序,但如果应用程序已经在运行,则不会终止它。因此:
func testExample() {
    // Background the app
    XCUIDevice().press(.home)
    // Reactivate the app
    XCUIApplication().activate()
}

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