如何正确错误处理在swift中找不到的XCUI元素

时间:2016-03-29 15:23:57

标签: ios swift xcode-ui-testing

我正在尝试在swift中为我的iOS UI测试编写一个do-try-catch,它使用XCUI测试。我正在阅读错误处理部分:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42-ID508 但是不确定在找不到元素时应该抛出哪个错误。

func tapElement(string:String) throws {

    do{
        waitFor(app.staticTexts[string], 5)
        try app.staticTexts[string].tap()
    }
    catch {
        NSLog("Element was not found: \(string)")
        //how can i check specifically that the element was not found?
    }


}

...

func waitFor(element:XCUIElement, seconds waitSeconds:Double) {
    NSLog("Waiting for element: \(element)")
    let exists = NSPredicate(format: "exists == 1")
    expectationForPredicate(exists, evaluatedWithObject: element, handler: nil)
    waitForExpectationsWithTimeout(waitSeconds, handler: nil)
}

任何帮助非常感谢!!

2 个答案:

答案 0 :(得分:1)

您不应该尝试在UI测试中捕获查找元素。在尝试exists()之前询问框架是否为tap()元素。

let app = XCUIApplication()
let element = app.staticTexts["item"]
if element.exists {
    element.tap()
} else {
    NSLog("Element does not exist")
}

查看我的blog post on getting started with UI Testing了解更具体的示例like tapping an button

答案 1 :(得分:1)

您应该使用element.existselement.isHittable

element.exists 检查该元素是否为UIApplication / ScrollView /的元素。

element.isHittable 确定是否可以为元素计算出生命值。

如果您未同时检查两者,则element.tap()会引发以下错误,例如,如果元素在键盘下:

  

失败:无法滚动到可见(通过AX操作)TextField,...

示例代码:

let textField = elementsQuery.textFields.allElementsBoundByIndex[i]

if textField.exists && textField.isHittable {
    textField.tap()
} else {
     // text field is not hittable or doesn't exist!
     XCTFail()
 }