I'm looking for help writing a method which waits until the specified element is not present on a page anymore. I am developing with Swift 2.2 and XCTest. As you can see, I'm a new here and new to programming. Your help will be greatly appreciated.
Asked
Active
Viewed 7,515 times
4 Answers
16
You will have to setup predicate for the condition you want to test:
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
Then create an expectation for your predicate and UI element in your test case:
self.expectationForPredicate(doesNotExistPredicate, evaluatedWithObject: element, handler: nil)
Then wait for your expectation (specifying a timeout after which the test will fail if the expectation is not met, here I use 5 seconds):
self.waitForExpectationsWithTimeout(5.0, handler: nil)

Charles A.
- 10,685
- 1
- 42
- 39
7
I wrote a super simple waitForNonExistence(timeout:)
extension function on XCUIElement
for this which mirrors the existing XCUIElement.waitForExistence(timeout:) function, as follows:
extension XCUIElement {
/**
* Waits the specified amount of time for the element’s `exists` property to become `false`.
*
* - Parameter timeout: The amount of time to wait.
* - Returns: `false` if the timeout expires without the element coming out of existence.
*/
func waitForNonExistence(timeout: TimeInterval) -> Bool {
let timeStart = Date().timeIntervalSince1970
while (Date().timeIntervalSince1970 <= (timeStart + timeout)) {
if !exists { return true }
}
return false
}
}

Adil Hussain
- 30,049
- 21
- 112
- 147
0
You can check the element by XCUIElement.exists
for 10 second for each second and then assert the element. See the following for ActivityIndicator:
public func waitActivityIndicator() {
var numberTry = 0
var activityIndicatorNotVisible = false
while numberTry < 10 {
if activityIdentifier.exists {
sleep(1)
numberTry += 1
} else {
activityIndicatorNotVisible = true
break
}
}
XCTAssert(activityIndicatorNotVisible, "Activity indicator is still visible")
}

Mesut GUNES
- 7,089
- 2
- 32
- 49
0
@Charles A has the correct answer. Below is the Swift 5 version of the same.
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
expectation(for: doesNotExistPredicate, evaluatedWith: element, handler: nil)
waitForExpectations(timeout: 5.0, handler: nil)

ThE uSeFuL
- 1,456
- 1
- 16
- 29