如何等待一个元素,如果在一段时间之后找不到,则不会失败xcuitest

时间:2016-09-13 05:13:03

标签: xctest xctestcase

在我的应用程序中,我有一个两个标签按钮,分别说任务和工作清单。始终加载任务。但Worklist按钮是动态的,只在一段时间后加载。

我想在一段时间后点击“任务”按钮。即,我需要等待工作列表按钮,如果它在一定时间后存在,则单击任务按钮。此外,如果超时超出并且未加载Worklist按钮,则我需要单击“任务”按钮。

我无法使用睡眠。

我可以使用expectationForPredicate和waitForExpectationsWithTimeout吗?但是如果在超时后找不到该元素,则waitForExpectationsWithTimeout将失败。即使我写了

waitForExpectationsWithTimeout(120) { (error) -> Void in
         click Tasks button
}

这会在主线程上产生停顿。

我只想在加载工作清单后点击“任务”按钮。但是如果在超时后没有加载worklist,那么我还需要单击Tasks按钮..

有没有解决方案。任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以创建自己的自定义方法来处理此问题:

func waitForElementToExist(
    element: XCUIElement,
    timeout: Int = 20,
    failTestOnFailure: Bool = true)
    -> Bool
{
    var i = 0
    let message = "Timed out while waiting for element: \(element) after \(timeout) seconds"

    while !element.exists {
        sleep(1)
        i += 1

        guard i < timeout else {
            if failTestOnFailure {
                XCTFail(message)
            } else {
                print(message)
            }

            return false
        }
    }

    return true
}

您可以调用以下方法:

if waitForElementToExist(taskButton, timeout: 20, failTestOnFailure: false) {
    button.tap()
}

希望这适合你!