使用 Swift 和 XCTest 等到对象在屏幕上不可见
Wait until object is not visible on the screen using Swift and XCTest
我正在寻求帮助来编写一个等待指定元素不再出现在页面上的方法。我正在使用 Swift 2.2 和 XCTest 进行开发。如您所见,我是新来的,也是编程的新手。非常感谢您的帮助。
您必须为要测试的条件设置谓词:
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
然后为您的谓词和测试用例中的 UI 元素创建期望:
self.expectationForPredicate(doesNotExistPredicate, evaluatedWithObject: element, handler: nil)
然后等待你的期望(指定一个超时时间,如果没有达到期望,测试将失败,这里我使用5秒):
self.waitForExpectationsWithTimeout(5.0, handler: nil)
我为此在 XCUIElement
上写了一个超级简单的 waitForNonExistence(timeout:)
扩展函数,它反映了现有的 XCUIElement.waitForExistence(timeout:) 函数,如下所示:
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
}
}
您可以通过XCUIElement.exists
检查元素,每秒检查10秒,然后断言该元素。请参阅以下 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")
}
@Charles A 有正确答案。以下是相同的 Swift 5 版本。
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
expectation(for: doesNotExistPredicate, evaluatedWith: element, handler: nil)
waitForExpectations(timeout: 5.0, handler: nil)
我正在寻求帮助来编写一个等待指定元素不再出现在页面上的方法。我正在使用 Swift 2.2 和 XCTest 进行开发。如您所见,我是新来的,也是编程的新手。非常感谢您的帮助。
您必须为要测试的条件设置谓词:
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
然后为您的谓词和测试用例中的 UI 元素创建期望:
self.expectationForPredicate(doesNotExistPredicate, evaluatedWithObject: element, handler: nil)
然后等待你的期望(指定一个超时时间,如果没有达到期望,测试将失败,这里我使用5秒):
self.waitForExpectationsWithTimeout(5.0, handler: nil)
我为此在 XCUIElement
上写了一个超级简单的 waitForNonExistence(timeout:)
扩展函数,它反映了现有的 XCUIElement.waitForExistence(timeout:) 函数,如下所示:
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
}
}
您可以通过XCUIElement.exists
检查元素,每秒检查10秒,然后断言该元素。请参阅以下 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")
}
@Charles A 有正确答案。以下是相同的 Swift 5 版本。
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
expectation(for: doesNotExistPredicate, evaluatedWith: element, handler: nil)
waitForExpectations(timeout: 5.0, handler: nil)