Home > Back-end >  Handling the answer from API in UI Testing Swift
Handling the answer from API in UI Testing Swift

Time:10-08

I have weather app. It fetches the data from API. I enter needed city, then next screen opens and shows me the name of the city and temperature. I am writing UI test, which should open the app, handle an alert which asks to use location, then test should write the city name and check if this city exists in the screen. All works except checking the city name at the end. I thought maybe the problem is because it needs some time to get the answer from API, and tests doesn’t wait for it. Maybe I need to set timer to wait for answer. Or the problem is in smth else? Here is my code and it fails at the last line.

    func testExample() throws {
        
        let app = XCUIApplication()
        app.launchArguments = ["enable-testing"]
        app.launch()
        
        app/*@START_MENU_TOKEN@*/.staticTexts["My location"]/*[[".buttons[\"My location\"].staticTexts[\"My location\"]",".staticTexts[\"My location\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap()
        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
        }
        
        app.textFields["Enter your city"].tap()
        app.textFields["Enter your city"].typeText("Barcelona")
        
        app.buttons["Check weather"].tap()
        
        XCTAssertTrue(app.staticTexts["Barcelona"].exists)
       
    }

CodePudding user response:

I found the function and used it to wait before the result. Here is the function and its usage in my code.

    func waitForElementToAppear(_ element: XCUIElement) -> Bool {
        let predicate = NSPredicate(format: "exists == true")
        let expectation = expectation(for: predicate, evaluatedWith: element,
                                      handler: nil)
        let result = XCTWaiter().wait(for: [expectation], timeout: 5)
        return result == .completed
    }


        app.textFields["Enter your city"].tap()
        app.textFields["Enter your city"].typeText("Barcelona")
        app.buttons["Check weather"].tap()
        let result = app.staticTexts["Barcelona"]
        waitForElementToAppear(result)

        XCTAssertTrue(result.exists)

CodePudding user response:

XCTest comes with a built-in function you need

Documentation: https://developer.apple.com/documentation/xctest/xcuielement/2879412-waitforexistence/

Example: XCTAssertTrue(myButton.waitForExistence(timeout: 3), "Button did not appear")

  • Related