简体   繁体   中英

UITest cases to handle with location services alert

I am writing UI test cases for my project.

My project flow is as below:

  • Login Screen. User enters credentials and press login.
  • Home Screen. There is location requirement so system as for user's permission. I allow it.
  • Logout.

So when I do fresh install of application this flow is recorded in test case and works if I perform on new fresh build.

But problem is when I test on old build there is no alert for location permission and the test's gets fail. How can I handle this cases or ask user for permission every time when I run tests?

For resetting credentials of user I am passing launchArguments to XCUIApplication() and handle in AppDelegate.

I have implemented code let me know if its correct way :

addUIInterruptionMonitor(withDescription: "Allow “APP” to access your location?") { (alert) -> Bool in
            alert.buttons["Only While Using the App"].tap()

            return true
        }

The above code works for both if alert comes or not.

Using an interruption monitor is the correct way. However, it's safer to check if the alert being displayed is the alert you're expecting before you interact with the alert:

addUIInterruptionMonitor(withDescription: "Allow “APP” to access your location?") { (alert) -> Bool in
    let button = alert.buttons["Only While Using the App"]
    if button.exists {
        button.tap()
        return true // The alert was handled
    }

    return false // The alert was not handled
}

I use the following code to allow user's location:

    // MARK: - Setup
    
    override func setUp() {
        super.setUp()
        continueAfterFailure = false
        app = XCUIApplication()
        app.launch()
        addUIInterruptionMonitor(withDescription: "System Dialog") { (alert) -> Bool in
            alert.buttons["Allow Once"].tap()
            return true
        }
    }

In this setup, I "register" the interruption monitor for tapping the allow button, so in this case I can dismiss that modal. Now, there's my test:

    // MARK: - Test change mall
    
    func testChangeMall() {
        let selectorChangeButton = app.buttons["change_mall_button"]
        XCTAssert(selectorChangeButton.exists, "Selector change button does not exist")
        selectorChangeButton.tap()
        app.navigationBars.firstMatch.tap()
        let cell = app.staticTexts["Shopping Centre"]
        XCTAssert(cell.exists, "There's no cell with this title")
        cell.tap()
        sleep(1)
        let label = app.staticTexts["Shopping Centre"]
        XCTAssert(label.exists, "Nothing changes")
    }

In this test, simply I go to a view controller with a list sorted by location. First, I need to dismiss the location's system alert. So, first I dismiss that modal and then I tap a cell from my TableView. Then, I need to show it in my main view controller so I dismiss my view controller and I expect the same title.

Happy Coding!

Try this

    let app2 = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    let button = app2.alerts.firstMatch.buttons["Allow While Using App"]
    button.waitForExistence(timeout: 10)
    button.tap()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM