在 EarlGrey 中,等待元素出现的非轮询方式是什么?

In EarlGrey, what's the non-polling way to wait for an element to appear?

目前我正在等待一个元素出现这样的:

let populated = GREYCondition(name: "Wait for UICollectionView to populate", block: { _ in
    var errorOrNil: NSError?

    EarlGrey().selectElementWithMatcher(collectionViewMatcher)
              .assertWithMatcher(grey_notNil(), error: &errorOrNil)

    let success = (errorOrNil == nil)
    return success
}).waitWithTimeout(20.0)

GREYAssertTrue(populated, reason: "Failed to populate UICollectionView in 20 seconds")

持续轮询 20 秒以填充集合视图。有没有更好的非轮询方式来实现这一点?

EarlGrey 建议使用其 synchronization 来等待元素,而不是尽可能使用睡眠或等待等条件检查。

EarlGrey 在 GREYConfiguration 中有一个变量 kGREYConfigKeyInteractionTimeoutDuration 值设置为 30 秒并且状态 -

 *  Configuration that holds timeout duration (in seconds) for action and assertions. Actions or
 *  assertions that are not scheduled within this time will fail due to timeout.

由于您要等待 20 秒才能进行检查,因此您可以简单地将其更改为 -

EarlGrey().selectElementWithMatcher(collectionViewMatcher)
          .assertWithMatcher(grey_notNil(), error: &errorOrNil)

并且它会在没有超时的情况下被填充。

我喜欢将伯爵茶与基本的 XCTest 联系起来,我想出了这个简单的解决等待元素问题的方法:

app.webViews.buttons["logout()"].waitForExistence(timeout: 5)
app.webViews.buttons["logout()"].tap()