XCTest UI Testing - How to close and open an app without relaunch?

I have follow what @randenbyers mentioned on simulator. Before that I have manually activated Siri Service.

XCUIDevice.shared().press(XCUIDeviceButton.home)
if #available(iOS 10.3, *) {
    XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {Writer}")
    XCTAssertTrue(XCUIApplication().tabBars.buttons["My Projects"].exists)
} else {
    app.scrollViews.otherElements.buttons["Log Out"].tap()
    assertionFailure("Fail because Siri service is not activated")
}

A similar question was asked and answered here Possible to bring the app from background to foreground?

This is what I have in my XCUITest and it works like a charm (xcode 10.1 and test device is iPhone X 11.0)

func testWhatever() {

// You test steps go here until you need the background foreground to run
// To background the app 
XCUIDevice.shared.press(XCUIDevice.Button.home) 
// To bring the app back
XCUIApplication().activate() 

// You test continues after background foreground has been done. }

As of Xcode 8.3 and iOS 10.3, it is now possible to relaunch your backgrounded app with Siri!

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

Be sure to include @available(iOS 10.3, *) at the top of your test suite file.


As of Xcode 9 and iOS 11, XCUIApplication() has an activate() method that you can use to relaunch the app.

As brandenbyers suggested, you can "press" the home button to background your app, and then activate it again like this to avoid using Siri:

XCUIDevice.shared.press(.home)
XCUIApplication().activate()

Note that this only works with targets built using XCUITest, not XCTest. If you try this within a target built from XCTest, all XCUIApplication operations will crash.