Dismissing alert XCUITest
Asked Answered
W

3

5

I am trying to dismiss alerts on my XCUITest suite, I am currently using

app.alerts.buttons["OK"].tap()

Using this dismisses the alert, but then the application carries on trying to tap the button and then fails with the error message "UI TESTING FAILURE- No matches found for alert"

This is the console output

 t =     0.00s     Start Test at 2016-11-03 14:07:30.827
t =     0.00s     Set Up
t =     0.00s         Launch uk.co.myapp
t =     4.89s             Waiting for accessibility to load
t =    12.55s             Wait for app to idle
t =    18.46s         Snapshot accessibility hierarchy for uk.co.myapp
t =    19.24s         Find: Descendants matching type Button
t =    19.25s         Find: Elements matching predicate '"Enable notifications" IN identifiers'
t =    19.26s         Tap "Enable notifications" Button
t =    19.26s             Wait for app to idle
t =    19.40s             Find the "Enable notifications" Button
t =    19.40s                 Snapshot accessibility hierarchy for uk.co.myapp
t =    27.43s                 Find: Descendants matching type Button
t =    27.48s                 Find: Elements matching predicate '"Enable notifications" IN identifiers'
t =    27.52s                 Wait for app to idle
t =    27.93s             Synthesize event
t =    28.31s             Wait for app to idle
t =    33.94s         Tap "OK" Button
t =    33.94s             Wait for app to idle
t =    35.19s             Find the "OK" Button
t =    35.20s                 Snapshot accessibility hierarchy for uk.co.myapp
t =    39.68s                 Find: Descendants matching type Alert
t =    39.69s                 Wait for app to idle
t =    39.82s                     App event loop idle notification not received, will attempt to continue.
t =    39.82s                     App animations complete notification not received, will attempt to continue.
t =    39.83s                 Check for UI interruption: Descendants matching type Alert
t =    39.83s                     Snapshot accessibility hierarchy for com.apple.springboard
t =    39.93s                     Find: Descendants matching type Alert
t =    39.94s                 Find the "“VoucherCodes” Would Like to Send You Notifications" Alert
t =    39.94s                     Use cached accessibility hierarchy for com.apple.springboard
t =    39.97s                     Find: Descendants matching type Alert
t =    39.97s                     Find: Identity Binding
t =    39.98s                 Use cached accessibility hierarchy for com.apple.springboard
t =    39.99s                 Find: Descendants matching type Alert
t =    40.00s                 Find: Identity Binding
t =    40.01s                 Find: Descendants matching type Button
t =    40.01s                 Find: Elements matching predicate 'userTestingAttributes CONTAINS "cancel-button"'
t =    40.01s                 Get number of matches for: Descendants matching type Button
t =    40.13s                     Snapshot accessibility hierarchy for com.apple.springboard
t =    40.23s                     Find: Descendants matching type Alert
t =    40.23s                     Find: Identity Binding
t =    40.24s                     Find: Descendants matching type Button
t =    40.24s                 Get all elements bound by accessibility element for: Elements matching predicate 'userTestingAttributes CONTAINS "default-button"'
t =    40.34s                     Snapshot accessibility hierarchy for com.apple.springboard
t =    40.43s                     Find: Descendants matching type Alert
t =    40.45s                     Find: Identity Binding
t =    40.46s                     Find: Descendants matching type Button
t =    40.46s                     Find: Elements matching predicate 'userTestingAttributes CONTAINS "default-button"'
t =    40.47s                 Use cached accessibility hierarchy for com.apple.springboard
t =    40.49s                 Find: Descendants matching type Alert
t =    40.49s                 Find: Identity Binding
t =    40.50s                 Find: Descendants matching type Button
t =    40.50s                 Find: Elements matching predicate 'userTestingAttributes CONTAINS "default-button"'
t =    40.50s                 Find: Identity Binding
t =    40.50s                 Tap "OK" Button
t =    40.50s                     Wait for app to idle
t =    40.61s                         App event loop idle notification not received, will attempt to continue.
t =    40.61s                         App animations complete notification not received, will attempt to continue.
t =    40.62s                     Find the "OK" Button
t =    40.62s                         Snapshot accessibility hierarchy for com.apple.springboard
t =    40.70s                         Find: Descendants matching type Alert
t =    40.71s                         Find: Identity Binding
t =    40.71s                         Find: Descendants matching type Button
t =    40.71s                         Find: Elements matching predicate 'userTestingAttributes CONTAINS "default-button"'
t =    40.72s                         Find: Identity Binding
t =    40.72s                         Wait for app to idle
t =    40.84s                             App event loop idle notification not received, will attempt to continue.
t =    40.84s                             App animations complete notification not received, will attempt to continue.
t =    40.84s                     Synthesize event
t =    41.17s                     Wait for app to idle
t =    41.43s                         App event loop idle notification not received, will attempt to continue.
t =    41.43s                         App animations complete notification not received, will attempt to continue.
t =    41.44s                 Snapshot accessibility hierarchy for com.apple.springboard
t =    41.52s                 Find: Descendants matching type Alert
t =    41.53s                 Find: Identity Binding
t =    41.54s                 Wait for view controller view-did-disappear
t =    42.21s                 Snapshot accessibility hierarchy for uk.co.myapp
t =    45.68s                 Find: Descendants matching type Alert
t =    45.69s                 Wait for app to idle
t =    46.82s                 Find the "OK" Button (retry 1)
t =    46.82s                     Snapshot accessibility hierarchy for 

myapp t = 50.18s Find: Descendants matching type Alert t = 50.19s Wait for app to idle t = 51.38s Find the "OK" Button (retry 2) t = 51.38s Snapshot accessibility hierarchy for uk.myapp t = 55.06s Find: Descendants matching type Alert t = 55.06s Wait for app to idle t = 55.44s Assertion Failure: signUpSetUp.swift:21: UI Testing Failure - No matches found for Alert Query input was {( Application 0x7fb51cf80840: {{0.0, 0.0}, {375.0, 667.0}}, label

Is there a better way of solving this issue? Or is there a solution to where I have gone wrong? Been puzzled on this for a while now!

Wuhu answered 3/11, 2016 at 14:15 Comment(0)
G
11

I improve the answer of @user3271402

addUIInterruptionMonitorWithDescription("alert description") { (alert) -> Bool in
    let alertButton = alert.buttons["OK"]
    if alertButton.exists {
        alertButton.tap()
        return true
    }
    return false
}
app.tap()

Just tap if the alert exists. If the alert doesn't happen return false and after tap the app and the end.

Gewgaw answered 4/11, 2016 at 12:15 Comment(2)
app.tap() is crucial. Don't miss it.Treachery
Great! You saved my time :DUnreadable
U
1

There is a method in XCTest for alert handling:

addUIInterruptionMonitorWithDescription("iTunesStoreAlert") { alert in
    alert.buttons["OK"].tap()
    return true
}

You could put this at the beginning of your test .. Or where you are expected to receive an alert

Unmindful answered 3/11, 2016 at 21:12 Comment(0)
S
1

Note that the addUIInteruptionMonitorWithDescription approach can only be used for alerts presented outside the normal work flow. Per Apple[1]:

Important

When an alert or other modal UI is an expected part of the test workflow, don't write a UI interruption monitor. The test won’t use the monitor because the modal UI isn’t blocking the test. A UI test only tries its UI interruption monitors if the elements it needs to interact with to complete the test are blocked by an interruption from an unrelated UI.

If the alert is presented by the normal flow, you can just use normal XCTestCase methods:

 expectation(
     for: NSPredicate("exists == true"),
     evaluatedWith: XCUIApplication().staticTexts["Error Sending Mail"],
     handler: nil) { error in
     // handle failure here
 }

 XCUIApplication().buttons["OK"].tap()

[1] https://developer.apple.com/documentation/xctest/xctestcase/handling_ui_interruptions

Supplication answered 15/8, 2022 at 21:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.