Liam
Liam

Reputation: 2709

Programmatically sending an app to background

Is there a way to send the application to background? Similarly to how you can call XCUIApplication.terminate(), I have some UI Elements to test on applicationDidBecomeActive(_:). Does anyone know if this is at all possible?

Upvotes: 16

Views: 9835

Answers (4)

ravron
ravron

Reputation: 11211

In Xcode 9.0, Apple introduced XCUIApplication.activate(). activate() will launch the application if necessary, but will not terminate it if it is already running. Thus:

func testExample() {
    // Background the app
    XCUIDevice().press(.home)
    // Reactivate the app
    XCUIApplication().activate()
}

Upvotes: 5

a.ajwani
a.ajwani

Reputation: 878

In my case I wanted to background the app and open it where I previously left it. To background the app:

XCUIDevice.shared.press(.home)

To re-open the app where I left it:

XCUIApplication().activate()

Re-launching the app using XCUIApplication().launch() would launch the app from new.

I am using Swift 4.2

Upvotes: 7

tilo
tilo

Reputation: 14169

I just tried UIApplication.sharedApplication().performSelector("suspend") successfully.

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"))

Upvotes: 6

JMFR
JMFR

Reputation: 809

I would recommend checking out XCUIDevice. Here is how you might press the home button and then relaunch the application

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)
}

Upvotes: 10

Related Questions