19

我正在使用 Xcode 7 XCTest 中引入的 UI 测试 API。在我的屏幕上,我有一个从网络加载的文本。

如果我只是用exists属性检查它,测试就会失败。

XCTAssert(app.staticTexts["Text from the network"].exists) // fails

如果我首先将点击或任何其他事件发送到这样的文本,它确实有效:

app.staticTexts["Text from the network"].tap()
XCTAssert(app.staticTexts["Text from the network"].exists) // works

看起来如果我只是调用exists它会立即评估它并失败,因为尚未从网络下载文本。但我认为当我调用该tap()方法时,它会等待文本出现。

是否有更好的方法来检查是否存在从网络传递的文本?

类似的东西(此代码不起作用):

XCTAssert(app.staticTexts["Text from the network"].eventuallyExists)
4

4 回答 4

29

Xcode 7 Beta 4 添加了对异步事件的原生支持。这是一个如何等待 aUILabel出现的快速示例。

XCUIElement *label = self.app.staticTexts[@"Hello, world!"];
NSPredicate *exists = [NSPredicate predicateWithFormat:@"exists == 1"];

[self expectationForPredicate:exists evaluatedWithObject:label handler:nil];
[self waitForExpectationsWithTimeout:5 handler:nil];

首先创建一个查询以等待带有文本“Hello, world!”的标签。出现。当元素存在时谓词匹配(element.exists == YES)。然后将谓词传入并根据标签对其进行评估。

如果在达到预期之前五秒钟过去了,那么测试将失败。您还可以附加一个处理程序块,当期望失败或超时时调用该处理程序块。

如果您正在寻找有关一般 UI 测试的更多信息,请查看Xcode 7 中的 UI 测试

于 2015-07-15T11:47:11.300 回答
1

斯威夫特 3:

let predicate = NSPredicate(format: "exists == 1")
let query = app!.staticTexts["identifier"]
expectation(for: predicate, evaluatedWith: query, handler: nil)
waitForExpectations(timeout: 5, handler: nil)

它将连续检查该文本是否显示 5 秒钟。

一旦它发现文本可能在不到 5 秒内,它将执行进一步的代码。

于 2017-08-04T15:35:33.917 回答
1

XCode9 有一个方法waitForExistence(timeout: TimeInterval)XCUIElement

extension XCUIElement {
    // A method for tap element
    @discardableResult
    func waitAndTap() -> Bool {
        let _ = self.waitForExistence(timeout: 10)
        let b = self.exists && self.isHittable
        if (b) {
            self.tap()
        }
        return b
    }
}

// Ex:
if (btnConfig.waitAndTap() == true) {
    // Continue UI automation
} else {
    // `btnConfig` is not exist or not hittable.
}

但是我遇到了另一个问题,element存在,但不可命中。所以我扩展了一个方法来等待一个元素被点击。

extension XCTestCase {
    /// Wait for XCUIElement is hittable.
    func waitHittable(element: XCUIElement, timeout: TimeInterval = 30) {
        let predicate = NSPredicate(format: "isHittable == 1")
        expectation(for: predicate, evaluatedWith: element, handler: nil)
        waitForExpectations(timeout: timeout, handler: nil)
    }
}

// Ex:
// waitHittable(element: btnConfig)
于 2018-01-04T07:10:31.750 回答
0

如果我对您的理解是正确的,当您检查目标文本是否存在时,它已经显示,您可以尝试使用hittable属性。

于 2016-12-08T10:10:02.880 回答